Compreensão e Redução do Atraso de Replicação do PostgreSQL

O atraso na replicação no PostgreSQL ocorre quando as alterações feitas no servidor primário levam tempo para serem refletidas no servidor de réplica. Seja utilizando replicação por streaming ou replicação lógica, o atraso pode impactar no desempenho, consistência e disponibilidade do sistema. Esta postagem aborda os tipos de replicação, suas diferenças, causas de atraso, fórmulas matemáticas para estimativa de atraso, técnicas de monitoramento e estratégias para minimizar o atraso na replicação.

Tipos de Replicação no PostgreSQL

Replicação por Streaming

A replicação por streaming envia continuamente as alterações do Log de Requisições (WAL) do primário para um ou mais servidores de réplica em tempo quase real. A réplica aplica as alterações sequencialmente conforme são recebidas. Este método replica todo o banco de dados e garante que as réplicas permaneçam sincronizadas.

Vantagens

  • Baixa latência com sincronização quase em tempo real.
  • Eficiente para replicação de banco de dados completo.

Desvantagens

  • As réplicas são somente leitura, então todas as transações de escrita devem ser feitas no nó primário.
  • Se a conexão de rede falhar, o atraso pode aumentar significativamente.

Replicação Lógica

A replicação lógica transfere alterações no nível de dados em vez de dados de baixo nível do WAL. Ele permite a replicação seletiva, onde apenas tabelas específicas ou partes de um banco de dados são replicadas. A replicação lógica usa um processo de decodificação lógica para converter as alterações do WAL em alterações semelhantes ao SQL.

Vantagens

  • Permite a replicação seletiva de tabelas ou esquemas específicos.
  • Suporta réplicas graváveis com opções de resolução de conflitos.

Desvantagens

  • Maior latência devido ao overhead de decodificação lógica.
  • É menos eficiente do que a replicação em streaming para grandes conjuntos de dados.

Como ocorre o Atraso na Replicação

O atraso na replicação ocorre quando a taxa na qual as alterações são geradas no servidor primário excede a taxa na qual elas podem ser processadas e aplicadas ao servidor de réplica. Esse desequilíbrio pode ocorrer devido a vários fatores subjacentes, cada um contribuindo para atrasos na sincronização de dados. As causas mais comuns de atraso na replicação são:

Latência de Rede

A latência de rede refere-se ao tempo que os dados levam para viajar do servidor primário para o servidor de réplica. Segmentos do WAL (Write-Ahead Log) são continuamente transmitidos pela rede durante a replicação em streaming. Mesmos pequenos atrasos na transmissão pela rede podem se acumular, causando atraso na réplica.

Causas

  • Altos tempos de ida e volta da rede (RTT).
  • Mais largura de banda para lidar com grandes volumes de dados do WAL.
  • Congestionamento de rede ou perda de pacotes.

Se o servidor primário gerar mudanças significativas durante o tráfego de pico, uma rede lenta ou sobrecarregada pode causar um gargalo, impedindo que a réplica receba as mudanças do WAL.

Solução

Utilize conexões de rede de baixa latência e alta largura de banda e habilite compressão de WAL (wal_compression = on) para reduzir o tamanho dos dados durante a transmissão.

Bottlenecks de I/O

Bottlenecks de I/O ocorrem quando o disco do servidor réplica é muito lento para gravar as mudanças do WAL recebidas. A replicação em streaming depende da gravação das mudanças no disco antes de serem aplicadas, portanto, quaisquer atrasos no subsistema de I/O podem causar acúmulo de latência.

Causas

  • Discos rígidos lentos ou sobrecarregados (HDDs).
  • Taxa de gravação de disco insuficiente.
  • Contenção de disco por outros processos.
  • Se o servidor réplica utiliza discos giratórios (HDD) em vez de unidades de estado sólido (SSD), as mudanças do WAL podem não ser gravadas rápido o suficiente para acompanhar as mudanças de dados, causando um atraso da réplica em relação ao primário.

Solução

Para otimizar o I/O de disco de uma réplica, utilize SSDs para velocidades de gravação mais rápidas e isole os processos de replicação de outras tarefas que consomem disco.

Restrições de CPU/Memória

Os processos de replicação exigem CPU e memória para decodificar, escrever e aplicar alterações. Se um servidor de réplica não possui poder de processamento ou memória suficientes, pode ter dificuldade para acompanhar as modificações recebidas, resultando em atraso na replicação.

Causas

  • Núcleos de CPU limitados ou processadores lentos.
  • Memória insuficiente para buffers WAL.
  • Outros processos consomem recursos de CPU ou memória.
  • Se a réplica estiver processando grandes transações ou executando consultas junto com a replicação, a CPU pode ficar saturada, retardando o processo de replicação.

Solução

Aloque mais núcleos de CPU e memória para o servidor de réplica. Aumente o tamanho dos wal_buffers para melhorar a eficiência do processamento do WAL.

Cargas Pesadas no Servidor Primário

O atraso na replicação também pode ocorrer quando o servidor primário gera muitas alterações rapidamente demais para a réplica lidar. Grandes transações, inserções em massa ou atualizações frequentes podem sobrecarregar a replicação.

Causas

  • Importações de dados em massa ou grandes transações.
  • Atualizações de alta frequência em tabelas grandes.
  • Cargas de trabalho de alta concorrência no primário.
  • A carga de transação pode ser muito pesada se o servidor primário processar várias grandes transações simultaneamente, como durante uma importação de dados em massa. O volume de dados do WAL pode exceder o que a réplica pode processar em tempo real, aumentando o atraso.

Solução

Otimize as transações agrupando atualizações menores e evitando transações de longa duração. Se a sincronização estrita não for crítica, use replicação assíncrona para reduzir a carga de replicação.

Concorrência de Recursos

A concorrência de recursos ocorre quando vários processos competem pelos mesmos recursos, como CPU, memória ou I/O de disco. Isso pode acontecer tanto no servidor primário quanto no servidor réplica e levar a atrasos no processamento de replicação.

Causas

  • Outros processos consomem I/O de disco, CPU ou memória.
  • Tarefas em segundo plano, como backups ou análises, executadas simultaneamente.
  • Concorrência de rede entre o tráfego de replicação e outras transferências de dados.
  • Se o servidor réplica também estiver executando backups ou consultas analíticas, a competição por recursos de CPU e disco pode desacelerar o processo de replicação.

Solução

Isolar as cargas de trabalho de replicação de outros processos que consomem muitos recursos. Agende backups e análises durante horários de menor movimento para evitar interferência na replicação.

Fórmula Matemática para Atraso de Replicação

Use a seguinte fórmula para calcular o atraso de replicação:

Na replicação lógica, tempo adicional é consumido pela decodificação lógica:

Monitoramento do Atraso de Replicação

Monitoramento de Replicação em Streaming

A visualização pg_stat_replication pode ser usada para monitorar o atraso na replicação de fluxo. Fornece insights sobre o estado e o atraso entre os servidores primário e secundário.

SQL

 

  • sent_lsn: Última localização do WAL enviada para o secundário.
  • write_lsn: Última localização do WAL gravada no secundário.
  • lag_bytes: A diferença entre os dois indica o atraso.

Monitoramento de Replicação Lógica

O atraso na replicação lógica pode ser monitorado usando a visualização pg_stat_subscription.

SQL

 

Exemplo: Visualizando o Atraso na Replicação

O trecho de código Python a seguir visualiza o atraso na replicação de fluxo e lógica ao longo do tempo.

Python

 

O gráfico resultante compara o desempenho da replicação de fluxo e lógica. A replicação lógica tende a ter um atraso mais variável devido às sobrecargas de decodificação e processamento.

Como Reduzir o Atraso na Replicação

1. Otimizar a Configuração do WAL

Shell

 

2. Melhore o Desempenho da Rede

  • Use conexões de rede de baixa latência e alta largura de banda entre o primário e as réplicas.
  • Comprima os dados do WAL durante a transmissão para reduzir o tempo de transferência: wal_compression = on.

3. Use Replicação Assíncrona (Quando Possível)

  • A replicação assíncrona reduz o atraso por não esperar a confirmação das alterações pela réplica, mas introduz um risco de perda de dados.

PLSQL

 

4. Ative a Aplicação Paralela na Replicação Lógica

PLSQL

 

5. Aloque Mais Recursos para as Réplicas

  • Garanta que a réplica tenha CPU e memória suficientes para processar rapidamente as alterações do WAL.
  • Use SSDs para E/S de disco mais rápida na réplica.

6. Transações em lote

  • Agrupe múltiplas atualizações menores em menos transações para minimizar o overhead.

Exemplos do mundo real

Reduzindo o Atraso na Replicação em Tempo Real

Uma empresa que executa um cluster PostgreSQL de alto tráfego enfrentou atraso na replicação durante o horário de pico. Eles reduziram pela metade o atraso na replicação aumentando o wal_buffers para 64MB e reduzindo o wal_writer_delay para 10ms. A mudança para uma conexão de rede de alta velocidade reduziu o atraso para menos de um segundo.

Reduzindo o Atraso na Replicação Lógica

Um sistema com várias assinaturas lógicas experimentou atraso durante cargas de trabalho de escrita intensas. Habilitar a aplicação paralela no PostgreSQL 14 distribuiu a carga de trabalho entre numerosos workers, reduzindo o atraso na replicação de 4 segundos para menos de 1 segundo.

Conclusão

O atraso na replicação é um problema crítico que afeta o desempenho e a consistência dos sistemas PostgreSQL. A replicação em tempo real oferece baixa latência, mas requer a replicação de todo o banco de dados, enquanto a replicação lógica oferece flexibilidade, porém com um overhead maior. O monitoramento regular usando pg_stat_replication e pg_stat_subscription permite que os administradores detectem e mitiguem o atraso.

Otimizar configurações do WAL, melhorar o desempenho da rede, usar aplicativos em paralelo e alocar recursos suficientes podem reduzir significativamente o atraso. A sintonia adequada garante que as réplicas permaneçam sincronizadas e o sistema mantenha alta disponibilidade e desempenho.

Source:
https://dzone.com/articles/understanding-and-reducing-postgresql-replication-lag