En este documento, se proporcionan ejemplos que muestran cómo crear y configurar manualmente un clúster de suscriptores. Un clúster de suscriptores es un clúster de bases de datos que recibe datos replicados de un clúster de publicador.
Los fragmentos de código de esta página son ejemplos que puedes usar como modelos y reemplazar los valores por los de tus recursos de AlloyDB Omni.
Antes de comenzar
- Instala el operador Omni en Kubernetes.
- Asegúrate de crear una ranura de replicación, un clúster de publicador y una publicación. Para obtener más información, consulta Cómo crear ranuras de replicación y publicaciones.
Crea y configura el clúster de suscriptores
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: "15.7.0" primarySpec: adminUser: passwordRef: name: db-pw-DB_CLUSTER_NAME resources: memory: MEMORY_SIZE cpu: CPU_COUNT disks: - name: DataDisk size: DISK_SIZE EOF
Reemplaza lo siguiente:
DB_CLUSTER_NAME
: Es el nombre de este clúster de bases de datos, por ejemplo,subscriber-cluster
.ENCODED_PASSWORD
: Es la contraseña de acceso a la base de datos del rol de usuariopostgres
predeterminado, codificada como una cadena base64, por ejemplo,Q2hhbmdlTWUxMjM=
paraChangeMe123
.CPU_COUNT
: Es la cantidad de CPUs disponibles para cada instancia de base de datos en este clúster de bases de datos.MEMORY_SIZE
: Es la cantidad de memoria por instancia de base de datos de este clúster de bases de datos. Te recomendamos que establezcas este valor en 8 gigabytes por CPU. Por ejemplo, si configurastecpu
en2
antes en este manifiesto, te recomendamos que configuresmemory
en16Gi
.DISK_SIZE
: El tamaño del disco por instancia de base de datos, por ejemplo,10Gi
.
Busca el pod que necesitas.
$ 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"
Accede al pod de la base de datos del clúster de suscriptores.
$ 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:/$
Reemplaza
SUBSCRIBER_POD_NAME
por el nombre del pod del suscriptor.Busca la dirección IP del balanceador de cargas en el DBcluster del publicador, 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 publicador como una copia inicial de los datos publicados en la base de datos del publicador. La replicación lógica no admite la replicación de DDL. Un esquema o una tabla que planeas replicar debe existir en el destino (clúster de suscriptores) antes de que comience 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
Reemplaza
PUBLISHER_IP_ADDRESS
por la dirección IP del balanceador de cargas en el DBcluster del publicador.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: Verifica 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 DBCluster del publicador.
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');
Reemplaza lo siguiente:
- REPLICATION_USER: Es el nombre del usuario que se conecta al espacio de replicación.
- DATABASE_NAME: Se establece en el nombre de la base de datos cuyos cambios quieres transmitir desde el espacio de réplica.
- PUBLISHER_CLUSTER_PASSWORD: La contraseña de acceso a la base de datos para el usuario
postgres
del DBCluster del publicador - PUBLICATION_NAME: Es el nombre de la publicación a la que se suscribe el suscriptor.
- REPLICATION_SLOT_NAME: Es el nombre del espacio de replicación que se creó en DBCluster del publicador.
Opcional: Verifica la replicación en el clúster de suscriptores.
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 del publicador, agrega 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);
Reemplaza TABLE_NAME por el nombre de la tabla en el DBCluster del publicador al que se suscribió el suscriptor.
En el clúster de suscriptores, verifica que la fila agregada a la tabla en el clúster de publicador se haya replicado en la tabla del clúster de suscriptores.
# 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)
Crea tablas adicionales de forma manual
La replicación lógica no sincroniza automáticamente los cambios de DDL, a diferencia de replicate_ddl_command
en pglogical
. Si bien la herramienta de código abierto pgl_ddl_deploy
ofrece una solución, también puedes ejecutar comandos DDL de forma manual en el suscriptor.
Para ilustrar esto, crea una tabla nueva llamada
finance
en la base de datoscustomer
en el clúster del publicador.# 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 agrega una tabla nueva al clúster del publicador, aplicas manualmente el DDL (creación de tablas) en el suscriptor y, luego, ejecutas lo siguiente en el clúster del suscriptor para verificar la replicación.
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)