Программа курса

Модуль 04 / Урок 16 из 27

RDB: снапшоты

Теория и практика

RDB — это бинарный снимок всего датасета на момент времени: один компактный файл, идеально подходящий для бэкапов. Плата за это — окно потери данных между снимками.

Настройка

# redis.conf: правило "N изменений за M секунд → снимок"
save 900 1        # ≥1 изменения за 15 минут
save 300 10       # ≥10 за 5 минут
save 60 10000     # ≥10000 за минуту
dbfilename dump.rdb
dir /var/lib/redis   # куда писать

# Ручной снимок (не блокирует клиентов)
BGSAVE
# Синхронный SAVE — только для отладки: блокирует сервер!

Изменённые команды срабатываний: INFO persistence показывает rdb_last_save_time, rdb_changes_since_last_save, rdb_last_bgsave_status (должен быть ok) и rdb_last_bgsave_time_sec.

Как снимок делается: fork + copy-on-write

  1. Redis делает fork(): появляется дочерний процесс с копией адресного пространства — но страницы памяти общие, копирования ещё не было;
  2. ребёнок сериализует датасет во временный файл и атомарно переименовывает его в dump.rdb;
  3. родитель тем временем продолжает обслуживать команды; при записи в страницу ОС создаёт её копию (copy-on-write) — родитель живёт дальше, ребёнок видит снимок «как был».
⚠️ Два следствия fork: (1) пауза на fork — копирование таблиц страниц памяти; на 10+ ГБ датасете это десятки–сотни мс (latest_fork_usec); (2) COW-память — при активной записи во время снимка изменённые страницы дублируются: потребление может вырасти до +100% от датасета. Планируйте RAM: used_memory ≤ 50–60% хоста, если BGSAVE частый.

Дисковая hygiene

  • Следите за свободным местом: если диск полон, BGSAVE падает, и снапшоты перестают обновляться молча (алерт на rdb_last_bgsave_status обязателен);
  • в контейнерах монтируйте dir на volume — иначе дамп умирает с контейнером;
  • RDB — точка во времени: бэкап файла сам по себе бессмыслен без регулярности.

Плюсы и минусы

+−
Один компактный файл: бэкапы, копирование между средами, миграции Потеря данных с последнего снимка (минуты)
Быстрый рестарт на больших объёмах (загрузка mmap-подобно) fork-пауза + COW-память на больших датасетах
Минимальная цена на прод-трафик при редких снимках Нельзя «дожать» окно потери до секунд — это работа AOF

Когда RDB достаточно

  • Чистый кеш: потеря = прогрев, не инцидент. Можно даже без персистентности вовсе (save "");
  • Вторичные данные: рейтинги, счётчики, сессии с повторным логином;
  • Как «точка восстановления» в дополнение к AOF (стандартная связка — оба механизма).

Практика

  1. Включите RDB, залейте данные, BGSAVE; посмотрите INFO persistence и найдите dump.rdb в volume.
  2. Убейте контейнер (docker kill), поднимите с тем же volume — проверьте DUMP-выборку и DBSIZE: что вернулось, что потерялось?
  3. Замерьте latest_fork_usec на датасете 100 МБ, 500 МБ, 1 ГБ — постройте зависимость паузы от размера.
  4. Включите stop-writes-on-bgsave-error yes (дефолт) и заполните диск — убедитесь, что записи блокируются, а не теряются молча.
Мини-квиз

1. Почему BGSAVE не блокирует клиентов, а SAVE — да? — BGSAVE делает fork и сериализует ребёнок; SAVE работает в основном потоке.

2. Откуда берётся рост памяти во время BGSAVE? — Copy-on-write: изменённые родителем страницы дублируются ОС.

3. SAVE-правила сработали, а снимка нет. Первая проверка? — INFO persistence → rdb_last_bgsave_status и место на диске.