Configura el clúster de suscriptores para la replicación lógica

Selecciona una versión de la documentación:

En este documento, se proporcionan ejemplos que muestran cómo crear y configurar manualmente un clúster de suscriptor. Un clúster de suscriptor es un clúster de base 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

Crea y configura el clúster de suscriptor

  1. Crea un clúster de suscriptor.

    $ 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.1"
      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 base de datos, por ejemplo, subscriber-cluster.
    • ENCODED_PASSWORD: Es la contraseña de acceso a la base de datos para el rol de usuario postgres predeterminado, codificada como una cadena en base64 (por ejemplo, Q2hhbmdlTWUxMjM= para ChangeMe123).

    • CPU_COUNT: Es la cantidad de CPU 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 estableciste cpu en 2 anteriormente en este manifiesto, te recomendamos que establezcas memory en 16Gi.

    • DISK_SIZE: Es el tamaño del disco por instancia de base de datos, por ejemplo, 10Gi.

  2. 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"
    
  3. 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 de suscriptor.

  4. Busca la dirección IP del balanceador de cargas en el clúster de base de datos 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
    
  5. Realiza 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 suscriptor) 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 clúster de base de datos del publicador.

  6. Aplica la copia de seguridad en la base de datos del suscriptor.

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
    
  7. 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)
    
  8. 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 base de datos 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 a la ranura de replicación.
    • DATABASE_NAME: Se establece en el nombre de la base de datos cuyos cambios deseas transmitir desde la ranura de replicación.
    • PUBLISHER_CLUSTER_PASSWORD: Es la contraseña de acceso a la base de datos para el usuario postgres del clúster de bases de datos del publicador.
    • PUBLICATION_NAME: Es el nombre de la publicación a la que se suscribe el suscriptor.
    • REPLICATION_SLOT_NAME: Es el nombre de la ranura de replicación creada en el clúster de base de datos del publicador.
  9. 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)
    
  10. 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.

  11. En el clúster de suscriptor, verifica que la fila agregada a la tabla en el clúster de publicador se haya 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)
    

Crea tablas adicionales de forma manual

La replicación lógica no sincroniza automáticamente los cambios en el 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.

  1. Para ilustrar esto, crea una tabla nueva llamada finance en la base de datos customer del 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
    
  2. Cuando se agrega una tabla nueva al clúster de publicador, debes aplicar manualmente el DDL (creación de la tabla) en el suscriptor y, luego, verificar la replicación ejecutando lo siguiente en el clúster de suscriptor.

    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)
    

¿Qué sigue?