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

Анатомия игровых лагов › L12 База данных

Cache stampede Cache stampede / thundering herd

ID причины db-cache-stampede · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Когда кэш популярных данных истекает одновременно, тысячи запросов разом идут в БД.

Почему Популярные данные в 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 перезапускается или из-за сбоя кэш пустеет целиком. Особенно опасно, если в расчёте на кэш БД сделали маломощной.

Источники

  1. Scaling Memcache at Facebook (NSDI '13) USENIX
    Когда инвалидируется часто используемый ключ, множество чтений устремляется в БД (thundering herd). Это предотвращают арендой (lease, обновляет только один клиент) и выдачей старого значения, кластер с пустым кэшем прогревают отдельно
  2. Optimal Probabilistic Cache Stampede Prevention VLDB Endowment
    Когда истекает популярный элемент, его одновременно пересоздают многие запросы (cache stampede). Это предотвращают вероятностным досрочным обновлением до истечения
  3. High availability with Redis Sentinel Redis
    Автоматическое переключение: при отказе основного сервера реплика повышается до основной
  4. INFO Redis
    keyspace_hits и keyspace_misses (число успешных и неуспешных поисков ключа), expired_keys (число истёкших ключей), uptime_in_seconds (время с момента запуска)
  5. SHOW PROCESSLIST Statement MySQL
    Для каждой сессии выполняемый оператор (Info) и время в текущем состоянии (Time, в секундах)
  6. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_activity: для каждой сессии выполняемый сейчас запрос (query)

Смотрите также

Тот же слой: L12 База данных

Причины с тем же симптомом (Задержка ввода) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами