ID da causa db-replica-lag · Responsável principal Infraestrutura de banco de dados (Equipe de infraestrutura) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)
Com as escritas no BD primário e as leituras em uma réplica, se a réplica fica para trás, o que acabou de ser gravado não aparece.
Por quê Um volume grande de escritas no BD primário deixa a réplica alguns segundos atrasada → Efeito O que acabou de ser salvo ainda não está na réplica quando é lido de lá → Na tela O item que você acabou de comprar não aparece, o preço no mercado está desatualizado, bug de entrega duplicada
Responsável principal Infraestrutura de banco de dados (Equipe de infraestrutura) · Também envolvidos Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Ler do BD primário os dados que acabaram de ser gravados, verificar se a recompensa já foi entregue e entregá-la em uma única transação no BD primário (bloquear duplicação com chave única ou UPDATE condicional).
O que fazer (Equipe de infraestrutura)
Criar alerta de atraso de replicação, dar à réplica uma configuração igual ou superior à do BD primário e ativar replicação paralela, executar exclusões em massa em pedaços pequenos, controlar queries de agregação longas na réplica.
No gráfico
Sobe com a carga · Atraso de replicação (s)
Onde olhar
No MySQL, ver Seconds_Behind_Source no SHOW REPLICA STATUS da réplica (SHOW SLAVE STATUS em versões anteriores à 8.0.22). No PostgreSQL, ver write_lag, flush_lag e replay_lag no pg_stat_replication do servidor primário; no RDS, ReplicaLag
Confirma se
No horário dos reports de “não aparece”, o atraso está em alguns segundos ou mais, e depois que o atraso some tudo aparece normal. O atraso cresce nos horários de pico de escritas, exclusões em massa ou queries de agregação longas na réplica
Descarta se
Atraso perto de 0 e mesmo assim não aparece: mais provável, cache ou sincronização do servidor do jogo
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
A réplica pode ficar para trás mesmo sem muitas escritas. Uma única exclusão em massa que levou 10 minutos no BD primário deixa a réplica atrasada nesse mesmo tempo enquanto é reexecutada lá, e queries de agregação longas rodando nela também retardam a recuperação do atraso.
Fontes
SHOW REPLICA STATUS StatementMySQL Seconds_Behind_Source: diferença em relação ao horário em que o evento que a réplica está aplicando agora foi gravado no BD primário (atraso de replicação)
Replica Server Options and VariablesMySQL Com replica_parallel_workers, várias threads aplicam as transações em paralelo (padrão 4; com 0, uma única thread aplica em ordem)
Log-Shipping Standby Servers (PostgreSQL Documentation)PostgreSQL A replicação por streaming é assíncrona por padrão, então há atraso entre o commit e a réplica refletir a mudança (em geral menos de 1 segundo, se a réplica consegue acompanhar)