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

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

Потеря прогресса из-за редких сохранений Periodic save window

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

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

Если ради снижения нагрузки сохранять прогресс раз в несколько минут, то при падении сервера в промежутке прогресс пропадает.

Почему Состояние персонажа сохраняется раз в несколько минут → Следствие В промежутке сервер падает или происходит сбой → На экране После перезахода персонаж в состоянии нескольких минут назад (роллбэк)

Симптомы
Съеденные действия / роллбэк
Факторы
Потери
У кого
Весь сервер, Одна локация или канал
Когда
Изредка, случайно
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД
Команда разработки: задачи
Важные события (обмен, редкая добыча) сохранять сразу, вести журнал изменений.
Команда инфраструктуры: задачи
Проверить, хватит ли у БД запаса IOPS и CPU на рост записи при сокращении интервала сохранения.
На графике
Массовый обрыв соединений · число подключений, число жалоб на роллбэк
Где смотреть
Сопоставить время падения или сбоя и время последнего сохранения персонажей, на которых пожаловались из-за роллбэка (лог сохранений игрового сервера или столбец времени изменения в БД)
Подтверждает
Момент, к которому вернулся персонаж, совпадает с последним сохранением перед падением, а потерянное время меньше интервала сохранения
Опровергает
Если в логе игрового сервера сохранение отмечено как завершённое, а прогресс всё равно вернулся назад, это потеря данных при переключении БД на резерв (db-failover) или старое значение, прочитанное с реплики (db-replica-lag)
Чем проверить
Нужны логи и метрики игрового сервера или клиента

Источники

  1. Asynchronous Commit (PostgreSQL Documentation) PostgreSQL
    Если накапливать записи и сбрасывать их позже, производительность растёт, но при сбое могут пропасть самые последние транзакции (тот же компромисс)
  2. Redis persistence Redis
    Если делать снапшоты RDB раз в несколько минут, при аварийном завершении нужно быть готовым потерять данные за последние несколько минут

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

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

Причины с тем же симптомом (Съеденные действия / роллбэк) на других слоях

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