Ir para o conteúdo

Por que vejo um alto consumo de armazenamento em meu banco de dados do PostgreSQL de origem quando executo uma tarefa de CDC do AWS DMS?

4 minuto de leitura
0

Quero solucionar o alto consumo de armazenamento em meu banco de dados do PostgreSQL de origem ao executar uma tarefa de captura de dados de alteração (CDC) do AWS Database Migration Service (AWS DMS).

Breve descrição

Quando você usa o PostgreSQL como fonte para uma tarefa do CDC, o AWS DMS usa slots de replicação lógica do PostgreSQL para obter alterações do banco de dados de origem. Os slots retêm os logs de gravação antecipada (WALs) que o AWS DMS exige, mesmo quando você não conecta os WALs à origem do PostgreSQL. O AWS DMS só remove o WALs do PostgreSQL depois de buscar as alterações necessárias no slot de replicação e avançar restart_lsn do slot de replicação.

Para mais informações, consulte Logical decoding concepts (Conceitos de decodificação lógica) no site do PostgreSQL.

Problemas de volume de armazenamento podem ocorrer pelos seguintes motivos:

  • Você interrompe a tarefa do CDC do AWS DMS por um longo tempo. Se você não conectar o AWS DMS ao banco de dados de origem, ele não consumirá alterações do slot de replicação na origem. Portanto, o PostgreSQL retém continuamente os WALs.
  • Você tem um workload pesado que causa geração excessiva de WAL. Quando você usa slots de replicação lógica, o PostgreSQL retém WALs se o slot de replicação exigir os números de sequência de log (LSNs).
  • Você tem slots de replicação ociosos. Mesmo quando um slot de replicação está inativo, o WAL que o slot de replicação retém ainda contém informações sobre a tabela, o esquema ou o banco de dados. Isso preenche o armazenamento na origem, mesmo quando as tabelas não têm transações.

Resolução

Verificar se os slots de replicação causam alto uso de espaço em disco na origem do PostgreSQL

Para verificar se os slots de replicação estão causando alto uso de espaço em disco em seu banco de dados PostgreSQL, execute uma das seguintes consultas:

Para PostgreSQL v9:

psql=> SELECT slot_name, pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;

Para PostgreSQL v10 e versões posteriores:

psql=> SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;

Exemplo de saída:

slot_name                                                      | replicationslotlag | active---------------------------------------------------------------+--------------------+--------
xc36ujql35djp_00013322_907c1e0a_9f8b_4c13_89ea_ef0ea1cf143d    | 129 GB             | f
7pajuy7htthd7sqn_00013322_a27bcebf_7d0f_4124_b336_92d0fb9f5130 | 704 MB             | t
zp2tkfo4ejw3dtlw_00013322_03e77862_689d_41c5_99ba_021c8a3f851a | 624 MB             | t

Se um slot de replicação tiver um estado ativo definido como f (false), seu banco de dados não está consumindo esse slot.

Para eliminar os slots não utilizados, execute a seguinte consulta:

psql=> SELECT pg_drop_replication_slot('YOUR_SLOTNAME');

Observação: substitua YOUR_SLOTNAME pelo nome do slot.

Para mais informações, consulte Por que recebi um erro “Não há mais espaço no dispositivo” ou “DiskFull” no Amazon RDS para PostgreSQL?

Ativar o atributo heartbeat do WAL

Para reduzir o consumo de armazenamento em um banco de dados de origem do PostgreSQL, ative o atributo de conexão extra (ECA) heartbeatEnable. Esse atributo ajuda a evitar casos de armazenamento completo na origem do PostgreSQL.

Para ativar o atributo heartbeat do WAL, adicione o seguinte ECA ao endpoint de origem do PostgreSQL:

heartbeatEnable=Y;

Observação: a transação de heartbeat é executada na origem somente se uma tarefa do AWS DMS estiver em execução. Se você interromper suas tarefas do AWS DMS, o atributo heartbeat do WAL não terá efeito.

Também é possível especificar os seguintes ECAs:

heartbeatFrequency=frequency;heartbeatSchema=schemaname;

O atributo heartbeatFrequency determina com que frequência, em minutos, a transação de heartbeat é executada na origem do PostgreSQL. Substitua frequency pela frequência com que você deseja que a transação seja executada. Por exemplo, se você definir heartbeatFrequency como um valor de 15, o AWS DMS executará a transação de heartbeat a cada 15 minutos na origem.

O atributo heartbeatSchema especifica em qual esquema de banco de dados o AWS DMS cria objetos de banco de dados para gerar a transação de heartbeat. Substitua schemaname pelo esquema do seu banco de dados.

Definir o tamanho máximo de um slot no PostgreSQL

É possível aplicar max_slot_wal_keep_size no banco de dados de origem no PostgreSQL versão 13 e posterior. Isso define a quantidade máxima de WALs que os slots de replicação podem reter. Para mais informações, consulte max_slot_wal_keep_size no site do PostgreSQL.

Observação: a configuração max_slot_wal_keep_size ajuda a evitar problemas de armazenamento completo na origem do PostgreSQL. Porém, isso pode fazer com que o banco de dados de origem do PostgreSQL elimine os WALs antes que a tarefa do CDC do AWS DMS leia as alterações do slot de replicação. Isso pode fazer com que a tarefa falhe.

Informações relacionadas

Types of PostgreSQL replication slots (Tipos de slots de replicação do PostgreSQL) no site da Hevo

AWS OFICIALAtualizada há 9 meses