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

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

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

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

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

18 ответов


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

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

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

после этого вы можете выполнить чтобы убедиться, что данные будут записаны в the . Убедитесь, что при выполнении 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. Обратите внимание, что мы жестко путь. Hardcoding редко является хорошей практикой, и я настоятельно рекомендую запустить сервер redis из каталога проекта и изменить dir key back to./`.

CONFIG SET dir "./"
BGSAVE

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


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

как можно прочитать из Рэдис часто задаваемые вопросы:

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

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

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

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

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

vm.overcommit_memory=1

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

на 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:Jun 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
  2. выполнить config set stop-writes-on-bgsave-error нет!--7-->
  3. выполнить FLUSHALL (сохраненные данные не были необходимы)
  4. выполнить config set stop-writes-on-bgsave-ошибка да

процесс 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 Мб). Я сделал следующее ... --3-->

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

    sudo rm /var/lib/redis/*

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

    sudo redis-cli flushall

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

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

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

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

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


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

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

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

вы можете решить эту проблему путем открытия 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, выберите пункт Свойства и перейдите на вкладку Безопасность. Нажмите кнопку Изменить, чтобы открыть диалоговое окно разрешения для.

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

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