Данные продолжают очищаться в Redis, работающем в Docker.

Вопрос или проблема

У меня Redis работает в Docker, запущенный с командой

docker run -d –restart unless-stopped -p 6379:6379 redis/redis-stack-server:latest

Однако кажется, что все данные внутри Redis (включая индексы) удаляются/очищаются примерно каждые 30 минут. Я не знаю, почему это происходит. Может быть, это связано с тем, что VPS, на котором запущен Docker, очень ограничен в ресурсах? Мой VPS имеет 1 ядро vcpu, 1 ГБ оперативной памяти и своп, а также 20 ГБ хранилища. Моя ОС – Ubuntu 22.04. Провайдер VPS – RackNerd, если это имеет значение (потому что ранее я запускал точно такой же Docker-Redis на VPS с той же спецификацией от OVH без проблем).

Кстати, я запускаю Redis в Docker, потому что хочу использовать функциональность Redisearch.

Вот логи Docker:

root@racknerd-d76c238:~# docker logs b4bb752bcda8
8:C 08 Jan 2025 04:51:49.757 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
8:C 08 Jan 2025 04:51:49.759 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8:C 08 Jan 2025 04:51:49.759 * Redis version=7.4.1, bits=64, commit=00000000, modified=0, pid=8, just started
8:C 08 Jan 2025 04:51:49.759 * Configuration loaded
8:M 08 Jan 2025 04:51:49.761 * Increased maximum number of open files to 10032 (it was originally set to 1024).
8:M 08 Jan 2025 04:51:49.761 * monotonic clock: POSIX clock_gettime
8:M 08 Jan 2025 04:51:49.766 * Running mode=standalone, port=6379.
8:M 08 Jan 2025 04:51:49.768 * Module 'RedisCompat' loaded from /opt/redis-stack/lib/rediscompat.so
8:M 08 Jan 2025 04:51:49.790 * <search> Redis version found by RedisSearch : 7.4.1 - oss
8:M 08 Jan 2025 04:51:49.790 * <search> RediSearch version 2.10.5 (Git=2.10-e2f2                                                                    8a9)
8:M 08 Jan 2025 04:51:49.791 * <search> Low level api version 1 initialized successfully
8:M 08 Jan 2025 04:51:49.791 * <search> gc: ON, prefix min length: 2, min word length to stem: 4, prefix max expansions: 200, query timeout (ms): 500, timeout policy: return, cursor read size: 1000, cursor max idle (ms): 300000, max doctable size: 1000000, max number of search results:  10000,
8:M 08 Jan 2025 04:51:49.791 * <search> Initialized thread pools!
8:M 08 Jan 2025 04:51:49.793 * <search> Enabled role change notification
8:M 08 Jan 2025 04:51:49.793 * Module 'search' loaded from /opt/redis-stack/lib/redisearch.so
8:M 08 Jan 2025 04:51:49.804 * <timeseries> RedisTimeSeries version 11202, git_sha=5643fd4d6fcb1e9cf084fb2deb9285b08f4a6672
8:M 08 Jan 2025 04:51:49.805 * <timeseries> Redis version found by RedisTimeSeries : 7.4.1 - oss
8:M 08 Jan 2025 04:51:49.805 * <timeseries> loaded default CHUNK_SIZE_BYTES policy: 4096
8:M 08 Jan 2025 04:51:49.805 * <timeseries> loaded server DUPLICATE_POLICY: block
8:M 08 Jan 2025 04:51:49.805 * <timeseries> loaded default IGNORE_MAX_TIME_DIFF:0
8:M 08 Jan 2025 04:51:49.805 * <timeseries> loaded default IGNORE_MAX_VAL_DIFF:0.000000
8:M 08 Jan 2025 04:51:49.805 * <timeseries> Setting default series ENCODING to:compressed
8:M 08 Jan 2025 04:51:49.806 * <timeseries> Detected redis oss
8:M 08 Jan 2025 04:51:49.806 * Module 'timeseries' loaded from /opt/redis-stack/lib/redistimeseries.so
8:M 08 Jan 2025 04:51:49.816 * <ReJSON> Created new data type 'ReJSON-RL'
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> version: 20803 git sha: unknown branch:unknown
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> Exported RedisJSON_V1 API
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> Exported RedisJSON_V2 API
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> Exported RedisJSON_V3 API
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> Exported RedisJSON_V4 API
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> Exported RedisJSON_V5 API
8:M 08 Jan 2025 04:51:49.819 * <ReJSON> Enabled diskless replication
8:M 08 Jan 2025 04:51:49.819 * Module 'ReJSON' loaded from /opt/redis-stack/lib/rejson.so
8:M 08 Jan 2025 04:51:49.819 * <search> Acquired RedisJSON_V5 API
8:M 08 Jan 2025 04:51:49.822 * <bf> RedisBloom version 2.8.2 (Git=unknown)
8:M 08 Jan 2025 04:51:49.823 * Module 'bf' loaded from /opt/redis-stack/lib/redi                                                                    sbloom.so
8:M 08 Jan 2025 04:51:49.832 * <redisgears_2> Created new data type 'GearsType'
8:M 08 Jan 2025 04:51:49.835 * <redisgears_2> Detected redis oss
8:M 08 Jan 2025 04:51:49.838 # <redisgears_2> could not initialize RedisAI_InitError    
8:M 08 Jan 2025 04:51:49.838 * <redisgears_2> Failed loading RedisAI API.
8:M 08 Jan 2025 04:51:49.838 * <redisgears_2> RedisGears v2.0.20, sha="9b737886bf825fe29ddc2f8da81f73cbe0b4e858", build_type="release", built_for="Linux-ubuntu2                                                                    2.04.x86_64", redis_version:'7.4.1', enterprise:'false'.
8:M 08 Jan 2025 04:51:49.881 * <redisgears_2> Registered backend: js.
8:M 08 Jan 2025 04:51:49.890 * Module 'redisgears_2' loaded from /opt/redis-stack/lib/redisgears.so
8:M 08 Jan 2025 04:51:49.891 * Server initialized
8:M 08 Jan 2025 04:51:49.892 * Готовы принимать tcp соединения
8:M 08 Jan 2025 05:04:19.697 * DB saved on disk
8:M 08 Jan 2025 05:04:20.167 * <redisgears_2> Got a flush started event
8:M 08 Jan 2025 05:04:20.172 * DB saved on disk
8:M 08 Jan 2025 05:04:21.850 * DB saved on disk
8:M 08 Jan 2025 05:04:22.318 * DB saved on disk
8:M 08 Jan 2025 05:04:22.565 * <redisgears_2> Got a flush started event
8:M 08 Jan 2025 05:04:22.568 * DB saved on disk
8:M 08 Jan 2025 05:04:24.255 * DB saved on disk
8:M 08 Jan 2025 05:04:24.965 * DB saved on disk
8:M 08 Jan 2025 05:11:27.270 * <module> Scanning index idx:delivery in background
8:M 08 Jan 2025 05:11:27.270 * <module> Scanning index idx:delivery in background: done (scanned=0)
8:M 08 Jan 2025 05:11:27.270 * <module> Scanning index idx:ehailing in background
8:M 08 Jan 2025 05:11:27.271 * <module> Scanning index idx:ehailing in background: done (scanned=0)
8:M 08 Jan 2025 05:11:27.271 * <module> Scanning index idx:product in background
8:M 08 Jan 2025 05:11:27.271 * <module> Scanning index idx:product in background: done (scanned=0)
8:M 08 Jan 2025 05:46:37.355 * DB saved on disk
8:M 08 Jan 2025 05:46:37.746 * <redisgears_2> Got a flush started event
8:M 08 Jan 2025 05:46:37.750 * DB saved on disk
8:M 08 Jan 2025 05:46:39.517 * DB saved on disk
8:M 08 Jan 2025 05:46:39.910 * DB saved on disk
8:M 08 Jan 2025 05:46:40.104 * <redisgears_2> Got a flush started event
8:M 08 Jan 2025 05:46:40.107 * DB saved on disk
8:M 08 Jan 2025 05:46:41.466 * DB saved on disk
8:M 08 Jan 2025 05:46:42.050 * DB saved on disk
8:M 08 Jan 2025 06:21:30.817 * <module> Scanning index idx:business in background
8:M 08 Jan 2025 06:21:30.822 * <module> Scanning index idx:business in background: done (scanned=0)
8:M 08 Jan 2025 06:21:30.823 * <module> Scanning index idx:delivery in background
8:M 08 Jan 2025 06:21:30.825 * <module> Scanning index idx:delivery in background: done (scanned=0)
8:M 08 Jan 2025 06:21:30.826 * <module> Scanning index idx:ehailing in background
8:M 08 Jan 2025 06:21:30.827 * <module> Scanning index idx:ehailing in background: done (scanned=0)
8:M 08 Jan 2025 06:21:30.828 * <module> Scanning index idx:product in background
8:M 08 Jan 2025 06:21:30.831 * <module> Scanning index idx:product in background: done (scanned=0)
8:M 08 Jan 2025 06:46:43.095 * 1 changes in 3600 seconds. Saving...
8:M 08 Jan 2025 06:46:43.105 * Background saving started by pid 29
29:C 08 Jan 2025 06:46:43.123 * DB saved on disk
29:C 08 Jan 2025 06:46:43.124 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
8:M 08 Jan 2025 06:46:43.207 * Background saving terminated with success

Ответ или решение

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

Проблема: Потеря данных в Redis в Docker

Ваша конфигурация запуска Docker команды выглядит следующим образом:

docker run -d --restart unless-stopped -p 6379:6379 redis/redis-stack-server:latest

Однако данные Redis очищаются через каждые 30 минут, и вы не уверены в причине. Обратите внимание на следующее:

  • Ограниченные ресурсы VPS: У вас есть 1 ядро vCPU и 1 ГБ оперативной памяти. Это может быть недостаточным для работы Redis c дополнительными модулями (Redisearch, ReJSON и другими), которые вы используете. Убедитесь, что на машине достаточно ресурсов для запуска всех необходимых служб.
  • Перезагрузка контейнера: Проверьте, не происходит ли спонтанная перезагрузка контейнера, которая выглядит как очистка данных. Это можно сделать, отследив uptime контейнера через docker ps.
  • Настройки RDB и AOF: Проверьте конфигурацию Redis, касающуюся механизма сохранения данных. Логи показывают, что происходит сохранение БД, но из них видно, что также формируются события flush, которые могут удалять данные. Убедитесь, что это поведение не вызвано неожиданными конфигурациями или командами.
  • Конфигурация памяти: Логи Redis предупреждают о проблеме с “Memory overcommit”. На вашей системе не включена опция vm.overcommit_memory=1, что может препятствовать нормальной работе Redis. Даже если у вас нет проблемы с нехваткой памяти, лучше включить эту настройку, как рекомендовано в логах.
  • Docker volumes: Проверьте, используете ли вы правильные Docker volumes для долговременного хранения данных. Без должной точности в монтировании volumes данные могут быть утеряны при перезагрузке контейнера.

Рекомендации:

  1. Добавьте настройку vm.overcommit_memory=1 в вашей системе и выполните команду sysctl vm.overcommit_memory=1. Это позволит избежать неожиданных проблем с функцией сохранения данных в Redis.
  2. Контролируйте использование ресурсов в вашей системе. Возможно, стоит мониторить использование CPU и RAM, и при необходимости выбрать более мощный VPS.
  3. Убедитесь, что у вас корректно настроен механизм постоянной записи данных (скажем, AOF), если это требуется.
  4. Проверьте, записываются ли данные в Redis постоянно и нет ли команд flushall или других, которые вызывают очистку.
  5. Используйте уведомления Docker о событиях, таких как перезапуски или ошибки, что даст дополнительную диагностику причины сброса данных.

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

Оцените материал
Добавить комментарий

Капча загружается...