Crie um slot de replicação e uma publicação

Selecione uma versão da documentação:

Este documento descreve como criar slots de replicação lógica no AlloyDB Omni. No PostgreSQL, a replicação lógica é um método para copiar alterações de dados de uma base de dados de publicação para um ou mais subscritores, que podem ser bases de dados ou outras aplicações. Pode ativar e configurar a replicação lógica em clusters que criar com o AlloyDB Omni Kubernetes Operator.

As alterações transmitidas podem ser atualizações, inserções ou eliminações de linhas individuais. Os subscritores ligam-se ao publicador através de um espaço de replicação exclusivo que garante uma ligação persistente. Uma ligação persistente mantém o estado de streaming de dados. Por isso, se ocorrer uma interrupção, o streaming é retomado a partir do ponto em que foi interrompido.

Para mais informações sobre a replicação lógica no PostgreSQL, consulte o artigo Replicação lógica.

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 um cluster de publicadores

Antes de criar os espaços de replicação, tem de criar o cluster de publicadores com a replicação lógica ativada. Tem de definir o parâmetro wal_level como logical no manifesto DBCluster.

Para criar um cluster de base de dados do publicador com a replicação lógica ativada, aplique o seguinte manifesto:

  apiVersion: v1
  kind: Secret
  metadata:
    name: db-pw-DB_CLUSTER_NAME
    namespace: DB_CLUSTER_NAMESPACE
  type: Opaque
  data:
    DB_CLUSTER_NAME: "ENCODED_PASSWORD"
  ---
  apiVersion: alloydbomni.dbadmin.goog/v1
  kind: DBCluster
  metadata:
    name: DB_CLUSTER_NAME
    namespace: DB_CLUSTER_NAMESPACE
  spec:
    databaseVersion: "ALLOYDB_OMNI_VERSION"
    spec:
    availability:
      numberOfStandbys: 1
    primarySpec:
      parameters:
        wal_level: "logical"
      adminUser:
        passwordRef:
          name: db-pw-DB_CLUSTER_NAME
      resources:
        cpu: CPU_COUNT
        memory: MEMORY_SIZE
        disks:
        - name: DataDisk
          size: DISK_SIZE

Substitua o seguinte:

  • DB_CLUSTER_NAME: o nome deste cluster de base de dados, por exemplo, publisher.

  • DB_CLUSTER_NAMESPACE (Opcional): o espaço de nomes onde quer criar o cluster de base de dados, por exemplo, publisher-namespace.

  • 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.

  • ALLOYDB_OMNI_VERSION: a versão do AlloyDB Omni, 15.7.0 ou posterior.

  • 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 tiver definido 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.

Crie um espaço de replicação

Depois de criar o cluster de publicadores, pode criar um espaço de replicação lógica usando o recurso Replication no cluster de publicadores. Cada recurso Replication está associado a um recurso de cluster de base de dados correspondente. Um cluster de base de dados pode ter vários recursos de replicação lógica associados.

Para configurar um espaço de replicação no cluster do publicador, aplique o seguinte manifesto:

$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: USER_PASSWORD_SECRET_NAME
  namespace: USER_PASSWORD_SECRET_NAMESPACE
type: Opaque
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
  name: REPLICATION_NAME
  namespace: NAMESPACE
spec:
  dbcluster:
    name: DB_CLUSTER_NAME
  upstream:
    logicalReplication:
      pluginName: DECODER_PLUGIN
      databaseName: DATABASE_NAME
    applicationName: APPLICATION_NAME
    replicationSlotName: REPLICATION_SLOT_NAME
    synchronous: "REPLICATION_MODE"
    username: APPLICATION_USER
    password:
      name: USER_PASSWORD_SECRET_NAME
      namespace: USER_PASSWORD_SECRET_NAMESPACE
EOF

Substitua o seguinte:

  • REPLICATION_NAME: um nome para este recurso Replication, por exemplo, replication-1.
  • NAMESPACE: o namespace do Kubernetes para este recurso Replication Tem de corresponder ao espaço de nomes do cluster da base de dados.
  • DB_CLUSTER_NAME: o nome do cluster da base de dados, que atribuiu quando o criou.
  • DECODER_PLUGIN: definido para o plug-in de descodificação, como pgoutput, que quer usar para a replicação lógica. Para mais informações acerca de vários plug-ins de descodificação, consulte os plug-ins de saída.
  • DATABASE_NAME: definido como o nome da base de dados cujas alterações quer transmitir para o espaço de replicação. Certifique-se de que a base de dados já foi criada no cluster do publicador.
  • APPLICATION_NAME (Opcional): definido como o nome da aplicação que vai estabelecer ligação ao espaço de replicação. Este campo é obrigatório quando o modo de streaming está definido como síncrono.
  • REPLICATION_MODE (Opcional): defina como false para replicação assíncrona. Se quiser ativar a replicação síncrona, mas à custa da velocidade, defina este valor como true. O valor predefinido é false, se não for definido explicitamente.
  • REPLICATION_SLOT_NAME: o nome do espaço de replicação que vai ser criado e usado pelo subscritor, por exemplo, logicalrepltestslot.
  • REPLICATION_USER (Opcional): o nome do utilizador que se liga ao espaço de replicação. Se definir o utilizador de replicação, tem de definir o nome do segredo, o espaço de nomes e a palavra-passe.
  • USER_PASSWORD_SECRET_NAME (Opcional): o nome do Secret do Kubernetes do utilizador da aplicação. Obrigatório se o utilizador da aplicação estiver definido.
  • USER_PASSWORD_SECRET_NAMESPACE (Opcional): o espaço de nomes onde se encontra o segredo do Kubernetes para o utilizador da aplicação. Obrigatório, se o utilizador da aplicação estiver definido.

Veja o estado do espaço de replicação

Para ver o estado das posições de replicação, execute o seguinte comando:

kubectl get replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE -oyaml

O campo status, juntamente com outros detalhes, está incluído na resposta:

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
  name: REPLICATION_NAME
  namespace: NAMESPACE
...
...
status:
  conditions:
  - lastTransitionTime: "2025-01-25T06:49:25Z"
    message: Ready for replication
    reason: Ready
    status: "True"
    type: Ready
  - lastTransitionTime: "2025-01-25T06:49:25Z"
    message: Replication slot is not being used
    reason: Unhealthy
    status: "False"
    type: Healthy
  observedGeneration: 2
  upstream:
    host: DATABASE_ENDPOINT
    password:
      name: USER_PASSWORD_SECRET_NAME
      namespace: USER_PASSWORD_SECRET_NAMESPACE
    port: DATABASE_PORT
    replicationSlotName: REPLICATION_SLOT_NAME
    username: APPLICATION_USER

O DATABASE_ENDPOINT mostra o endereço IP que usa para estabelecer ligação à base de dados. O estado TRUE na coluna READY indica que o espaço está pronto para streaming. Quando o DBCluster ou a aplicação do subscritor se liga ao espaço de replicação, o estado na coluna HEALTHY muda para TRUE.

Configure o cluster de publicadores

  1. 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"
    
  2. Faça a ligação ao pod principal no cluster do publicador através do comando psql:

    psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME

    Substitua o seguinte:

    • IP_ADDRESS: o endereço IP do pod principal do cluster do publicador.
    • USERNAME: o utilizador do Postgres da base de dados.
    • DATABASE_NAME: a base de dados à qual o subscritor quer subscrever.
  3. Se o DATABASE_NAME especificado no recurso de replicação não existir, crie uma base de dados.

    CREATE DATABASE DATABASE_NAME;
    
  4. Opcional: para fins de teste, adicione uma tabela à base de dados e insira alguns dados. Pode usar estes dados para observar a replicação de dados do publicador para o subscritor.

    $ psql -h localhost -U postgres DATABASE_NAME
    customer=# CREATE TABLE TABLE_NAME(
    customer(#    ID INT PRIMARY KEY     NOT NULL,
    customer(#    NAME           TEXT    NOT NULL,
    customer(#    AGE            INT     NOT NULL,
    customer(#    SALARY         REAL
    customer(# );
    CREATE TABLE
    customer=# INSERT INTO TABLE_NAME (ID,NAME,AGE,SALARY) VALUES
    customer-# (1, 'Quinn', 25, 65000.00),
    customer-# (2, 'Kim', 22, 72250.00),
    customer-# (3, 'Bola', 31, 53000.00),
    customer-# (4, 'Sasha', 33, 105000.00),
    customer-# (5, 'Yuri', 27, 85000.00);
    INSERT 0 5
    customer=# \dt
              List of relations
    Schema |  Name   | Type  |  Owner
    --------+---------+-------+----------
    public | company | table | postgres
    (1 row)
    
    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
    (5 rows)
    

    Substitua o TABLE_NAME por uma tabela onde quer armazenar os dados e à qual o subscritor subscreve.

  5. Conceda as autorizações:

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO REPLICATION_USER;
    GRANT USAGE ON SCHEMA public TO REPLICATION_USER;
    ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO REPLICATION_USER;
    
  6. Execute o seguinte comando para criar uma publicação:

    CREATE PUBLICATION PUBLICATION_NAME;
    ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;
    

    Substitua o seguinte:

    • PUBLICATION_NAME: o nome da publicação que o subscritor vai usar para subscrever.

Depois de criar a publicação, pode configurar o cluster de subscritores para replicação lógica ou configurar a aplicação para começar a replicação.

Limitações

  • As atualizações à configuração do espaço de replicação não são suportadas. Para atualizar a configuração, elimine o espaço de replicação e recrie-o com a configuração atualizada.

    Para eliminar o espaço de replicação, execute o seguinte comando:

    kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE
    
  • Só pode configurar o espaço de replicação lógica na base de dados do publicador. A API de replicação não suporta o DBCluster ou as aplicações de subscrição de replicação lógica.

  • Se o cluster de base de dados referenciado pelo objeto de replicação estiver configurado para alta disponibilidade, o espaço de replicação lógica é recriado no standby promovido após uma comutação por falha. Depois de o espaço de replicação ser recriado, a posição da stream no espaço deixa de estar disponível e todas as aplicações que subscrevem a stream têm de restabelecer a ligação e repetir a stream.

O que se segue?