Вопрос или проблема
Мой Redis не может выполнять фоновое сохранение, в моем журнале много таких записей:
2817:M 23 Nov 2024 11:28:59.938 - БД 0: 27168 ключей (0 волатильных) в 32768 слотах HT.
2817:M 23 Nov 2024 11:28:59.938 . 1 клиент подключен (0 реплик), 13098864 байт в использовании
2817:M 23 Nov 2024 11:29:00.039 * 1 изменение за 3600 секунд. Сохранение...
2817:M 23 Nov 2024 11:29:00.043 * Фоновое сохранение запущено процессом 29696
29696:C 23 Nov 2024 11:29:00.051 - Fork CoW для RDB: текущее 0 МБ, пик 0 МБ, среднее 0 МБ
2817:M 23 Nov 2024 11:29:00.549 # Фоновое сохранение завершено сигналом 31
К сожалению, я не могу получить более подробные журналы об этом (выше с loglevel=debug), так что я действительно не знаю, как это исправить/улучшить.
Я уже настроил свою машину для разрешения перерасхода памяти:
cat /proc/sys/vm/overcommit_memory
1
redis-server -v
Redis server v=7.0.15 sha=00000000:0 malloc=jemalloc-5.3.0 bits=32 build=8fef3e995a542118
Похоже, что Redis иногда может выполнять сохранение:
ls /var/lib/redis -al
total 4104
drwxr-x--- 2 redis redis 4096 Nov 23 11:45 .
drwxr-xr-x 28 root root 4096 Nov 13 10:14 ..
-rw-rw---- 1 redis redis 4193638 Nov 16 09:42 dump.rdb
И во время перезапуска, похоже, это тоже работает:
# systemctl restart redis
# ls /var/lib/redis -al
total 8200
drwxr-x--- 2 redis redis 4096 Nov 23 11:46 .
drwxr-xr-x 28 root root 4096 Nov 13 10:14 ..
-rw-rw---- 1 redis redis 4193638 Nov 16 09:42 dump.rdb
-rw-rw---- 1 redis redis 4194304 Nov 23 11:46 temp-2817.rdb
Но почему он не работает в фоновом режиме?
Ответ или решение
Ваша проблема с фоновым сохранением данных Redis, вызванная сигналом 31, требует детального анализа. Сигнал 31, известный как SIGSYS
, может указывать на проблемы, связанные с системными вызовами, которые не были правильно обработаны. Разберем вашу ситуацию более глубоко.
1. Проблема с сигналом 31
Сигнал 31 обычно возникает из-за того, что процесс пытается выполнить системный вызов, который заблокирован или не поддерживается в текущих условиях. В случае Redis это может быть связано с неправильно настроенными правами доступа, конфигурацией системы или проблемами с памятью.
2. Проверка настроек памяти
Вы уже настроили систему на использование overcommit памяти, что является положительным шагом, однако стоит убедиться, что память действительно доступна для Redis. Проверьте следующие параметры:
- Общий объём доступной памяти:
free -m
- Настройки параметров Linux:
cat /proc/sys/kernel/pid_max
Если система в целом нехватание памяти, Redis может не иметь возможности создать новый процесс для фона.
3. Логи и их анализ
Вы уже настроили уровень логирования на debug
, но стоит также проверить файлы журналов в /var/log/redis/
. Может, там есть дополнительные сообщения об ошибках, которые помогут выяснить причину возникновения сигнала 31.
4. Операционная система и конфигурация
-
Проверьте конфигурацию Redis: Убедитесь, что конфигурация Redis не имеет ошибок, которые приводили бы к сбоям во время фонового сохранения. Обратите внимание на параметры, связанные с сохранением (
save
,dir
,dbfilename
и другие). -
Версия Redis: Обновление до последней стабильной версии Redis может решить проблему, так как в более новых версиях могут быть исправлены возможные ошибки.
5. Проверка прав доступа
Убедитесь, что права доступа к директории /var/lib/redis/
установлены правильно. Пользователь, под которым работает Redis, должен иметь полный доступ к директории и файлам, так как недостаток прав также может вызывать сигналы прерывания.
6. Использование альтернативных методов
Если проблема сохраняется, вы можете попробовать временно переключиться на другой механизм сохранения, например, AOF (Append Only File), чтобы увидеть, сохраняется ли проблема. Это может дать дополнительные подсказки о том, в чем именно заключается проблема с RDB.
Решение проблемы:
- Проверьте память и права доступа.
- Настройте параметры конфигурации Redis.
- Убедитесь, что Redis работает в окружении, свободном от ограничений со стороны ОС.
- Рассмотрите возможность обновления Redis до последней версии.
Устранение вышеописанных аспектов, вероятно, поможет вам справиться с проблемой фонового сохранения. В рамках диагностики рекомендуется также изучить возможность использования инструментов мониторинга, таких как Redis Sentinel или Redis Cluster, для более глубокого анализа состояния системы.
Если проблема останется нерешенной, может потребоваться более глубокий анализ окружения и более содержительная информация о конфигурации системы и Redis.