RDB — снимки данных

Предпосылки: Что такое Redis, процессы и fork, файловые системы.

Lua-скрипты | AOF

Данные в памяти не переживают рестарт

Redis хранит всё в RAM. При остановке, перезагрузке или падении сервера все данные теряются. RDB (Redis Database Backup) — первый из двух механизмов персистентности. Он периодически сохраняет полный снимок всех данных в компактный бинарный файл dump.rdb.

Как работает BGSAVE

Команда BGSAVE (или автоматический триггер по расписанию) запускает сохранение снимка. Redis вызывает fork() (механизм), создавая дочерний процесс. Дочерний процесс получает копию адресного пространства родительского и последовательно записывает все данные в файл. Родительский процесс продолжает обрабатывать команды.

Дочерний процесс записывает данные во временный файл, а по завершении атомарно заменяет старый dump.rdb через rename(). Это гарантирует, что на диске всегда находится целостный снимок — даже если Redis упадёт во время сохранения, старый dump.rdb останется нетронутым.

Благодаря copy-on-write (CoW) операционной системы fork() не копирует всю память физически. Дочерний и родительский процесс разделяют страницы памяти, пока один из них не изменит данные. Когда родительский процесс изменяет данные (обрабатывая новые команды), ОС создаёт физическую копию затронутой страницы (~4 КБ) — дочерний процесс продолжает видеть исходные данные. На практике это означает, что во время BGSAVE Redis потребляет дополнительную память пропорционально объёму изменений, а не полному объёму данных. Если за время сохранения изменилось 10% данных — потребление вырастет примерно на 10%.

Существует и синхронный вариант — команда SAVE. Она записывает снимок в том же процессе, блокируя Redis на всё время сохранения: ни одна команда не будет обработана, пока файл не записан. На production SAVE не используют; она полезна только при отладке или контролируемом shutdown.

Автоматическое сохранение

Ручной вызов BGSAVE непрактичен для production — Redis умеет запускать снимки автоматически. Расписание настраивается через директивы save в конфигурации:

save 900 1        -- снимок если 1+ ключ изменился за 15 минут
save 300 10       -- снимок если 10+ ключей за 5 минут
save 60 10000     -- снимок если 10000+ ключей за 1 минуту

Redis проверяет условия в фоновом цикле и запускает BGSAVE, когда хотя бы одно условие выполнено. save "" отключает автоматическое сохранение.

Компактность и скорость загрузки

Расписание определяет частоту снимков, но не влияет на формат файла. dump.rdb компактен: данные сериализованы в бинарном формате с LZF-сжатием (быстрый алгоритм с низким потреблением CPU; опционально), файл защищён CRC64-чексуммой — повреждение легко обнаружить. Загрузка при старте быстрая: Redis десериализует файл в память. Для 10 ГБ простых данных (строки, маленькие хеши) загрузка занимает секунды; для сложных структур (большие sorted set, stream) — дольше.

Окно потери данных

Компактность и быстрая загрузка имеют цену: между снимками данные существуют только в RAM. Если Redis упал через 10 минут после последнего снимка, все изменения за эти 10 минут потеряны. Размер окна определяется расписанием save — от минуты до 15 минут в стандартной конфигурации.

Серьёзность потери зависит от данных. Потеря кеша — пустяк: приложение заново загрузит данные из PostgreSQL, пользователь заметит лишь кратковременное замедление. Потеря сессий — пользователи разлогинятся, неприятно, но восстановимо. Потеря счётчиков rate limiting — на минуты откроется окно без ограничений. Для задач, где потеря минут данных допустима, RDB достаточно. Для минимизации окна Redis предоставляет AOF — журнал всех команд записи, который фиксирует каждую операцию.

RDB в связке с AOF

Даже когда AOF включён и обеспечивает минимальное окно потери, RDB остаётся полезен. Скопировать dump.rdb на другой сервер и запустить Redis — полный клон за секунды, тогда как AOF-файл того же объёма данных может быть в разы больше и требует «проигрывания» всех команд при загрузке. При первичной синхронизации мастер генерирует RDB и отправляет его реплике — подробнее в разделе репликации. Один файл с чексуммой удобно копировать в S3 как бэкап.

Sources


Lua-скрипты | AOF