O PostgreSQL oferece suporte nativo para ativar o Change Data Capture (CDC) por meio de slots de replicação. Este tópico descreve como configurar o CDC em uma instância do ApsaraDB RDS for PostgreSQL.
Pré-requisitos
Você tem uma instância do ApsaraDB RDS for PostgreSQL. Para mais informações, consulte Crie uma instância do ApsaraDB RDS for PostgreSQL.
Você configurou uma lista de permissões para permitir o acesso do cliente à instância do ApsaraDB RDS for PostgreSQL. Para mais informações, consulte Configure uma lista de permissões de endereços IP.
Antes de continuar, instale o cliente de linha de comando do PostgreSQL. Para mais informações, consulte a documentação oficial do PostgreSQL.
Observações de uso
Para usar este recurso, ative o CDC e consuma alterações de dados apenas na instância primária. Este recurso não é compatível com instâncias somente leitura.
O ApsaraDB RDS for PostgreSQL é compatível com o Logical Replication Slot Failover. Um failover entre primária e secundária não afeta o CDC. Para mais informações, consulte Logical Replication Slot Failover.
Antes de ativar o CDC, modifique um parâmetro da sua instância do ApsaraDB RDS for PostgreSQL. Essa ação reinicia a instância. Para evitar interrupções no service, execute essa operação em horários de baixa demanda.
-
Ao usar o CDC em uma instância do ApsaraDB RDS for PostgreSQL, observe o seguinte:
O CDC exige mais espaço de armazenamento para logs WAL. Se o consumo de dados for anormal ou parar, a instância não limpa os logs WAL automaticamente. Isso pode causar o acúmulo de logs até consumirem todo o espaço em disco disponível, bloqueando a instância. Uma instância bloqueada torna-se somente leitura e rejeita operações de gravação.
-
Manter linhas de dados antigas por um período prolongado pode causar um problema de wraparound de ID de transação e bloquear todas as operações de gravação na instância. O log de erros pode conter as seguintes mensagens:
“HINT: Close open transactions soon to avoid wraparound problems. You might also need to commit or roll back old prepared transactions, or drop stale replication slots.” “WARNING: oldest xmin is far in the past.”
Para limpar o espaço, exclua manualmente o slot de replicação para permitir que o kernel do PostgreSQL limpe automaticamente os logs WAL e as linhas de dados antigos. Para mais informações, consulte Desative o CDC.
NotaMonitore regularmente o tamanho do log WAL e o uso de espaço em disco da sua instância. Para acompanhar o desempenho, visualize os dados de monitoramento e, para configurar alertas, gerencie as regras relevantes. Para mais informações, consulte Visualize os dados do Enhanced Monitoring e Gerencie as regras de alerta.
Ative o CDC
Etapa 1: crie um banco de dados de teste
Para começar, acesse a página Instâncias. Na barra de navegação superior, selecione a região da instância RDS. Em seguida, encontre a instância RDS e clique em seu ID.
No painel de navegação à esquerda, escolha Databases.
-
Em seguida, clique em Create Database. Após criar o banco de dados
testdb, o status dele muda para Em execução e o conjunto de caracteres passa a ser UTF8.NotaNeste exemplo, usamos um banco de dados chamado testdb. Para instruções detalhadas, consulte Crie um banco de dados.
Etapa 2: crie contas de teste e configure permissões
No painel de navegação à esquerda, escolha Accounts.
-
Em seguida, clique em Create Account para criar uma conta privilegiada (db_admin) e uma conta padrão para o CDC (cdc_user).
NotaOs nomes de conta usados neste tópico são apenas para fins de demonstração. Especifique nomes personalizados. Para mais informações sobre como criar uma conta, consulte Crie uma conta.
-
Use a conta db_admin para se conectar à instância do ApsaraDB RDS for PostgreSQL.
psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdbNotaPara mais informações sobre como obter o endpoint de uma instância, consulte Visualize ou altere o endpoint e o número da porta.
-
Para adicionar a conta cdc_user à função de replicação, execute o seguinte comando:
ALTER USER cdc_user WITH REPLICATION;Para verificar o resultado, execute o seguinte comando:
SELECT rolreplication FROM pg_roles WHERE rolname='cdc_user';Saída de exemplo:
rolreplication ---------------- t (1 row) -
Para conceder permissões à conta cdc_user, execute o seguinte comando:
GRANT SELECT ON ALL TABLES IN SCHEMA PUBLIC to cdc_user;
Etapa 3: modifique os parâmetros da instância
-
Para consultar as configurações atuais dos parâmetros, execute o seguinte comando:
SELECT name, setting, short_desc, source FROM pg_settings WHERE name ='wal_level';Saída de exemplo:
name | setting | short_desc | source -----------------------+---------+-------------------------------------------------------------------------+-------------------- wal_level | replica | Sets the level of information written to the WAL. | configuration file (1 rows)O parâmetro wal_level controla a quantidade de informações que o PostgreSQL grava no log WAL. O valor padrão é replica e você só pode definir esse parâmetro na inicialização do servidor. Valores válidos:
minimal: Grava apenas as informações necessárias para recuperação após uma falha ou um desligamento imediato. Nesse nível, você não pode restaurar um banco de dados a partir de um backup de base e logs WAL.
replica: Grava informações suficientes para oferecer suporte ao arquivamento e à replicação de WAL, incluindo a execução de consultas somente leitura em um servidor em espera.
logical: Adiciona informações necessárias para a decodificação lógica.
Para começar, acesse a página Instâncias. Na barra de navegação superior, selecione a região da instância RDS. Em seguida, encontre a instância RDS e clique em seu ID.
No painel de navegação à esquerda, escolha Parameters.
-
Para alterar o nível, defina o parâmetro wal_level como logical.
NotaPara mais informações sobre como modificar os parâmetros da instância, consulte Modifique os parâmetros de uma instância do ApsaraDB RDS for PostgreSQL.
Após finalizar, envie a alteração do parâmetro; a instância do ApsaraDB RDS for PostgreSQL reiniciará. Para evitar interrupções no service, execute essa operação em horários de baixa demanda.
Etapa 4: crie um slot de replicação lógica
A modificação de parâmetro em Etapa 3 reinicia sua instância do ApsaraDB RDS for PostgreSQL. Prossiga com esta etapa somente após a instância reiniciar e seu status ser Em execução.
-
Use a conta db_admin para se conectar à instância do ApsaraDB RDS for PostgreSQL.
psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdb -
Para criar um slot de replicação chamado
cdc_replication_slotusando o plugin de saídatest_decoding, execute o seguinte comando:SELECT pg_create_logical_replication_slot('cdc_replication_slot', 'test_decoding');NotaO nome do slot
cdc_replication_sloté apenas para fins de demonstração. Especifique um nome personalizado.O PostgreSQL fornece o plugin de saída
test_decodingnativamente, portanto, não requer alterações.
Saída de exemplo:
pg_create_logical_replication_slot ------------------------------------ (cdc_replication_slot,1/14003428) (1 row)Para verificar a criação do slot, execute o seguinte comando:
SELECT * FROM pg_replication_slots;Saída de exemplo:
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size | two_phase ----------------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+----------------+----------- cdc_replication_slot | test_decoding | logical | 18822 | testdb | f | f | | | 22356 | 1/140033F0 | 1/14003428 | reserved | | f (1 row)
Etapa 5: crie dados de teste
Para criar dados de teste e simular um ambiente de produção, execute os seguintes comandos:
CREATE TABLE public.tb_test(
id int NOT NULL PRIMARY KEY
);
ALTER TABLE public.tb_test ADD name varchar(1) NULL;
INSERT INTO public.tb_test SELECT 1, 'A';
Etapa 6: leia dados do slot
-
Use a conta cdc_user para se conectar à instância do ApsaraDB RDS for PostgreSQL.
psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U cdc_user -d testdb -
Para ler as alterações do slot de replicação, execute o seguinte comando:
SELECT * FROM pg_logical_slot_peek_changes('cdc_replication_slot', null, null);Saída de exemplo:
lsn | xid | data ------------+-------+------------------------------------------------------------------------- 1/14003D90 | 22376 | BEGIN 22376 1/1401DDE8 | 22376 | COMMIT 22376 1/1401DDE8 | 22377 | BEGIN 22377 1/1401E100 | 22377 | COMMIT 22377 1/1401E2A8 | 22382 | BEGIN 22382 1/1401E2A8 | 22382 | table public.tb_test: INSERT: id[integer]:1 name[character varying]:'A' 1/1401E3C0 | 22382 | COMMIT 22382 (7 rows)
Etapa 7: consuma alterações de dados
Para sair da conexão do banco de dados, execute o comando
\q.-
Para consumir as alterações de dados, execute o seguinte comando:
NotaExecute o comando
pg_recvlogicalcomo o usuário postgres. Troque de usuário executando o comando su - postgres. Se você encontrar o erro-bash: pg_recvlogical: command not found, consulte a seção Perguntas frequentes para obter uma solução.pg_recvlogical -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -U <privileged account> -d <test database> --create-slot --if-not-exists --slot=cdc_replication_slot --plugin=test_decoding --start -f -Exemplo de comando:
pg_recvlogical -h pgm-*****.pgsql.singapore.rds.aliyuncs.com -U db_admin -d testdb --create-slot --if-not-exists --slot=cdc_replication_slot --plugin=test_decoding --start -f -Saída de exemplo:
BEGIN 22376 COMMIT 22376 BEGIN 22377 COMMIT 22377 BEGIN 22382 table public.tb_test: INSERT: id[integer]:1 name[character varying]:'A' COMMIT 22382
Desativar o CDC
Se o consumo de dados for anormal ou parar, os logs WAL podem se acumular e consumir todo o espaço em disco disponível, bloqueando a instância eventualmente. Para resolver isso, exclua manualmente os slots de replicação inativos. Essa ação permite ao kernel do PostgreSQL limpar os logs WAL antigos.
Exclua slots de replicação inativos no console, por meio de uma chamada de API ou executando um comando SQL:
No console: Gerencie os logs WAL.
Pela API: Exclua o slot.
-
Por comando SQL:
-
Use a conta db_admin para se conectar à instância do ApsaraDB RDS for PostgreSQL.
psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdb -
Para visualizar os nomes e as informações sobre os slots inativos, execute o seguinte comando:
SELECT slot_name, slot_type, database, active, safe_wal_size FROM pg_replication_slots WHERE active = 'f';Saída de exemplo:
slot_name | slot_type | database | active | safe_wal_size ----------------------+-----------+----------+--------+--------------- cdc_replication_slot | logical | testdb | f | (1 row) -
Para excluir o slot de replicação lógica, execute o seguinte comando:
SELECT pg_drop_replication_slot('cdc_replication_slot');
-
Perguntas frequentes
-
P: O que fazer ao receber o erro
-bash: pg_recvlogical: command not foundao consumir dados?R: O
pg_recvlogicalé uma ferramenta nativa de decodificação lógica para PostgreSQL que usa o plugin de saída padrãotest_decoding. Esse plugin está no diretório contrib/test_decoding do pacote de código-fonte do PostgreSQL. Compile e instale o PostgreSQL a partir do código-fonte. Após a instalação, a ferramentapg_recvlogicalestará no diretório /bin do caminho de instalação do cliente. Para mais informações sobre como instalar o PostgreSQL a partir do código-fonte, consulte Instale a partir do código-fonte. -
P: Excluí manualmente um slot de replicação, mas o sistema não limpou automaticamente os logs WAL e eles ainda estão consumindo espaço em disco. O que fazer?
R: Altere o parâmetro
wal_keep_segmentspara o valor padrão de128para reduzir o número de arquivos de log retidos. Para mais informações sobre como modificar os parâmetros da instância, consulte Modifique os parâmetros de uma instância do ApsaraDB RDS for PostgreSQL.