ID da causa db-cache-stampede · Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de banco de dados (Equipe de infraestrutura)
Quando o cache de dados populares expira todo ao mesmo tempo, milhares de requisições caem de uma vez no BD.
Por quê Dados populares guardados no Redis ou similar expiram ao mesmo tempo → Efeito As requisições que tentam recriar os mesmos dados caem todas de uma vez no BD → Na tela Com o BD sobrecarregado, vários recursos ficam lentos ou param, um atrás do outro
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento) · Também envolvidos Infraestrutura de banco de dados (Equipe de infraestrutura)
O que fazer (Equipe de desenvolvimento)
Espalhar aleatoriamente os horários de expiração, deixar só uma requisição atualizar enquanto as demais usam o valor antigo.
O que fazer (Equipe de infraestrutura)
Configurar réplica e failover automático para o cache não esvaziar por inteiro quando o Redis reinicia ou falha, verificar se o BD tem folga para aguentar mesmo com o cache vazio.
No gráfico
Picos em intervalos regulares · Taxa de acerto do cache, queries por segundo no BD
Onde olhar
Sobrepor às queries por segundo do BD os valores keyspace_hits e keyspace_misses (taxa de acerto), expired_keys e o reinício (uptime_in_seconds) do INFO do Redis, e contar quantas cópias da mesma query rodam ao mesmo tempo no BD nesse instante (SHOW PROCESSLIST no MySQL, pg_stat_activity no PostgreSQL)
Confirma se
No instante em que os cache misses disparam, as queries do BD disparam junto, e a maior parte das queries simultâneas é a mesma query lendo os mesmos dados. Coincide com o ciclo de expiração de uma chave popular ou com um reinício do Redis
Descarta se
Cache misses normais, mas só as queries do BD aumentam: avalanche de logins (db-login-storm) ou jobs em lote (db-batch)
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Saiba mais
O mesmo acontece quando o Redis reinicia ou falha e o cache esvazia por inteiro. Quanto mais a arquitetura confia no cache e mantém o BD pequeno, maior o risco.
Fontes
Scaling Memcache at Facebook (NSDI '13)USENIX Quando uma chave muito usada é invalidada, muitas leituras caem no BD (thundering herd); evitado com leases (só um cliente atualiza) e devolução do valor antigo; clusters com cache vazio são aquecidos à parte
Optimal Probabilistic Cache Stampede PreventionVLDB Endowment Quando um item popular expira, várias requisições o recriam ao mesmo tempo (cache stampede); evitado atualizando de forma probabilística antes da expiração
INFORedis keyspace_hits e keyspace_misses (buscas de chave com sucesso e com falha), expired_keys (chaves expiradas), uptime_in_seconds (tempo desde a inicialização)
SHOW PROCESSLIST StatementMySQL Comando em execução (Info) e tempo no estado atual (Time, em segundos) de cada sessão