Configure o cluster de subscritores para replicação lógica

Selecione uma versão da documentação:

Este documento fornece exemplos que mostram como criar e configurar manualmente um cluster de subscritores. Um cluster de subscrição é um cluster de base de dados que recebe dados replicados de um cluster de publicação.

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

Antes de começar

Crie e configure o cluster de subscritores

  1. Crie um cluster de subscritores.

    $ 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
    

    Substitua o seguinte:

    • DB_CLUSTER_NAME: o nome deste cluster de base de dados, por exemplo, subscriber-cluster.
    • ENCODED_PASSWORD: a palavra-passe de início de sessão na base de dados para a função de utilizador postgres predefinida, codificada como uma string base64, por exemplo, Q2hhbmdlTWUxMjM= para ChangeMe123.

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

    • MEMORY_SIZE: a quantidade de memória por instância da base de dados deste cluster de base de dados. Recomendamos que defina esta opção para 8 gigabytes por CPU. Por exemplo, se definir cpu como 2 anteriormente neste manifesto, recomendamos que defina memory como 16Gi.

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

  2. Encontre o pod de que precisa.

    $ 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. Inicie sessão no pod da base de dados do cluster de subscritores.

    $ 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 grupo de subscritores.

  4. Encontre o endereço IP do balanceador de carga no DBcluster do 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. Fazer uma cópia de segurança do esquema do publicador como uma cópia inicial dos dados publicados na base de dados do publicador. A replicação lógica não suporta a replicação de DDL. Um esquema ou uma tabela que planeia replicar tem de existir no destino (cluster de subscrição) antes de a replicação lógica ser iniciada.

    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 equilibrador de carga no DBcluster do publicador.

  6. Aplique a cópia de segurança na base de dados de subscritores.

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

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

    Substitua o seguinte:

    • REPLICATION_USER: o nome do utilizador que se liga ao espaço de replicação.
    • DATABASE_NAME: definido como o nome da base de dados cujas alterações quer transmitir a partir do espaço de replicação.
    • PUBLISHER_CLUSTER_PASSWORD: a palavra-passe de início de sessão na base de dados para o utilizador postgres do DBCluster do publicador.
    • PUBLICATION_NAME: o nome da publicação que o subscritor subscreve.
    • REPLICATION_SLOT_NAME: o nome do espaço de replicação criado no DBCluster do publicador.
  9. Opcional: valide a replicação no cluster do subscritor.

    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 publicador, 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 publicador ao qual o subscritor está subscrito.

  11. No cluster de subscrição, verifique se a linha adicionada à tabela no cluster de publicação foi replicada para a tabela no cluster de subscrição.

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

Crie manualmente tabelas adicionais

A replicação lógica não sincroniza automaticamente as alterações de DDL, ao contrário da replicação física no pglogical.replicate_ddl_command Embora a ferramenta de código aberto pgl_ddl_deploy ofereça uma solução, também pode executar comandos DDL manualmente no subscritor.

  1. Para ilustrar isto, crie uma nova tabela denominada finance na base de dados customer no cluster do 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. Quando é adicionada uma nova tabela ao cluster do publicador, aplica manualmente o DDL (criação de tabelas) no subscritor e, em seguida, valida a replicação executando o seguinte no cluster do subscritor.

    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)
    

O que se segue?