Los fragmentos de código de esta página son ejemplos que puedes usar como modelos. Para ello, sustituye los valores por los de tus recursos de AlloyDB Omni.
Antes de empezar
- Instala Omni Operator en Kubernetes.
- Asegúrate de crear una ranura de replicación, un clúster de editores y una publicación. Para obtener más información, consulta Crear ranuras de replicación y publicaciones.
Crear y configurar el clúster de suscriptor
Crea un clúster de suscriptores.
$ cat << EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: db-pw-DB_CLUSTER_NAME type: Opaque data: DB_CLUSTER_NAME: "ENCODED_PASSWORD" # Password is odspassword --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: subscriber spec: databaseVersion: "16.3.0" primarySpec: adminUser: passwordRef: name: db-pw-DB_CLUSTER_NAME resources: memory: MEMORY_SIZE cpu: CPU_COUNT disks: - name: DataDisk size: DISK_SIZE EOF
Haz los cambios siguientes:
DB_CLUSTER_NAME
: el nombre de este clúster de base de datos. Por ejemplo,subscriber-cluster
.ENCODED_PASSWORD
: la contraseña de inicio de sesión de la base de datos del rol de usuariopostgres
predeterminado, codificada como una cadena base64. Por ejemplo,Q2hhbmdlTWUxMjM=
paraChangeMe123
.CPU_COUNT
: número de CPUs disponibles para cada instancia de base de datos de este clúster de bases de datos.MEMORY_SIZE
: la cantidad de memoria por instancia de base de datos de este clúster de bases de datos. Recomendamos que este valor sea de 8 gigabytes por CPU. Por ejemplo, si has definidocpu
como2
en este manifiesto, te recomendamos que definasmemory
como16Gi
.DISK_SIZE
: el tamaño del disco por instancia de base de datos. Por ejemplo,10Gi
.
Busca el pódcast que necesites.
$ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
Inicia sesión en el pod de la base de datos del clúster de suscriptor.
$ kubectl get pod NAME READY STATUS RESTARTS AGE al-2bce-publisher-0 3/3 Running 0 20h $ kubectl exec -ti SUBSCRIBER_POD_NAME -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-3513-subscriber-0:/$
Sustituye
SUBSCRIBER_POD_NAME
por el nombre del pod de suscriptor.Busca la dirección IP del balanceador de carga en el clúster de base de datos del editor, como
10.116.14.190
.$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE al-publisher-rw-ilb ClusterIP 10.116.14.190 <none> 5432/TCP 21h
Crea una copia de seguridad del esquema del editor como copia inicial de los datos publicados en la base de datos del editor. La replicación lógica no admite la replicación de DDL. Un esquema o una tabla que quieras replicar debe existir en el destino (clúster suscriptor) antes de que empiece la replicación lógica.
postgres@al-3513-subscriber-0:/$ pg_dump -h PUBLISHER_IP_ADDRESS -U postgres --create --schema-only customer > /tmp/customer.schema-only.sql
Sustituye
PUBLISHER_IP_ADDRESS
por la dirección IP del balanceador de carga en el clúster de base de datos del editor.Aplica la copia de seguridad en la base de datos de suscriptores.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
Opcional: Comprueba que no haya datos en la tabla.
# There is no data in table company customer=# select * from company; id | name | age | salary ----+------+-----+-------- (0 rows)
Crea una suscripción para la base de datos. Asegúrate de que la publicación ya se haya creado en el clúster de bases de datos del editor.
postgres@al-3513-subscriber-0:/$ CREATE SUBSCRIPTION sub_customer CONNECTION 'host=PUBLISHER_IP_ADDRESS port=5432 user=REPLICATION_USER dbname=DATABASE_NAME password=PUBLISHER_CLUSTER_PASSWORD sslmode=require' PUBLICATION PUBLICATION_NAME WITH (slot_name='REPLICATION_SLOT_NAME');
Haz los cambios siguientes:
- REPLICATION_USER: el nombre del usuario que se conecta al espacio de réplica.
- DATABASE_NAME: se asigna al nombre de la base de datos cuyos cambios quieres transmitir desde el espacio de replicación.
- PUBLISHER_CLUSTER_PASSWORD: la contraseña de inicio de sesión de la base de datos del usuario
postgres
de Publisher DBCluster. - PUBLICATION_NAME: el nombre de la publicación a la que se suscribe el suscriptor.
- REPLICATION_SLOT_NAME: nombre del espacio de replicación creado en el clúster de base de datos del editor.
Opcional: Verifica la replicación en el clúster de suscriptor.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# select * from public.company; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 (5 rows)
En el clúster de editores, añada una fila a la tabla.
# On the publisher database $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# insert into TABLE_NAME (id, name, age, salary) values (6, 'Alex', 39, 100000);
Sustituye TABLE_NAME por el nombre de la tabla del clúster de base de datos del editor al que está suscrito el suscriptor.
En el clúster de suscriptor, compruebe que la fila añadida a la tabla del clúster de editor se ha replicado en la tabla del clúster de suscriptor.
# On the subscriber database, data is synced. postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME customer=# select * from TABLE_NAME; id | name | age | salary ----+-------+-----+-------- 1 | Quinn | 25 | 65000 2 | Kim | 22 | 72250 3 | Bola | 31 | 53000 4 | Sasha | 33 | 105000 5 | Yuri | 27 | 85000 6 | Alex | 39 | 100000 (6 rows)
Crear tablas adicionales manualmente
La replicación lógica no sincroniza automáticamente los cambios de DDL, a diferencia de la replicate_ddl_command
en pglogical
. Aunque la herramienta de código abierto
pgl_ddl_deploy
ofrece una solución, también puedes ejecutar comandos DDL manualmente en el
suscriptor.
Para ilustrarlo, crea una tabla llamada
finance
en la base de datoscustomer
del clúster de editores.# On the publisher database $ kubectl exec -ti al-2bce-publisher-0 -- /bin/bash Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init) postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres customer customer=# create table finance (row text); CREATE TABLE customer=# insert into finance values ('critical data'); INSERT 0 1 customer=# ALTER PUBLICATION pub_customer ADD TABLE finance; ALTER PUBLICATION
Cuando se añade una tabla nueva al clúster de editores, debes aplicar manualmente el DDL (creación de la tabla) en el suscriptor y, a continuación, verificar la replicación ejecutando lo siguiente en el clúster de suscriptores.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres customer customer=# create table finance (row text); CREATE TABLE customer=# ALTER SUBSCRIPTION sub_customer REFRESH PUBLICATION; ALTER SUBSCRIPTION customer=# select * from finance; row --------------- critical data (1 row)