Redis предоставляет способ постоянного сохранения данных на диск с помощью AOF (Append-Only File). Однако со временем, когда размер файла AOF становится больше, это может привести к снижению производительности и проблемам с дисковым пространством. Чтобы решить эту проблему, Redis предлагает функцию AOF Rewrite (перезапись, компрессия). В этой статье мы подробно рассмотрим, что такое AOF Rewrite, как он работает, и как его настроить.


1. Что такое AOF (Append-Only File)? Почему нужна перезапись?

Redis использует файл AOF для постоянного сохранения данных, записывая все операции записи последовательно. Например, когда выполняется команда SET key value, она записывается в файл AOF. Это позволяет восстановить данные даже после перезапуска сервера Redis.

Однако со временем происходит увеличение файла из-за дублирующихся команд для одной и той же ключа, что делает его размер больше и увеличивает время восстановления.

Чтобы решить эту проблему, предоставляется AOF Rewrite (компрессия, очистка).


2. Что такое AOF Rewrite?

Redis AOF Rewrite Infographic

AOF Rewrite - это процесс замены существующего файла appendonly.aof на оптимизированный новый файл. Новый файл создается с удалением ненужных команд, уменьшая размер. В этой концепции ключевой момент - это замена существующего файла только после оптимизации. Эта фраза синтезирует работу перезаписи.

📌 Как работает AOF Rewrite

  1. Redis не редактирует существующий AOF файл напрямую, а создает новый AOF файл.
  2. Новый файл будет содержать только необходимые команды, отражающие только актуальное состояние.
  3. Например, если существующий AOF файл выглядит следующим образом:
   SET key1 "hello"
   SET key1 "world"
   SET key1 "final"

После AOF Rewrite он будет оптимизирован следующим образом:

SET key1 "final"

То есть, после завершения нового файла appendonly.aof.tmp существующий файл удаляется и заменяется новым (tmp файл заменяет aof файл).


3. Как настроить AOF Rewrite

✅ Автоматическая настройка AOF Rewrite

Redis можно настроить для автоматического выполнения AOF Rewrite. В redis.conf необходимо установить следующее:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
  • auto-aof-rewrite-percentage 100: Если размер файла после последней AOF Rewrite увеличивается на 100% (в 2 раза) или больше, выполняется перезапись
  • auto-aof-rewrite-min-size 64mb: AOF Rewrite выполняется только если файл AOF превышает 64MB

Таким образом, если размер существующего AOF файла составляет 50MB и затем увеличивается до 100MB, AOF Rewrite выполнится автоматически.

Эти два параметра стоит настраивать вместе. Если не установить значение auto-aof-rewrite-min-size, это может привести к ненужным перезаписям, когда, например, файл из 20MB увеличится до 40MB. Установив auto-aof-rewrite-min-size, можно гарантировать выполнение перезаписи только после достижения определенного размера.

Таким образом, если размер существующего AOF файла составляет 50MB и затем увеличивается до 100MB, AOF Rewrite выполнится автоматически.

✅ Вручную запустить AOF Rewrite

Выполнив следующую команду, Redis немедленно выполнит AOF Rewrite.

redis-cli BGREWRITEAOF

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


4. Результаты AOF Rewrite

Когда выполняется AOF Rewrite, в каталоге данных Redis (/var/lib/redis и т.д.) создается следующий файл.

ls /var/lib/redis

Пример вывода:

appendonly.aof
appendonly.aof.tmp  # временный файл, созданный во время перезаписи
  • appendonly.aof.tmp: Новый оптимизированный AOF файл, созданный во время AOF Rewrite.
  • appendonly.aof: После завершения перезаписи старый файл удаляется и заменяется новым файлом.

🚨 AOF Rewrite не сжимает существующий AOF файл, а создает новый AOF файл и заменяет существующий.


5. Когда использовать AOF Rewrite?

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

Когда вы хотите ускорить процесс восстановления при перезапуске Redis - Если файл AOF велик, Redis должен исполнить все команды для восстановлении данных при перезапуске, что занимает много времени. - Выполнение AOF Rewrite уменьшит размер файла и ускорит восстановление.

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


6. Различия между RDB снимками и AOF Rewrite

Сравнительный пункт AOF (Append-Only File) RDB (Redis Database)
Способ сохранения Записывать все операции записи Дампить все данные с определенными интервалами
Скорость восстановления Медленно (необходимо выполнить все команды) Быстро (восстановление из бинарного дампа)
Вероятность потери данных Низкая (зависит от настройки fsync) Есть (зависит от периода снимка)
Размер файла Большой (записываются все операции) Маленький (сохраняется лишь актуальное состояние)
Влияние на производительность Высокое (все операции записываются в лог) Низкое (выполняется периодический дамп)
Подходящее использование Когда требуется высокая надежность Когда необходимо быстрое восстановление

👉 В среде эксплуатации Redis обычно настраивают AOF + RDB для достижения оптимальной производительности и надежности.


7. Заключение и резюме

  • AOF Rewrite в Redis выполняется для уменьшения размера AOF файла и улучшения скорости восстановления.
  • Он не изменяет существующий AOF файл напрямую, а создает новый оптимизированный AOF файл, заменяя старый файл.
  • При правильной настройке auto-aof-rewrite-percentage и auto-aof-rewrite-min-size AOF Rewrite может выполняться автоматически, эффективно управляя производительностью и объемом хранения.
  • Использование вместе с RDB позволяет оптимизировать надежность и производительность Redis.

📌 Оптимизируйте производительность, правильно используя AOF Rewrite в Redis! 🚀

Вы можете найти больше статей о настройке redis, ищите redis в правом верхнем углу.

Если вам нужно освежить ваше понимание концепций RDB и AOF, также рекомендуется прочитать следующую статью.

Redis Часть 2: Опции сохранения данных Redis - RDB против AOF