Nesta página, descrevemos como resolver problemas e corrigir atrasos de replicação para réplicas de leitura do Cloud SQL.
Visão geral
As réplicas de leitura do Cloud SQL usam a replicação de streaming do PostgreSQL. As alterações são gravadas no registro de gravação antecipada (WAL) na instância principal. O remetente do WAL envia o WAL para o receptor do WAL na réplica, onde são aplicados.O atraso da replicação pode acontecer em alguns cenários, como:
- A instância principal não pode enviar as alterações com rapidez suficiente para a réplica.
- A réplica não recebe as alterações com rapidez suficiente.
- A réplica não pode aplicar as alterações com rapidez suficiente.
network_lag
.
O terceiro é observado por meio da métrica replica_lag
. replica_lag
alto significa que
a réplica não pode aplicar alterações de replicação com rapidez suficiente. O atraso total pode ser
observado com a métrica replica_byte_lag
, que tem rótulos para indicar mais
detalhes. Essas métricas são descritas na seção Monitorar atraso da replicação
abaixo.
Otimizar consultas e esquema
Nesta seção, sugerimos algumas otimizações comuns de consulta e esquema que podem ser feitas para melhorar o desempenho da replicação.
Consultas de longa duração na réplica de leitura
Consultas de longa duração na réplica podem bloquear a replicação para o Cloud SQL. Talvez você queira ter réplicas separadas para fins de processamento de transações on-line (OLTP, na sigla em inglês) e processamento analítico on-line (OLAP, na sigla em inglês) e enviar apenas consultas de longa duração para a réplica OLAP.
Considere ajustar as sinalizações max_standby_archive_delay
e
max_standby_streaming_delay
para sua réplica.
Se você suspeitar que VACUUM é o culpado e o cancelamento da consulta não for aceitável,
considere definir a sinalização hot_standby_feedback
na réplica.
Consulte a documentação do PostgreSQL em espera ativa para mais informações.
Bloqueios exclusivos devido a DDL
Os comandos da linguagem de definição de dados (DDL), como ALTER TABLE
e
CREATE INDEX
, podem causar atraso de replicação na réplica devido a
bloqueios exclusivos. Para evitar a contenção de bloqueio, programe a execução do DDL
quando a carga da consulta for menor nas réplicas.
Réplica sobrecarregada
Se uma réplica de leitura estiver recebendo muitas consultas, a replicação poderá ser bloqueada. Divida as leituras entre várias réplicas para reduzir a carga em cada uma.
Para evitar picos de consulta, limite as consultas de leitura de réplica na lógica do aplicativo ou em uma camada de proxy, se usar uma.
Se houver picos de atividade na instância principal, considere distribuir as atualizações.
Banco de dados primário monolítico
Considere fragmentar o banco de dados primário verticalmente (ou horizontalmente) para impedir que uma ou mais tabelas atrasadas retenham todas as outras tabelas.
Monitorar atraso de replicação
Use as métricas replica_lag
e network_lag
para monitorar a atraso da replicação
e identificar se a causa do atraso está no banco de dados principal,
na rede ou na réplica.
Métrica | Descrição |
---|---|
Atraso da replicação ( cloudsql.googleapis.com ) |
O número de segundos em que o estado da réplica está atrasado em relação ao estado da instância principal. Essa é a diferença entre o horário atual e o carimbo de data/hora original em que o banco de dados primário confirmou a transação que está sendo aplicada na réplica. Em particular, as gravações podem ser contadas com atraso, mesmo que tenham sido recebidas pela réplica, se a réplica ainda não tiver aplicado a gravação ao banco de dados. Essa métrica é calculada usando |
Bytes de atraso ( cloudsql.googleapis.com ) |
A quantidade de bytes em que o estado da réplica está atrasado em relação ao
estado do banco de dados principal.
|
Atraso da rede ( cloudsql.googleapis.com ) |
O tempo, em segundos, que leva da confirmação no banco de dados primário para alcançar o receptor do WAL na réplica. Se o |
Verificar a replicação
Para verificar se a replicação está funcionando, execute a seguinte instrução na réplica:select status, last_msg_receipt_time from pg_stat_wal_receiver;
Se a replicação estiver acontecendo, você verá o status streaming
e um último
last_msg_receipt_time:
postgres=> select status, last_msg_receipt_time from pg_stat_wal_receiver;
status | last_msg_receipt_time
-----------+-------------------------------
streaming | 2020-01-21 20:19:51.461535+00
(1 row)
Se a replicação não estiver acontecendo, um resultado vazio será retornado:
postgres=> select status, last_msg_receipt_time from pg_stat_wal_receiver;
status | last_msg_receipt_time
--------+-----------------------
(0 rows)