Redis – это хранилище данных на основе памяти, поэтому оно по своей природе всплывающее. Когда сервер Redis перезагружается, все данные могут исчезнуть, и для этого Redis предлагает два варианта сохранения данных: RDB (снимок базы данных Redis) и AOF (файл только для добавления). В этом посте мы рассмотрим особенности и различия двух методов, а также способы их настройки и плюсы и минусы каждого.

1. RDB (снимок базы данных Redis)

Метод RDB заключается в периодическом сохранении данных, хранящихся в памяти Redis, на диск в виде снимка. Redis создает файл RDB в соответствии с установленными интервалами, и с помощью этого файла можно восстановить данные при перезагрузке сервера.

Основные характеристики RDB

  • Период хранения: вы можете установить интервал для сохранения данных на диск через опцию save в файле redis.conf. Например, save 60 1000 создаст снимок, если меняется более 1000 ключей каждые 60 секунд.
save 60 1000
  • Местоположение файла: файл RDB по умолчанию сохраняется в директории, указанной в dir, с базовым путем /var/lib/redis и именем файла dump.rdb.
dir /var/lib/redis/
dbfilename dump.rdb

Преимущества RDB

  • Высокая производительность: метод RDB не оказывает значительного влияния на производительность Redis, и если интервал создания снимка большой, ресурсы CPU также не истощаются.
  • Небольшой размер файла: поскольку данные периодически записываются в виде снимков, размер файла относительно мал, и управление резервным копированием удобно.

Недостатки RDB

  • Вероятность потери данных: так как метод RDB сохраняет данные периодически, при внезапной остановке Redis последние данные после последнего снимка могут быть утеряны.
  • Скорость восстановления: RDB сохраняет все данные с помощью одного снимка, поэтому восстановление большого объема данных может занять больше времени.

Подходящие сценарии использования RDB

RDB хорошо подходит для случаев, когда можно периодически резервировать данные, такие как кэшированные данные. Это подходит в случаях, когда необходимо периодическое резервирование данных, а не для реальных рабочих очередей, и позволяет легко обеспечить сохранность данных при поддержании производительности сервера Redis.

2. AOF (файл только для добавления)

AOF обеспечивает постоянное сохранение данных, записывая все операции записи Redis последовательно на диск. Файл AOF регистрирует все изменения данных, поэтому даже при перезагрузке сервера Redis можно совершенно восстановить данные через файл AOF.

Основные характеристики AOF

  • Способ записи команд: файл AOF записывает все команды изменения данных. Так как каждое время, когда происходит команда записи, она сохраняется на диск, все записи изменений данных сохраняются.
  • Местоположение и имя файла: файл AOF по умолчанию сохраняется с именем, указанным в опции appendfilename. Значение по умолчанию appendonly.aof, и он сохраняется в директории, указанной в настройке dir.
dir /var/lib/redis/
appendonly yes
appendfilename appendonly.aof
  • Период синхронизации: вы можете установить период записи данных на диск с помощью опции appendfsync.
appendfsync everysec  # синхронизация каждую секунду

Преимущества AOF

  • Сохранность данных: так как все операции записи записываются на диск, даже при внезапной остановке сервера данные могут быть восстановлены до последнего записанного состояния.
  • Чтения не записываются: поскольку AOF записывает только команды изменений данных, ненужные команды чтения не включаются в файл, что экономит место для хранения.
Инфографика по вариантам постоянного хранения данных в Redis

Недостатки AOF

  • Возможное снижение производительности: поскольку все операции записи записываются на диск, производительность может снизиться, особенно если appendfsync установлен на always.
  • Увеличение размера файла: если изменения данных происходят часто, размер файла AOF может значительно увеличиться. Для решения этой проблемы Redis может использовать команду BGREWRITEAOF для сжатия файла AOF.

Подходящие сценарии использования AOF

AOF полезен для очередей заданий или приложений, где важна сохранность данных. В случаях, когда важна сохранность данных, можно использовать настройки периодической синхронизации (everysec) для достижения сбалансированного сочетания производительности и сохранности данных.

3. Одновременное использование RDB и AOF

В Redis можно одновременно использовать методы RDB и AOF, чтобы сбалансировать сохранность данных и производительность. Если оба метода включены, Redis предпочитает файл AOF для восстановления.

  • RDB: быстро и удобно сохраняет данные, предлагая основной резервный вариант с помощью метода снимков.
  • AOF: записывая все операции записи, повышает сохранность данных, минимизируя вероятность их потери.

4. Пример настройки Redis

Ниже приведен пример настройки, использующей одновременно RDB и AOF для поддержания соответствующей производительности и сохранности данных.

# Базовая директория и настройки файла Redis
dir /var/lib/redis/
dbfilename dump.rdb
appendfilename appendonly.aof

# Настройка снимков RDB (сохранять снимок, если изменяется более 1000 ключей каждые 60 секунд)
save 60 1000

# Настройка AOF
appendonly yes
appendfsync everysec  # синхронизация на диск каждую секунду

# Настройка перезаписи файла AOF (автоматическая перезапись, если размер файла превышает 64 МБ при увеличении на 100%)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

В заключение

В этом посте мы рассмотрели два метода сохранения данных Redis: RDB и AOF. У каждого метода есть свои отличия в сохранности и производительности, поэтому важно выбирать подходящий метод в зависимости от особенностей приложения. В следующем посте мы обсудим управление памятью Redis и оптимизацию производительности, а также предложим способы эффективного использования памяти Redis.