A assinatura lógica permite a sincronização unidirecional, em nível de tabela e quase em tempo real, entre instâncias do ApsaraDB RDS for PostgreSQL. Utilize esse recurso para compartilhar dados entre regiões, consolidar informações de várias fontes em um banco de dados central ou distribuir dados por bancos de dados distintos.
Pré-requisitos
Antes de começar, certifique-se de que você possui:
Uma instância do ApsaraDB RDS for PostgreSQL executando PostgreSQL 10 ou superior com discos em nuvem
O parâmetro
wal_leveldefinido comologicalna instância publicadora — reconfigure-o na página Parameters no console do ApsaraDB RDS e reinicie a instância para que a alteração tenha efeito(Para assinaturas entre instâncias) O bloco CIDR da Virtual Private Cloud (VPC) adicionado à lista de permissões de endereços IP de ambas as instâncias — por exemplo, adicione
172.16.0.0/16. Para mais detalhes, consulte Configurar uma lista de permissões de endereços IPUma conta com a função
rds_superuser— seja a conta privilegiada ou uma conta padrão criada comCREATE ROLE xxx WITH SUPERUSER
Como funciona
Na instância publicadora, crie uma publicação para uma ou mais tabelas em um banco de dados.
Na instância assinante, crie uma assinatura que se conecte ao banco de dados da publicadora e referencie a publicação.
O PostgreSQL transmite alterações no nível de linha (INSERT, UPDATE, DELETE) das tabelas publicadas para a assinante quase em tempo real.
As assinaturas lógicas funcionam entre dois bancos de dados na mesma instância RDS ou entre duas instâncias RDS que residem na mesma VPC e estão conectadas por endpoints internos.
Para obter informações sobre o mecanismo subjacente, consulte Princípios e melhores práticas de assinatura lógica.
Crie uma publicação na instância publicadora
Conecte-se à instância publicadora e acesse o banco de dados que deseja publicar.
-
Crie uma publicação para uma tabela:
Apenas tabelas base persistentes podem ser publicadas. Para objetos suportados, consulte CREATE PUBLICATION .
-- On the publisher database CREATE PUBLICATION <publication_name> FOR TABLE <schema.table_name>;Exemplo:
-- On the publisher database (testdb01) CREATE PUBLICATION pub1 FOR TABLE public.t1; -
Verifique se a publicação foi criada:
-- On the publisher database SELECT * FROM pg_publication;A saída lista
pub1com seus detalhes de configuração.
Crie uma assinatura na instância assinante
Os passos variam dependendo se a publicadora e a assinante estão na mesma instância RDS ou em instâncias diferentes.
Mesma instância RDS, bancos de dados diferentes
Quando a publicadora e a assinante estão na mesma instância, o PostgreSQL não consegue criar um slot de replicação dentro do mesmo comando CREATE SUBSCRIPTION — essa tentativa faz o comando travar. Trata-se de uma restrição do mecanismo PostgreSQL, não uma limitação do RDS. Crie o slot separadamente primeiro e depois referencie-o na assinatura.
-
Conecte-se ao banco de dados da publicadora e crie um slot de replicação lógica:
-- On the publisher database SELECT pg_create_logical_replication_slot('<slot_name>', 'pgoutput'); Conecte-se ao banco de dados da assinante e crie uma tabela com o mesmo esquema e nome da tabela na publicadora.
-
Acesse o banco de dados da assinante e crie a assinatura, referenciando o slot criado no passo 1. Se a instância executar PostgreSQL 16 ou superior:
ImportanteSempre inclua
create_slot=falsena cláusulaWITHquando a publicadora e a assinante estiverem na mesma instância. A omissão desse parâmetro causa o travamento do comando.-- On the subscriber database CREATE SUBSCRIPTION <subscription_name> CONNECTION 'host=127.0.0.1 port=<port> user=<username> password=<password> dbname=<publisher_db_name>' PUBLICATION <publication_name> WITH (create_slot=false, slot_name=<slot_name>);Se a instância executar PostgreSQL 10 a 15:
-- On the subscriber database CREATE SUBSCRIPTION <subscription_name> CONNECTION 'dbname=<publisher_db_name>' PUBLICATION <publication_name> WITH (create_slot=false, slot_name=<slot_name>); -
Verifique a assinatura:
-- On the subscriber database SELECT * FROM pg_subscription;
Instâncias RDS diferentes
Conecte-se à instância assinante e acesse o banco de dados da assinante.
Crie uma tabela com o mesmo esquema e nome da tabela existente na publicadora.
-
Crie a assinatura:
-- On the subscriber database CREATE SUBSCRIPTION <subscription_name> CONNECTION 'host=<Internet endpoint of the publisher RDS instance> port=<port> user=<username> password=<password> dbname=<publisher_db_name>' PUBLICATION <publication_name>;Exemplo:
-- On the subscriber database (testdb02) CREATE SUBSCRIPTION sub1_from_pub1 CONNECTION 'host=pgm-2ze7n9zb0n1f****.pg.rds.aliyuncs.comm port=5432 user=testdbuser password=****x dbname=testdb01' PUBLICATION pub1 WITH (enabled, create_slot, slot_name='sub1_from_pub1');Para todos os parâmetros de assinatura disponíveis, consulte CREATE SUBSCRIPTION.
-
Verifique a assinatura:
-- On the subscriber database SELECT * FROM pg_subscription;
Adicione tabelas a uma publicação existente
Após adicionar tabelas a uma publicação, atualize a assinatura na instância assinante — novas tabelas não são detectadas automaticamente.
-- On the subscriber database
ALTER SUBSCRIPTION <subscription_name> REFRESH PUBLICATION;
Monitore slots de replicação
Slots de replicação não utilizados retêm arquivos de Write-Ahead Logging (WAL) e impedem sua reciclagem. Caso uma assinante pare de consumir alterações, os arquivos WAL se acumulam e podem preencher o armazenamento da publicadora, tornando a instância indisponível.
Após configurar assinaturas lógicas:
Monitore o Storage Used na instância publicadora e configure um alerta para crescimento anormal.
Acompanhe o Maximum Used Transaction IDs para detectar riscos de estouro de ID de transação.
-
Remova qualquer slot de replicação que não esteja mais em uso:
-- On the publisher database SELECT pg_drop_replication_slot('<slot_name>');Para listar todos os slots de replicação ativos:
-- On the publisher database SELECT * FROM pg_replication_slots;