Во время записи в Redis ( SET foo bar
) я получаю следующую ошибку:
MISCONF Redis настроен для сохранения снимков RDB, но в настоящее время не может сохраняться на диске. Команды, которые могут изменить набор данных, отключены. Пожалуйста, проверьте журналы Redis для деталей об ошибке.
В основном я понимаю, что проблема в том, что Redis не может сохранять данные на диске, но не знаю, как избавиться от проблемы.
Кроме того, следующий вопрос имеет ту же проблему, он давно оставлен без ответов и, скорее всего, без попыток решить проблему.
redis
, но это не помогаетОтветы:
Если вы столкнулись с ошибкой и некоторые важные данные не могут быть сброшены на работающем экземпляре Redis (проблемы с
rdb
неправильными разрешениями для файла или его каталога или нехваткой места на диске), вы всегда можете перенаправитьrdb
файл для записи в другое место.Используя
redis-cli
, вы можете сделать что-то вроде этого:После этого вы можете выполнить
BGSAVE
команду, чтобы убедиться, что данные будут записаны вrdb
файл. Убедитесь, что когда вы выполняетеINFO persistence
,bgsave_in_progress
уже есть0
иrdb_last_bgsave_status
естьok
. После этого вы можете начать резервное копирование сгенерированногоrdb
файла в безопасное место.источник
dir C:/Temp/
. Сделайте bgsave, чтобы проверить, что это работает ..Используя
redis-cli
, вы можете остановить его, пытаясь сохранить снимок:Это быстрый обходной путь, но если вы заботитесь о данных, для которых вы его используете, вам следует проверить, почему bgsave потерпел неудачу в первую очередь.
источник
Во время процесса bgsave могут быть ошибки из-за нехватки памяти. Попробуйте это (из redis background сохранить FAQ)
источник
Эта ошибка возникает из-за сбоя BGSAVE. Во время BGSAVE Redis разветвляет дочерний процесс для сохранения данных на диске. Хотя точная причина сбоя BGSAVE может быть проверена из журналов (обычно
/var/log/redis/redis-server.log
на Linux-машинах), но во многих случаях BGAVE дает сбой, потому что вилка не может выделить память. Много раз форк не может выделить память (хотя у машины достаточно ОЗУ) из-за противоречивой оптимизации ОС.Как можно прочитать из Redis FAQ :
Redis не требуется столько памяти, сколько операционная система думает, что она делает запись на диск, поэтому может превратиться в неудачу.
Чтобы решить это, вы можете:
Изменить
/etc/sysctl.conf
и добавить:Затем перезапустите sysctl с помощью:
На FreeBSD:
В Linux:
источник
systemctl status redis
показал, что есть предупреждение, которое предлагает точно изменитьovercommit_memory=0
настройку. Изменение, которое действительно решило проблему для меня.Перезагрузите ваш сервер Redis.
brew services restart redis
.sudo service redis restart
/sudo systemctl restart redis
services.msc
, Enter-> Поиск,Redis
затем нажмитеrestart
.Я лично имел эту проблему после обновления Redis с Brew (
brew upgrade
). После перезагрузки ноутбука он сразу заработал.источник
sudo
:brew services stop redis; sudo brew services start redis
.в случае, если вы работаете на машине с linux, также перепроверьте права доступа к файлам и папкам базы данных.
БД и путь к нему можно получить через:
в
redis-cli
:и в командной строке
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 Server в каталоге, где у Redis есть права на запись
Ответы выше определенно решат вашу проблему, но вот что на самом деле происходит:
Расположение по умолчанию для хранения
rdb.dump
файла./
(обозначает текущий каталог). Вы можете проверить это в своемredis.conf
файле. Таким образом, каталог, из которого вы запускаете сервер Redis, находится вdump.rdb
файл будет создан и обновлен.Кажется, вы начали запускать сервер Redis в каталоге, где Redis не имеет правильных разрешений для создания
dump.rdb
файла.Что еще хуже, redis также, вероятно, не позволит вам выключить сервер, пока он не сможет создать файл rdb для обеспечения надлежащего сохранения данных.
Чтобы решить эту проблему, вы должны зайти в активную среду клиента Redis, используя
redis-cli
и обновивdir
ключ, и установить его значение в папке вашего проекта или в любой папке, для которой у пользователя без полномочий root есть права на сохранение. Затем запустите,BGSAVE
чтобы вызвать созданиеdump.rdb
файла.(Теперь, если вам нужно сохранить файл dump.rdb в каталоге, в котором вы запустили сервер, вам нужно будет изменить разрешения для каталога, чтобы redis мог записывать в него. Вы можете выполнить поиск в stackoverflow, как это сделать. ).
Теперь вы должны быть в состоянии завершить работу сервера Redis. Обратите внимание, что мы жестко закодировали путь. Жесткое кодирование редко является хорошей практикой, и я настоятельно рекомендую запустить сервер redis из каталога вашего проекта и изменить
dir key back to
. / `.Таким образом, когда вам понадобится redis для другого проекта, файл дампа будет создан в каталоге вашего текущего проекта, а не в каталоге проекта с жестко заданным путем.
источник
redis
поэтому я делаю:sudo chown redis:redis /var/lib/redis
Если вы используете MacOS и недавно обновили до Catalina, вам может потребоваться запустить,
brew services restart redis
как предложено в этом выпуске .источник
Обнаружил эту ошибку и смог из журнала выяснить, что ошибка из-за нехватки места на диске. Все данные, которые были вставлены в моем случае, больше не были нужны. Поэтому я попытался сбросить. Поскольку процесс redis-rdb-bgsave был запущен, он также не позволял сбрасывать данные. Я выполнил следующие шаги и смог продолжить.
Процесс redis-rdb-bgsave больше не выполнялся после описанных выше шагов.
источник
Я сталкивался с подобной проблемой, основной причиной этого было потребление памяти (RAM) redis. У моей машины EC2 было 8 ГБ оперативной памяти (около 7.4 доступно для потребления)
Когда моя программа работала, объем используемой оперативной памяти достигал 7,2 ГБ, оставляя едва ли ~ 100 МБ в ОЗУ, это обычно вызывает
MISCONF Redis error ...
Вы можете определить потребление оперативной памяти с помощью
htop
команды. Найдите атрибут Mem после выполнения команды htop. Если он показывает высокое потребление (как в моем случае это было 7,2 ГБ / 7,4 ГБ), лучше обновить экземпляр с большей памятью. В этом случае использованиеconfig set stop-writes-on-bgsave-error no
будет бедствием для сервера и может привести к нарушению работы других служб на сервере (если таковые имеются). Так что лучше избегать команды config и ОБНОВЛЯТЬ СВОЮ REDIS MACHINE .К вашему сведению: вам может понадобиться установить htop, чтобы сделать эту работу:
sudo apt-get install htop
Еще одним решением этой проблемы может быть запуск какой-либо другой службы, интенсивно работающей с ОЗУ, работающей в вашей системе, проверьте, работает ли другая служба на вашем сервере / компьютере / экземпляре, и остановите ее, если в этом нет необходимости. Чтобы проверить все службы, работающие на вашем компьютере, используйте
service --status-all
И предложение для людей, непосредственно вставляющих команду config, пожалуйста, немного пересмотрите программу и, по крайней мере, предупредите пользователя перед использованием таких команд. И как @Rodrigo упомянул в своем комментарии: «Не выглядит круто игнорировать ошибки».
---ОБНОВИТЬ---
Вы также можете настроить
maxmemory
иmaxmemory-policy
определить поведение Redis при достижении определенного предела памяти. Например, если я хочу сохранить ограничение памяти в 6 ГБ и удалить наименее использованные ключи из БД, чтобы убедиться, что использование redis mem не превышает 6 ГБ, тогда мы можем установить эти два параметра (в redis.conf или CONFIG SET). команды):Есть много других значений, которые вы можете установить для этих двух параметров, вы можете прочитать об этом здесь: https://redis.io/topics/lru-cache
источник
Более постоянное исправление может выглядеть в /etc/redis/redis.conf в строках 200-250, где есть настройки для функций rdb, которые не были частью redis в течение 2.x дней.
особенно
можно изменить на
или вы можете закомментировать все строки сохранения и не беспокоиться о сохранении. (Смотрите комментарии в /etc/redis/redis.conf)
Также не забывайте
источник
все эти ответы не объясняют причину сбоя сохранения rdb.
в моем случае я проверил журнал redis и обнаружил:
выполните следующую команду в терминале:
это дисплей:
вот оно что! этот процесс (redis save rdb) убит убийцей OOM
относится:
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
источник
Я тоже столкнулся с той же проблемой. Оба ответа (наиболее одобренный и принятый) просто дают временное исправление для одного и того же.
Более того,
config set stop-writes-on-bgsave-error no
это ужасный способ просмотреть эту ошибку, поскольку эта опция не дает перенаправить уведомление о том, что запись была остановлена, и перейти без записи данных в снимок. Это просто игнорирование этой ошибки. Отослать этоЧто касается настройки
dir
вconfig
redis-cli, после перезапуска службы redis это тоже должно быть очищено, и снова появится та же ошибка. Значение по умолчанию дляdir
inredis.conf
- это./
, и если вы запускаете redis от имени пользователя root, то./
это то,/
на что не предоставляются разрешения на запись, и, следовательно, ошибка.Лучший способ - установить
dir
параметр в файле redis.conf и установить соответствующие разрешения для этого каталога. Большинство дистрибутивов Debian должны иметь его в/etc/redis/redis.conf
источник
В настоящее время проблемы доступа к записи Redis, которые передают это сообщение об ошибке клиенту, вновь появились в официальных
redis
контейнерах докера.Redis из официального
redis
образа пытается записать файл .rdb в/data
папку Containers , что весьма прискорбно, так как это папка, принадлежащая корню, и это также непостоянное расположение (записанные там данные исчезнут, если ваш контейнер / модуль аварий).Таким образом, после часа бездействия, если вы запустили свой
redis
контейнер как пользователь без полномочий root (например,docker run -u 1007
вместо того, чтобы использовать его по умолчаниюdocker run -u 0
), в журнале вашего сервера вы получите сообщение об ошибке (см.docker logs redis
):Итак, вам нужно сопоставить
/data
папку контейнера с внешним местоположением (где пользователь без полномочий root, здесь: 1007, имеет доступ на запись, например,/tmp
на хост-машине), например:Таким образом, это неправильная конфигурация официального образа докера (который должен писать
/tmp
нет/data
), который производит эту «бомбу замедленного действия», с которой вы, скорее всего, столкнетесь только в производстве ... в одночасье в течение особенно тихих праздничных выходных: /источник
для меня
и я перезагружаю свой Mac, это работает
источник
Я столкнулся с этой проблемой, работая на сервере с дисковым пространством AFS, потому что срок действия моего токена аутентификации истек, что давало
Permission Denied
ответы, когда сервер redis пытался сохранить. Я решил это, обновив свой токен:kinit USERNAME_HERE -l 30d && aklog
источник
Если вы используете docker / docker-compose и хотите запретить redis писать в файл, вы можете создать конфигурацию redis и смонтировать ее в контейнер.
docker.compose.override.yml
Вы можете скачать конфигурацию по умолчанию здесь
в файле redis.conf обязательно закомментируйте эти 3 строки
Вы можете увидеть больше решений для удаления постоянных данных здесь
источник
В моем случае это произошло потому, что я просто установил
redis
быстрым способом. Таким образом, Redis не работает как root. Я смог решить эту проблему, следуя инструкциям вInstalling Redis more properly
разделе « Краткое руководство» . После этого проблема была решена иredis
теперь выполняется от имени пользователя root. Проверьте это.источник
После того, как я наконец-то ударил по такому количеству ТАКИХ вопросов - для меня ответ @Axel Advento сработал, но с несколькими дополнительными шагами - я все еще сталкивался с проблемами с разрешениями.
Мне пришлось переключить пользователя на
redis
, создать новый каталог в его домашнем каталоге, а затем установить его в качестве каталога Redis.источник
В моем случае это было связано с дисковым пространством. (вы можете проверить это
df -h
командой bash), когда я освобождаю место, эта ошибка исчезла.источник
Если вы работаете с Redis локально на компьютере с Windows, попробуйте «запустить от имени администратора» и посмотрите, работает ли он. У меня проблема была в том, что Redis был расположен в папке «Program Files», которая ограничивает разрешения по умолчанию. Как это должно.
Однако не запускайте Redis автоматически от имени администратора. Вы не хотите предоставлять ему больше прав, чем он должен иметь. Вы хотите решить это по книге.
Итак, мы смогли быстро определить проблему, запустив ее от имени администратора, но это не лекарство. Вероятный сценарий состоит в том, что вы поместили Redis в папку, у которой нет прав на запись, и, как следствие, файл БД хранится в том же месте.
Вы можете решить эту проблему, открыв
redis.windows.conf
и для поиска следующей конфигурации:Перейдите
dir ./
на путь, для которого у вас есть обычные права на чтение / запись.Вы также можете просто полностью переместить папку Redis в папку, которая, как вы знаете, имеет необходимые разрешения.
источник
Для меня это была просто проблема прав доступа к папке с постоянными данными redis. Я дал это:
И это работает! Может быть, еще рано говорить, что это решит проблему. Я также подозреваю, что redis не выполняется от имени пользователя root, поэтому мне нужно проверить мой dockerFile, чтобы узнать больше.
источник
Проверьте свой журнал Redis, прежде чем предпринимать какие-либо действия. Некоторые решения в этой теме могут стереть ваши данные Redis, поэтому будьте осторожны с тем, что вы делаете.
В моем случае у машины не хватило оперативной памяти . Это также может произойти, когда на хосте больше нет свободного дискового пространства .
источник
Пожалуйста, имейте в виду, что эта ошибка появляется, когда ваш сервер подвергается атаке. Только что обнаружил, что redis не может записать в /etc/cron.d/web, где после корректировки прав доступа был добавлен новый файл, состоящий из алгоритма майнинга с некоторыми опциями скрытия.
источник
источник
Как отмечает @Chris, проблема, вероятно, связана с нехваткой памяти. Мы начали испытывать это, когда выделяли слишком много оперативной памяти для MySQL (
innodb_buffer_pool_size
).Чтобы обеспечить достаточно оперативной памяти для Redis и других сервисов, мы сократили
innodb_buffer_pool_size
на MySQL.источник
В моем случае причиной было очень мало свободного места на диске (всего 35 Мб). Я сделал следующее -
Удалить файл дампа redis (если существующие данные не нужны)
sudo rm /var/lib/redis/*
Удалить все ключи всех существующих баз данных
sudo redis-cli flushall
источник
Вы должны chmod и chown новую папку
chown -R redis и chmod ...
источник