한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Guia do Lag em Jogos › L12 Banco de dados

Atraso de replicação Replication lag

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)

Abrir o card interativo, com figuras e simulações →

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

Sintomas
Ação perdida / rollback
Fatores
Latência
Quem é afetado
Só um recurso específico
Quando
Quando junta muita gente, Horário de pico à noite
Responsável
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

  1. SHOW REPLICA STATUS Statement MySQL
    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)
  2. Replica Server Options and Variables MySQL
    Com replica_parallel_workers, várias threads aplicam as transações em paralelo (padrão 4; com 0, uma única thread aplica em ordem)
  3. 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)
  4. MySQL 8.0 Reference Manual: SHOW REPLICA STATUS Statement MySQL
    A partir da 8.0.22, SHOW REPLICA STATUS substitui SHOW SLAVE STATUS; versões anteriores usam SHOW SLAVE STATUS
  5. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    write_lag, flush_lag e replay_lag do pg_stat_replication: tempo entre o servidor primário gravar o WAL e a réplica avisar que o escreveu, gravou no disco e aplicou
  6. Amazon CloudWatch metrics for Amazon RDS AWS
    ReplicaLag: quanto a réplica de leitura está atrasada em relação à origem (segundos)

Veja também

Mesma camada: L12 Banco de dados

Mesmo sintoma (Ação perdida / rollback) em outras camadas

Ver o card interativo, com figuras e simulações