MISCONF Redis настроен для сохранения снимков RDB



во время записи в Redis (SET foo bar ) Я получаю следующую ошибку:




MISCONF Redis настроен для сохранения снимков RDB, но в настоящее время
не удается сохранить на диске. Команды, которые могут изменить набор данных
нетрудоспособный. Пожалуйста, проверьте журналы Redis для получения подробной информации об ошибке.




в основном я понимаю, что проблема в том, что redis не может сохранить данные на диске, но понятия не имею, как избавиться от проблема.



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

889   18  

18 ответов:

в случае, если вы столкнулись с ошибкой и некоторые важные данные не могут быть отброшены на запущенном экземпляре redis (проблемы с разрешениями для rdb файл или его каталог неправильно, или не хватает места на диске), вы всегда можете перенаправить rdb файл для записи в другом месте.

используя redis-cli, вы можете сделать что-то вроде этого:

CONFIG SET dir /tmp/some/directory/other/than/var
CONFIG SET dbfilename temp.rdb

после этого, вы можете выполнить BGSAVE команда, чтобы убедиться, что данные будут записаны элемент . Убедитесь, что при выполнении INFO,bgsave_in_progress уже 0 (либо операция выполнена успешно или ошибка). После этого вы можете начать резервное копирование сгенерированного rdb файл в безопасном месте.

вы можете остановить его, пытаясь сохранить снимок:

config set stop-writes-on-bgsave-error no

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

могут быть ошибки во время процесса bgsave из-за нехватки памяти. Попробуйте это (из redis background save FAQ)

echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1

слишком кратко об ответе. откройте терминал и введите следующие команды

redis-cli

и теперь типа

config set stop-writes-on-bgsave-error no

в случае, если вы работаете на машине linux, также проверьте права доступа к файлам и папкам базы данных.

БД и путь к нему можно получить через:

на redis-cli:

CONFIG GET dir

CONFIG получить dbfilename

и в командной строке ls -l. Разрешения для каталога должны быть 755, а те для файла должны быть 644. Кроме того, обычно redis-сервер выполняется как пользователь redis, поэтому его также приятно дать пользователю redis право собственности на папки выполняется sudo chown -R redis:redis /path/to/rdb/folder. Это было разработано в ответе здесь.

спасибо всем за проверку проблемы, по-видимому, ошибка была произведена во время bgsave.

для меня, введя config set stop-writes-on-bgsave-error no в оболочке и перезапуск Redis решили проблему.

запустите сервер Redis в каталоге, где Redis имеет права на запись

ответы выше, безусловно, решить вашу проблему, но вот что на самом деле происходит:

папку по умолчанию для хранения и ./ (обозначение текущего каталога). Вы можете проверить это в своем . Поэтому каталог, из которого вы запускаете сервер redis, находится там, где dump.rdb файл будет создан и обновлен.

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

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

чтобы решить эту проблему, необходимо перейти в активную клиентскую среду redis с помощью redis-cli обновить dir ключ и установите его значение для вашего проекта папка или любая папка, в которой не root имеет разрешения на сохранение. Тогда беги BGSAVE, чтобы вызвать создание .

CONFIG SET dir "/hardcoded/path/to/your/project/folder"
BGSAVE

(теперь, если вы нужно сохранить дамп.файл rdb в каталоге, в котором вы запустили сервер, затем вам нужно будет изменить разрешения для каталога, чтобы redis мог писать в него. Вы можете искать stackoverflow для того, как это сделать).

теперь вы должны быть в состоянии выключить сервер redis. Отметим, что мы жестко путь. Жесткое кодирование редко является хорошей практикой, и я настоятельно рекомендую запустить сервер redis из каталога проекта и изменить dir key back to./`.

CONFIG SET dir "./"
BGSAVE

таким образом, когда вам нужен redis для другого проекта, файл дампа будет создан в каталоге вашего текущего проекта, а не в каталоге проекта жестко заданного пути.

эта ошибка возникает из-за сбоя BGSAVE. Во время BGSAVE Redis разветвляет дочерний процесс для сохранения данных на диске. Хотя точную причину сбоя BGSAVE можно проверить из журналов (обычно при /var/log/redis/redis-server.log на машинах с Linux), но много раз БДАЛ не потому, что вилка не может выделить память. Много раз вилка не может выделить память (хотя машина имеет достаточно оперативной памяти) из-за конфликтной оптимизации ОС.

как можно прочитать из Redis FAQ:

схема сохранения фона Redis основана на семантике копирования при записи fork в современных операционных системах: Redis forks (создает дочерний процесс), который является точной копией родительского. Дочерний процесс сбрасывает БД на диск и, наконец, завершает работу. Теоретически ребенок должен использовать столько же памяти, сколько и родитель, являющийся копией, но на самом деле благодаря семантике копирования на запись, реализованной большинством современных операционных систем, Родительский и дочерний процесс будут общие страницы памяти. Страница будет дублироваться только тогда, когда она изменяется в дочернем или родительском элементе. Поскольку в теории все страницы может измениться, в то время как дочерний процесс-это экономия, линукс не могу сказать заранее, сколько памяти ребенка, поэтому если overcommit_memory параметр установлен в ноль вилка будет выполнена, если есть столько свободной оперативной памяти, как это требуется, чтобы действительно дублировать все родительские страниц памяти, поэтому если у вас есть Redis для набора данных 3 ГБ оперативной и всего 2 ГБ свободной памяти это потерпеть неудачу.

установка overcommit_memory в 1 говорит, что Linux расслабляется и выполняет вилку более оптимистичным способом распределения, и это действительно то, что вы хотите для Redis.

Redis не нужно столько памяти, сколько ОС думает, что это делает для записи на диск, так что может упреждающе провалить вилку.

чтобы решить эту проблему, можно:

изменить /etc/sysctl.conf и добавить:

vm.overcommit_memory=1

затем перезапустите sysctl с помощью:

On FreeBSD:

sudo /etc/rc.d/sysctl reload

На Linux:

sudo sysctl -p /etc/sysctl.conf

более постоянным исправлением может быть просмотр в /etc/redis/redis.conf вокруг строк 200-250 есть настройки для функций rdb, которые не были частью redis обратно в 2.х дней.

в частности

dir ./

можно изменить на

dir /home/someuser/redislogfiledirectory

или вы можете закомментировать все строки сохранения,и не беспокоиться о постоянстве. (См. комментарии в /etc / redis / redis.conf)

кроме того, не забывайте

service redis-server stop
service redis-server start

все эти ответы не объясняют причину, по которой не удалось сохранить rdb.


как и в моем случае, я проверил журнал redis и нашел:

14975: M 18 Jun 13: 23: 07.354 # сохранение фона прекращено сигналом 9

выполните следующую команду в терминале:

sudo egrep -i -r 'killed process' /var/log/

дисплей:

/var / log / kern.бревно.1:18 июня 13:23: 07 10-10-88-16 ядро: [28152358.208108] убитый процесс 28416 (redis-сервер) итого-ВМ:7660204kB, Анон-RSS-канал:2285492kB, файл-RSS-канал:0 КБ

что это! этот процесс (redis save rdb) убит убийца ООТ

говорится:

https://github.com/antirez/redis/issues/1886

найти, какой процесс был убит Linux OOM killer

FWIW, я столкнулся с этим, и решение состояло в том, чтобы просто добавить файл подкачки в поле. Я использовал этот метод: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04

столкнулся с этой ошибкой и смог выяснить из журнала, что ошибка связана с тем, что дискового пространства недостаточно. Все данные, которые были вставлены в моем случае, больше не нужны. Так что я попробовал FLUSHALL. Поскольку процесс redis-rdb-bgsave был запущен, он также не позволял сбросить данные. Я последовал ниже шагов и смог продолжить.

  1. войдите в redis client
  2. выполнить конфигурация установка стоп-пишет-на-bgsave-ошибка нет
  3. выполнить FLUSHALL (сохраненные данные не нужны)
  4. выполнить config set stop-writes-on-bgsave-error yes

процесс redis-rdb-bgsave больше не выполнялся после вышеуказанных шагов.

Как указал @Chris проблема, скорее всего, с низкой памятью. Мы начали испытывать это, когда мы выделили слишком много оперативной памяти для MySQL (innodb_buffer_pool_size).

чтобы обеспечить достаточное количество оперативной памяти для Redis и других услуг, мы сократили innodb_buffer_pool_size на MySQL.

я столкнулся с этой проблемой во время работы на сервере с дисковым пространством AFS, потому что мой токен аутентификации истек, что дало Permission Denied ответы, когда redis-сервер пытался сохранить. Я решил это, обновив свой токен:

kinit USERNAME_HERE -l 30d && aklog

в моем случае причиной было очень мало свободного места на диске (всего 35 Мб). Я сделал следующее -

  1. остановил все связанные с Redis процессы
  2. удалите некоторые файлы на диске, чтобы сделать достаточное свободное пространство
  3. удалить файл дампа redis (если существующие данные не нужны)

    sudo rm /var/lib/redis/*

  4. удалить все ключи из всех существующих баз данных

    sudo redis-cli flushall

  5. перезапустить все задачи сельдерея и проверьте соответствующие журналы для любых проблем

я тоже столкнулся с той же проблемой. Оба ответа (самый популярный и принятый) просто дают временное исправление для того же самого.

кроме того,config set stop-writes-on-bgsave-error no Это ужасный способ просмотреть эту ошибку, так как этот параметр останавливает redis от уведомления о том, что записи были остановлены и двигаться дальше без записи данных в моментальный снимок. Это просто игнорирование этой ошибки. обратитесь к этому

а dir in config in redis-cli, как только вы перезапустите службу redis, это также будет очищено, и снова появится та же ошибка. Значение по умолчанию dir in redis.conf и ./, и если вы начинаете redis как пользователь root, то ./ и / для которых разрешения на запись не предоставляются, и, следовательно, ошибка.

лучший способ-установить dir параметр в redis.файл conf и установите соответствующие разрешения для этого каталога. Большинство дистрибутивов debian должны иметь его в /etc/redis/redis.conf

Если вы используете Redis локально на машине windows, попробуйте "запустить от имени администратора" и посмотреть, работает ли он. Со мной проблема заключалась в том, что Redis был расположен в папке "Program Files", которая по умолчанию ограничивает разрешения. Как и положено.

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

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

вы можете решить эту проблему путем открытия redis.windows.conf и искать следующую конфигурацию:

# The working directory. # # The DB will be written inside this directory, with the filename specified # above using the 'dbfilename' configuration directive. # # The Append Only File will also be created inside this directory. # # Note that you must specify a directory here, not a file name. dir ./

изменить dir ./ к пути у вас есть регулярные разрешения на чтение / запись для

вы могли также просто переместите папку Redis целиком в папку, которая, как вы знаете, имеет правильные разрешения.

решение для @Govind Rai', чтобы сохранить дамп.файл rdb в каталоге, в котором вы запустили сервер в':

щелкните правой кнопкой мыши папку Redis, выберите пункт Свойства, а затем перейдите на вкладку Безопасность. Нажмите кнопку Изменить, чтобы открыть диалоговое окно разрешения для.

щелкните все пакеты приложений

в поле разрешения для установите флажок Разрешить "полный контроль".

Comments

    Ничего не найдено.