Por que experimento alto consumo de armazenamento no banco de dados PostgreSQL de origem quando executo uma tarefa de CDC do AWS DMS?

Última atualização: 25/07/2022

Estou executando uma tarefa de captura de dados de alteração (CDC) do AWS Database Migration Service (AWS DMS) e usando um banco de dados PostgreSQL como origem. Por que experimento alto consumo de armazenamento no banco de dados de origem quando executo uma tarefa de CDC do AWS DMS?

Breve descrição

Quando você usa o PostgreSQL como origem para uma tarefa de CDC, o AWS DMS usa slots de replicação lógica, um recurso do PostgreSQL, para obter alterações do banco de dados de origem. Esses slots representam um fluxo de operações que são repetidas na mesma ordem em que foram feitas no banco de dados PostgreSQL de origem.

Por design, os slots de replicação lógica retreinam os logs de tradução (WAL) exigidos pelo AWS DMS, mesmo quando não estão conectados à origem PostgreSQL. Portanto, o WAL só é removido do PostgreSQL depois que o AWS DMS obteve as alterações necessárias do slot de replicação. O AWS DMS confirma que tem as alterações necessárias avançando o restart_lsn do slot de replicação.

Causas do alto consumo de armazenamento em uma origem PostgreSQL

Devido ao momo como o PostgreSQL implementa o recurso de slot de replicação lógica, em alguns cenários, problemas de volume de armazenamento podem ocorrer no banco de dados de origem.

  • A tarefa de CDC do AWS DMS é interrompida por um longo período. Isso significa que o AWS DMS não está conectado ao banco de dados de origem e não está consumindo as alterações do slot de replicação na origem. Isso significa que o PostgreSQL retém continuamente o WAL sem excluir o WAL mais antigo que não foi lido pelo AWS DMS. Por isso, o armazenamento no banco de dados de origem acaba ficando cheio.
  • Workload pesada - Workloads pesadas que causam geração excessiva de WAL também podem encher o armazenamento em um banco de dados PostgreSQL quando slots de replicação lógica estão em uso. Isso acontece porque o WAL ainda é retido pelo PostgreSQL se os números de sequência de registro (LSNs) são exigidos pelo slot de replicação.
  • Slots de replicação ociosos - Mesmo que uma tabela, um esquema ou um banco de dados do qual o AWS DMS está replicando alterações esteja inativo, o WAL retido pelo slot de replicação ainda conterá informações sobre essa tabela, esquema ou banco de dados. Isso enche o armazenamento na origem, mesmo que não estejam ocorrendo transações nas tabelas.

Resolução

Verifique se os slots de replicação estão causando alto uso de espaço em disco na origem PostgreSQL

Para verificar se os slots de replicação são a causa do alto uso de espaço em disco no banco de dados PostgreSQL, execute as consultas listadas em Por que recebi um erro "No space left on device” (Nenhum espaço restante no dispositivo) ou “DiskFull” (Disco cheio) no Amazon RDS para PostgreSQL?

Observação: muitas dessas consultas podem ser usadas em instalações autogerenciadas do PostgreSQL.

Ativar o recurso de pulsação WAL

Ative o recurso de pulsação WAL do AWS DMS para ajudar a evitar consumo de armazenamento em um banco de dados PostgreSQL de origem. Esse recurso imita uma transação fictícia para que os slots de replicação lógica ociosos não retenham logs de WAL atigos. Essa pulsação mantém restart_lsn em movimento e evita que o armazenamento fique cheio na origem PostgreSQL.

Para ativar o recurso de pulsação WAL, adicione esse atributo de conexão extra (ECA) ao endpoint de origem do PostgreSQL:

heartbeatEnable=Y;

Opcionalmente, especifique estas ECAs adicionais:

heartbeatFrequency=frequency;heartbeatSchema=schemaname;

HeartbeatFrequency determina com que frequência (em minutos) a transação de pulsação é executada na origem PostgreSQL. Por exemplo, se você definir HeartbeatFrequency como um valor de 15, o AWS DMS executará a transação de pulsação a cada 15 minutos na origem.

HeartbeatSchema especifica em que esquema de banco de dados o AWS DMS cria objetos de banco de dados para gerar a transação de pulsação.

Observação: a transação de pulsação só é executada na origem se uma tarefa do AWS DMS estiver em execução. Se as tarefas do AWS DMS forem interrompidas, o recurso de pulsação do WAL não terá efeito.

Limitar o tamanho de um slot no PostgreSQL

Você pode aplicar max_slot_wal_keep_size ao banco de dados de origem no PostgreSQL 13 e posteriores. Isso define a quantidade máxima de WAL que pode ser retida pelos slots de replicação.

Observação: a configuração max_slot_wal_keep_size pode ajudar a evitar problemas de armazenamento cheio na origem PostgreSQL. Mas também pode fazer com que o WAL seja eliminado da origem antes que a tarefa de CDC do AWS DMS possa ler as alterações no slot de replicação. Por isso, a tarefa falha.