Запись в Redis отказывает: узел работает как копия
Копия по умолчанию доступна только для чтения. Если приложение пишет на такой узел, оно получает отказ при исправной службе. Причина обычно не в настройках приложения, а в том, что узел остался копией после переключения или перезапуска.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Узел остался копией после переключения
После сбоя и переключения прежний главный узел возвращается копией. Запись на него отклоняется.
-
Роль задана в настройках и восстанавливается при перезапуске
Запись о роли копии в файле настроек возвращает узел в эту роль при каждом запуске, даже после ручного перевода.
-
Приложение обращается ко всем узлам без учёта роли
При нескольких адресах в настройках приложения запись может уйти на копию случайно.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Роль узла и состояние копирования.
redis-cli info replication 2>/dev/null | head -10Задана ли роль копии в настройках.
sudo grep -iE "^(replicaof|slaveof)" /etc/redis/redis.confСообщения службы о роли и копировании.
journalctl -u redis-server -n 20 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- После сбоя и переключения прежний главный узел возвращается копией. Запись на него отклоняется.
- Как проверить
-
Посмотрите роль узла.
redis-cli info replication 2>/dev/null | head -8
- Как исправить
- Направьте запись на действующий главный узел или переведите этот узел в главную роль осознанно. Автоматическое переключение для этого и существует.
- Почему происходит
- Запись о роли копии в файле настроек возвращает узел в эту роль при каждом запуске, даже после ручного перевода.
- Как проверить
-
Посмотрите настройки роли.
sudo grep -iE "^(replicaof|slaveof|replica-read-only)" /etc/redis/redis.conf 2>/dev/null
- Как исправить
- Уберите запись о роли из файла настроек, если узел должен быть главным. Ручной перевод роли без правки настроек не переживает перезапуск.
- Почему происходит
- При нескольких адресах в настройках приложения запись может уйти на копию случайно.
- Как проверить
-
Посмотрите, куда пишет приложение.
journalctl -u myapp.service -n 20 --no-pager | grep -iE "READONLY|redis"
- Как исправить
- Используйте средство определения главного узла или направляйте запись только на его адрес. Перебор узлов без учёта роли даёт плавающие отказы.
Пример вывода
Приложение пишет на узел в роли копии. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp[11700]: redis: READONLY You can't write against a read only replica.
$ redis-cli info replication | head -4
# Replication
role:slave
master_host:10.0.0.5
master_link_status:up
Связанные ошибки
- Redis: служба сразу останавливается из-за daemonize yes Redis уходит в фон сам, systemd теряет процесс и считает службу отработавшей. Как настроить правильно.
- MySQL: репликация остановилась с ошибкой Подписчик перестал применять изменения: конфликт данных, пропущенная транзакция, недоступный основной сервер.
- MongoDB: NotWritablePrimary при записи Запись отклоняется: узел не является основным в наборе репликации. Разбор выборов и состояния узлов.
- База временных рядов не запускается после обновления Обновление сменило пользователя или расположение данных: служба не может открыть свой каталог.
- База не запускается после переноса каталога данных Перенос данных на другой раздел не работает: профиль защиты и настройки службы указывают на прежний путь.
- Приложение ломается при работе через пул соединений Запросы отказывают после перехода на пул: режим пула не поддерживает подготовленные запросы или временные таблицы.
- Приложение не стартует: блокировка миграций базы Служба зависает или падает на применении миграций: осталась блокировка после прерванного запуска.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
Где встречается чаще всего
Источники
- Документация Redis: копирование
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено записью на узел в роли копии.