Configurar o cluster de assinantes para a replicação lógica

Este documento fornece exemplos que mostram como criar e configurar manualmente um cluster de assinantes. Um cluster de assinante é um cluster de banco de dados que recebe dados replicados de um cluster de editores.

Os snippets de código nesta página são exemplos que você pode usar como modelos, substituindo os valores pelos seus recursos do AlloyDB Omni.

Antes de começar

Criar e configurar o cluster de assinantes

  1. Crie um cluster de assinantes.

    $ 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
    

    Substitua:

    • DB_CLUSTER_NAME: o nome desse cluster de banco de dados, por exemplo, subscriber-cluster.
    • ENCODED_PASSWORD: a senha de login do banco de dados para a função de usuário postgres padrão, codificada como uma string base64. Por exemplo, Q2hhbmdlTWUxMjM= para ChangeMe123.

    • CPU_COUNT: o número de CPUs disponíveis para cada instância de banco de dados neste cluster de banco de dados.

    • MEMORY_SIZE: a quantidade de memória por instância do banco de dados deste cluster de banco de dados. Recomendamos definir esse valor como 8 gigabytes por CPU. Por exemplo, se você definir cpu como 2 anteriormente neste manifesto, recomendamos definir memory como 16Gi.

    • DISK_SIZE: o tamanho do disco por instância do banco de dados, por exemplo, 10Gi.

  2. Encontre o pod necessário.

    $ 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. Faça login no pod do banco de dados do cluster de assinantes.

    $ 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:/$
    

    Substitua SUBSCRIBER_POD_NAME pelo nome do pod do assinante.

  4. Encontre o endereço IP do balanceador de carga no DBcluster do 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
    
  5. Faça um backup do esquema do editor como uma cópia inicial dos dados publicados no banco de dados do editor. A replicação lógica não oferece suporte à replicação de DDL. Um esquema ou uma tabela que você planeja replicar precisa existir no destino (cluster de assinantes) antes do início da replicação lógica.

    postgres@al-3513-subscriber-0:/$ pg_dump -h PUBLISHER_IP_ADDRESS -U postgres --create --schema-only customer > /tmp/customer.schema-only.sql
    

    Substitua PUBLISHER_IP_ADDRESS pelo endereço IP do balanceador de carga no DBcluster do editor.

  6. Aplique o backup no banco de dados de assinantes.

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
    
  7. Opcional: verifique se não há dados na tabela.

    # There is no data in table company
    customer=# select * from company;
    id | name | age | salary
    ----+------+-----+--------
    (0 rows)
    
  8. Crie uma assinatura para o banco de dados. Verifique se a publicação já foi criada no DBCluster do 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');
    

    Substitua:

    • REPLICATION_USER: o nome do usuário que se conecta ao slot de replicação.
    • DATABASE_NAME: definido como o nome do banco de dados com as alterações que você quer transmitir do slot de replicação.
    • PUBLISHER_CLUSTER_PASSWORD: a senha de login do banco de dados para o usuário postgres do DBCluster do editor.
    • PUBLICATION_NAME: o nome da publicação em que o assinante se inscreveu.
    • REPLICATION_SLOT_NAME: o nome do slot de replicação criado no DBCluster do editor.
  9. Opcional: verifique a replicação no cluster de assinantes.

    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. No cluster do editor, adicione uma linha à tabela.

    # 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);
    

    Substitua TABLE_NAME pelo nome da tabela no DBCluster do editor em que o assinante está inscrito.

  11. No cluster de assinantes, verifique se a linha adicionada à tabela no cluster de editores foi replicada para a tabela no cluster de assinantes.

    # 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)
    

Criar manualmente outras tabelas

A replicação lógica não sincroniza automaticamente as mudanças de DDL, ao contrário do replicate_ddl_command em pglogical. Embora a ferramenta de código aberto pgl_ddl_deploy ofereça uma solução, também é possível executar comandos DDL manualmente no inquilino.

  1. Para ilustrar isso, crie uma nova tabela chamada finance no banco de dados customer no cluster 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
    
  2. Quando uma nova tabela é adicionada ao cluster do editor, você aplica manualmente o DDL (criação de tabela) no assinante e, em seguida, verifica a replicação executando o seguinte no cluster do assinante.

    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)
    

A seguir