Когда кэш популярных данных истекает одновременно, тысячи запросов разом идут в БД.
Почему Популярные данные в Redis или другом кэше истекают одновременно → Следствие Запросы, которые заново строят те же данные, разом обрушиваются на БД → На экране БД перегружена, и одна функция за другой начинает тормозить или перестаёт отвечать
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД
Команда разработки: задачи
Разносить время истечения случайным образом, обновлять данные одним запросом, а остальным отдавать старое значение.
Команда инфраструктуры: задачи
Настроить для Redis реплики и автоматическое переключение, чтобы при перезапуске или сбое кэш не опустел целиком, проверить, выдержит ли БД пустой кэш.
На графике
Всплески с постоянным периодом · доля попаданий в кэш, запросов к БД в секунду
Где смотреть
Накладывать keyspace_hits и keyspace_misses (доля попаданий), expired_keys и признак перезапуска (uptime_in_seconds) из Redis INFO на число запросов к БД в секунду и считать, сколько одинаковых запросов одновременно выполняется в БД в этот момент (MySQL SHOW PROCESSLIST, PostgreSQL pg_stat_activity)
Подтверждает
В момент резкого скачка промахов кэша вместе подскакивает число запросов к БД, и большинство одновременных запросов одинаковые и читают одни и те же данные. Совпадает с периодом истечения популярного ключа или с перезапуском Redis
Опровергает
Если промахов кэша столько же, сколько обычно, а растут только запросы к БД, это наплыв входов (db-login-storm) или пакетное задание (db-batch)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
То же самое бывает, когда Redis перезапускается или из-за сбоя кэш пустеет целиком. Особенно опасно, если в расчёте на кэш БД сделали маломощной.
Источники
Scaling Memcache at Facebook (NSDI '13)USENIX Когда инвалидируется часто используемый ключ, множество чтений устремляется в БД (thundering herd). Это предотвращают арендой (lease, обновляет только один клиент) и выдачей старого значения, кластер с пустым кэшем прогревают отдельно
Optimal Probabilistic Cache Stampede PreventionVLDB Endowment Когда истекает популярный элемент, его одновременно пересоздают многие запросы (cache stampede). Это предотвращают вероятностным досрочным обновлением до истечения
INFORedis keyspace_hits и keyspace_misses (число успешных и неуспешных поисков ключа), expired_keys (число истёкших ключей), uptime_in_seconds (время с момента запуска)
SHOW PROCESSLIST StatementMySQL Для каждой сессии выполняемый оператор (Info) и время в текущем состоянии (Time, в секундах)