Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Slots de replicação lógica em instâncias somente leitura

Última atualização: Aug 25, 2026

Crie slots de replicação lógica locais em instâncias somente leitura para permitir que assinantes downstream consumam alterações diretamente dessas instâncias. Essa abordagem reduz a carga de replicação lógica na instância primária.

Pré-requisitos

A instância deve executar o PostgreSQL 16 ou posterior com versão secundária do kernel igual ou superior a 20260530. Se a instância não oferecer suporte a esse recurso, atualize a versão secundária do kernel. Para mais informações, consulte Upgrade the minor kernel version.

Contexto

No PostgreSQL nativo, os slots de replicação lógica existem apenas na instância primária. Assim, os assinantes downstream precisam conectar-se a ela para consumir alterações. O RDS PostgreSQL estende essa funcionalidade ao oferecer suporte a slots de replicação lógica locais em instâncias somente leitura. Isso permite que os assinantes se conectem a uma instância somente leitura e transfiram a carga de trabalho de replicação da instância primária. Para mais detalhes sobre slots de replicação lógica, consulte a documentação oficial do PostgreSQL.

Observações de uso

  • Um slot de replicação lógica criado em uma instância somente leitura é local e não faz parte do processo de failover. Se a instância somente leitura for reconstruída, o slot será perdido e precisará ser recriado.

  • Utilize este recurso apenas em instâncias somente leitura não críticas para alta disponibilidade. Caso a instância gerencie tráfego de leitura essencial para alta disponibilidade, a perda de um slot pode interromper as assinaturas downstream. Avalie cuidadosamente o possível impacto nos negócios.

Exemplos de uso

Os exemplos abaixo utilizam uma instância primária (RW) e uma instância somente leitura (RO) sincronizadas por replicação em streaming. Eles abrangem três casos de uso típicos:

  • Uso básico: criação e consumo manuais de um slot em uma instância somente leitura com o plugin test_decoding. Recomendado para cenários que exigem lógica de decodificação personalizada.

  • Assinatura em instância somente leitura (criação automática de slot): caso de uso mais comum, no qual o comando CREATE SUBSCRIPTION cria automaticamente um slot na instância somente leitura.

  • Assinatura em instância somente leitura (pré-criação manual de slot): cenário avançado em que você cria manualmente um slot antes de estabelecer a assinatura. Isso garante que nenhuma alteração seja perdida durante a configuração.

Uso básico: criação e consumo manuais

Crie manualmente um slot de replicação lógica em uma instância somente leitura e consuma as alterações de dados da instância primária usando o plugin test_decoding.

  1. Crie um slot de replicação lógica local na instância somente leitura.

    -- [RO] Create a local logical replication slot.
    SELECT pg_create_logical_replication_slot('my_slot', 'test_decoding');
  2. Verifique se o slot foi criado.

    -- [RO] Verify that the slot was created.
    SELECT slot_name, plugin FROM pg_replication_slots WHERE slot_name = 'my_slot';

    Saída de exemplo:

     slot_name |    plugin     
    -----------+---------------
     my_slot   | test_decoding 
    (1 row)
  3. Grave dados na instância primária.

    -- [RW] Write data to the primary instance.
    INSERT INTO my_table VALUES (1), (2), (3);
  4. Aguarde a reprodução do WAL na instância somente leitura.

    Na instância primária, consulte o LSN atual do WAL:

    -- [RW] Get the current WAL LSN on the primary instance.
    SELECT pg_current_wal_lsn();

    Na instância somente leitura, consulte o progresso da reprodução até que o LSN de reprodução seja maior ou igual ao LSN do WAL da instância primária:

    -- [RO] Check the replay progress on the read-only instance.
    SELECT pg_last_wal_replay_lsn();
    Nota

    No PostgreSQL 15 e versões posteriores, também é possível usar a função pg_wal_replay_wait(target_lsn) para aguardar até que a reprodução atinja um LSN específico, em vez de fazer polling.

  5. Consuma as alterações por meio do slot na instância somente leitura.

    -- [RO] Consume changes through the slot.
    SELECT * FROM pg_logical_slot_get_changes('my_slot', NULL, NULL);

    Saída de exemplo:

        lsn    | xid |                  data
    -----------+-----+----------------------------------------
     0/XXXXXXX | 123 | table public.my_table: INSERT: ...
    (3 rows)
  6. Quando o slot não for mais necessário, remova-o.

    -- [RO] Drop the slot.
    SELECT pg_drop_replication_slot('my_slot');

Assinatura com criação automática de slot

Neste caso de uso comum, um assinante downstream conecta-se diretamente à instância somente leitura e o comando CREATE SUBSCRIPTION cria automaticamente um slot nessa instância.

  1. Crie uma tabela e uma publicação na instância primária.

    -- [RW] Create a table and a publication on the primary instance.
    CREATE TABLE tab_rep (id int PRIMARY KEY, data text);
    CREATE PUBLICATION my_pub FOR TABLE tab_rep;
  2. Aguarde a reprodução do WAL na instância somente leitura para garantir que a publicação esteja visível. Para obter instruções, consulte a Etapa 4 na seção Uso básico.

  3. Crie a mesma estrutura de tabela no assinante downstream.

    -- [Subscriber] Create the table structure on the subscriber instance.
    CREATE TABLE tab_rep (id int PRIMARY KEY, data text);
  4. No assinante downstream, crie uma assinatura que se conecte à instância somente leitura.

    -- [Subscriber] Create a subscription that connects to the read-only instance.
    -- The subscription automatically creates a slot named 'my_sub' on the read-only instance.
    CREATE SUBSCRIPTION my_sub
        CONNECTION 'host=<RO_HOST> port=<RO_PORT> dbname=postgres'
        PUBLICATION my_pub
        WITH (copy_data = off);
    Nota

    Essa ação cria automaticamente um slot de replicação lógica na instância somente leitura. Esse slot é local à instância, não participa do failover e será perdido caso a instância seja reconstruída.

  5. Grave dados na instância primária e verifique a sincronização.

    -- [RW] Write data to the primary instance.
    INSERT INTO tab_rep VALUES (1, 'hello'), (2, 'world');

    Fluxo de dados: instância primária → (replicação em streaming/WAL) → instância somente leitura → (replicação lógica) → assinante downstream.

    -- [Subscriber] Verify that the data is synchronized.
    SELECT * FROM tab_rep;

    Saída de exemplo:

     id | data
    ----+-------
      1 | hello
      2 | world
    (2 rows)
  6. Quando a assinatura não for mais necessária, remova-a no assinante downstream. Essa ação elimina automaticamente o slot da instância somente leitura.

    -- [Subscriber] Drop the subscription. This automatically removes the slot on the read-only instance.
    DROP SUBSCRIPTION my_sub;

Assinatura com pré-criação manual de slot

Para evitar perda de alterações durante a configuração, pré-crie manualmente o slot antes de estabelecer a assinatura.

  1. Crie manualmente um slot na instância somente leitura.

    -- [RO] Manually create the slot on the read-only instance.
    SELECT pg_create_logical_replication_slot('my_sub', 'pgoutput');
  2. No assinante downstream, crie uma assinatura que utilize o slot existente.

    -- [Subscriber] Create a subscription and use the existing slot.
    CREATE SUBSCRIPTION my_sub
        CONNECTION 'host=<RO_HOST> port=<RO_PORT> dbname=postgres'
        PUBLICATION my_pub
        WITH (copy_data = off, create_slot = false);
    Nota

    Definir create_slot = false instrui o comando CREATE SUBSCRIPTION a usar o slot existente na instância somente leitura em vez de criar um novo. As etapas subsequentes são as mesmas descritas na seção Assinatura em instância somente leitura (criação automática de slot).