Durante gravações no Redis ( SET foo bar
), estou recebendo o seguinte erro:
O MISCONF Redis está configurado para salvar instantâneos de RDB, mas atualmente não pode persistir no disco. Os comandos que podem modificar o conjunto de dados estão desativados. Verifique os logs do Redis para obter detalhes sobre o erro.
Basicamente, entendo que o problema é que o redis não é capaz de salvar dados no disco, mas não tem idéia de como se livrar do problema.
Além disso, a pergunta a seguir tem o mesmo problema, foi abandonada há muito tempo sem respostas e, provavelmente, sem tentativas de solucionar o problema.
redis
, mas não ajuda!Respostas:
Caso encontre o erro e alguns dados importantes não possam ser descartados na instância redis em execução (problemas com permissões para o
rdb
arquivo ou seu diretório incorretamente ou com falta de espaço em disco), você sempre pode redirecionar ordb
arquivo para ser gravado em outro lugar.Usando
redis-cli
, você pode fazer algo assim:Depois disso, convém executar um
BGSAVE
comando para garantir que os dados sejam gravados nordb
arquivo. Certifique-se de que, quando você executaINFO persistence
,bgsave_in_progress
já é0
erdb_last_bgsave_status
éok
. Depois disso, agora você pode iniciar o backup dordb
arquivo gerado em algum lugar seguro.fonte
dir C:/Temp/
. Fazer um bgsave para verificar se ele funciona ..Usando
redis-cli
, você pode parar de tentar salvar o instantâneo:Esta é uma solução rápida, mas se você se preocupa com os dados para os quais está usando, verifique se o bgsave falhou em primeiro lugar.
fonte
Pode haver erros durante o processo bgsave devido à pouca memória. Tente isso (em redis background save FAQ)
fonte
Este erro ocorre devido à falha de BGSAVE. Durante o BGSAVE, o Redis bifurca um processo filho para salvar os dados no disco. Embora o motivo exato da falha do BGSAVE possa ser verificado a partir dos logs (geralmente
/var/log/redis/redis-server.log
em máquinas Linux), mas muitas vezes o BGAVE falha porque o fork não pode alocar memória. Muitas vezes o fork não consegue alocar memória (embora a máquina tenha RAM suficiente disponível) devido a uma otimização conflitante do sistema operacional.Como pode ser lido nas Perguntas frequentes do Redis :
O Redis não precisa de tanta memória quanto o sistema operacional pensa para gravar no disco; portanto, pode falhar preventivamente na bifurcação.
Para resolver isso, você pode:
Modifique
/etc/sysctl.conf
e adicione:Em seguida, reinicie o sysctl com:
No FreeBSD:
No Linux:
fonte
systemctl status redis
revelou que há um aviso que sugeriu exatamente alterar aovercommit_memory=0
configuração. Alterar isso realmente resolveu o problema para mim.Reinicie seu servidor redis.
brew services restart redis
.sudo service redis restart
/sudo systemctl restart redis
services.msc
, Enter-> ProcurarRedis
e clique emrestart
.Pessoalmente, tive esse problema depois de atualizar o redis com o Brew (
brew upgrade
). Depois de reiniciar o laptop, ele imediatamente funcionou.fonte
sudo
:brew services stop redis; sudo brew services start redis
.caso você esteja trabalhando em uma máquina Linux, verifique novamente as permissões de arquivo e pasta do banco de dados.
O banco de dados e o caminho para ele podem ser obtidos via:
em
redis-cli
:e na linha de comando
ls -l
. As permissões para o diretório devem ser 755 e as para o arquivo devem ser 644 . Além disso, normalmente o redis-server é executado como usuárioredis
, portanto, também é bom atribuir ao usuárioredis
a propriedade da pasta executandosudo chown -R redis:redis /path/to/rdb/folder
. Isso foi elaborado na resposta aqui .fonte
Obrigado a todos por verificar o problema, aparentemente o erro foi produzido durante
bgsave
.Para mim, digitar
config set stop-writes-on-bgsave-error no
um shell e reiniciar o Redis resolveu o problema.fonte
Inicie o Redis Server em um diretório em que o Redis tenha permissões de gravação
As respostas acima definitivamente resolverão seu problema, mas aqui está o que realmente está acontecendo:
O local padrão para armazenar o
rdb.dump
arquivo é./
(indicando o diretório atual). Você pode verificar isso no seuredis.conf
arquivo. Portanto, o diretório a partir do qual você inicia o servidor redis é onde umdump.rdb
arquivo será criado e atualizado.Parece que você começou a executar o servidor redis em um diretório em que o redis não tem as permissões corretas para criar o
dump.rdb
arquivo.Para piorar a situação, os redis provavelmente também não permitirão que você desligue o servidor até que seja capaz de criar o arquivo rdb para garantir o salvamento adequado dos dados.
Para resolver esse problema, você deve entrar no ambiente ativo do cliente redis usando
redis-cli
e atualizar adir
chave e definir seu valor para a pasta do projeto ou qualquer pasta em que o usuário não raiz tenha permissões para salvar. Em seguida, executeBGSAVE
para invocar a criação dodump.rdb
arquivo.(Agora, se você precisar salvar o arquivo dump.rdb no diretório em que iniciou o servidor, será necessário alterar as permissões do diretório para que os redis possam gravar nele. Você pode pesquisar o stackoverflow para saber como fazer isso )
Agora você deve conseguir desligar o servidor redis. Observe que codificamos o caminho. Hardcoding raramente é uma boa prática e eu recomendo iniciar o servidor redis a partir do diretório do projeto e alterar o
dir key back to
. / `.Dessa forma, quando você precisar redis para outro projeto, o arquivo de despejo será criado no diretório do projeto atual e não no diretório do projeto do caminho codificado.
fonte
redis
assim faço:sudo chown redis:redis /var/lib/redis
Se você estiver executando o MacOS e atualizou recentemente para a Catalina, pode ser necessário executar
brew services restart redis
conforme sugerido neste problema .fonte
Tinha encontrado esse erro e foi capaz de descobrir no log que o erro ocorreu devido ao espaço em disco não ser suficiente. Todos os dados inseridos no meu caso não eram mais necessários. Então eu tentei FLUSHALL. Como o processo redis-rdb-bgsave estava em execução, não estava permitindo liberar os dados também. Segui as etapas abaixo e fui capaz de continuar.
O processo redis-rdb-bgsave não estava mais sendo executado após as etapas acima.
fonte
Eu enfrentei o problema semelhante, a principal razão por trás disso foi o consumo de memória (RAM) por redis. Minha máquina EC2 tinha 8 GB de RAM (cerca de 7.4 disponível para consumo)
Quando meu programa estava executando, o uso da RAM subiu para 7,2 GB, deixando quase 100 MB de RAM, geralmente isso aciona o
MISCONF Redis error ...
Você pode determinar o consumo de RAM usando o
htop
comando Procure o atributo Mem após executar o comando htop. Se ele mostrar alto consumo (como no meu caso, foi de 7,2 GB / 7,4 GB), é melhor atualizar a instância com memória maior. Nesse cenário, a utilizaçãoconfig set stop-writes-on-bgsave-error no
será um desastre para o servidor e poderá resultar na interrupção de outros serviços em execução no servidor (se houver). Portanto, é melhor evitar o comando config e ATUALIZAR SUA REDIS MACHINE .FYI: Pode ser necessário instalar o htop para fazer isso funcionar:
sudo apt-get install htop
Uma solução a mais para isso pode ser outro serviço pesado de RAM em execução no sistema, verifique se há outro serviço em execução no servidor / máquina / instância e pare-o, se não for necessário. Para verificar todos os serviços em execução na sua máquina, use
service --status-all
E uma sugestão para as pessoas que colam diretamente o comando config, pesquise um pouco e pelo menos avise o usuário antes de usar esses comandos. E como @Rodrigo mencionou em seu comentário: "Não parece legal ignorar os erros".
---ATUALIZAR---
Você também pode configurar
maxmemory
emaxmemory-policy
definir o comportamento do Redis quando um limite específico de memória é atingido. Por exemplo, se eu quiser manter o limite de memória de 6 GB e excluir as chaves usadas menos recentemente do banco de dados para garantir que o uso de redis mem não exceda 6 GB, podemos definir esses dois parâmetros (em redis.conf ou CONFIG SET comando):Existem muitos outros valores que você pode definir para esses dois parâmetros que podem ser lidos aqui: https://redis.io/topics/lru-cache
fonte
Uma correção mais permanente pode ser procurar no /etc/redis/redis.conf, nas linhas 200-250, configurações para os recursos rdb, que não faziam parte do redis nos dias 2.x.
notavelmente
pode ser alterado para
ou você pode comentar todas as linhas de salvamento e não se preocupar com persistência. (Veja os comentários em /etc/redis/redis.conf)
Além disso, não esqueça
fonte
todas essas respostas não explicam o motivo pelo qual o rdb save falhou.
no meu caso, verifiquei o log redis e descobri:
execute o seguinte comando no terminal:
exibe:
é isso! esse processo (redis save rdb) é eliminado pelo OOM killer
refere:
https://github.com/antirez/redis/issues/1886
Localizando qual processo foi morto pelo Linux OOM killer
fonte
FWIW, eu me deparei com isso e a solução era simplesmente adicionar um arquivo de troca à caixa. Eu usei este método: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04
fonte
Eu também estava enfrentando o mesmo problema. Ambas as respostas (a mais votada e a mais aceita) fornecem uma correção temporária para a mesma.
Além disso,
config set stop-writes-on-bgsave-error no
é uma maneira horrível de ignorar esse erro, pois o que essa opção faz é parar o redis de notificar que as gravações foram interrompidas e seguir em frente sem gravar os dados em um instantâneo. Isso é simplesmente ignorar esse erro. Consulte esteQuanto à configuração
dir
emconfig
redis-cli, depois de reiniciar o serviço redis, isso também será limpo e o mesmo erro será exibido novamente. O valor padrão dedir
inredis.conf
é./
e, se você iniciar o redis como usuário root,./
é/
para isso que as permissões de gravação não são concedidas e, portanto, o erro.A melhor maneira é definir o
dir
parâmetro no arquivo redis.conf e definir as permissões apropriadas para esse diretório. A maioria das distribuições debian deve ter isso em/etc/redis/redis.conf
fonte
Atualmente, os problemas de acesso de gravação do Redis que transmitem essa mensagem de erro ao cliente ressurgiram nos
redis
contêineres oficiais da janela de encaixe.Os redis da imagem oficial
redis
tentam gravar o arquivo .rdb na/data
pasta containers , o que é bastante lamentável, pois é uma pasta de propriedade da raiz e também é um local não persistente (os dados gravados ali desaparecerão se o container / pod falhas).Portanto, após uma hora de inatividade, se você executou seu
redis
contêiner como um usuário não raiz (por exemplo, emdocker run -u 1007
vez de padrãodocker run -u 0
), receberá uma mensagem de erro bem detalhada no log do servidor (consultedocker logs redis
):Portanto, o que você precisa fazer é mapear a
/data
pasta do contêiner para um local externo (onde o usuário não raiz, aqui: 1007, possui acesso de gravação, como/tmp
na máquina host), por exemplo:Portanto, é uma configuração incorreta da imagem oficial do docker (que deve ser gravada como
/tmp
não/data
) que produz essa "bomba-relógio" que você provavelmente encontrará apenas em produção ... durante a noite durante um fim de semana de feriado particularmente tranquilo: /fonte
para mim
e recarrego meu mac, funciona
fonte
Eu encontrei esse problema enquanto trabalhava em um servidor com espaço em disco do AFS porque meu token de autenticação expirou, o que gerou
Permission Denied
respostas quando o redis-server tentou salvar. Resolvi isso atualizando meu token:kinit USERNAME_HERE -l 30d && aklog
fonte
Caso esteja usando o docker / docker-compose e deseje impedir que os redis gravem no arquivo, é possível criar uma configuração redis e montar em um contêiner
docker.compose.override.yml
Você pode baixar a configuração padrão aqui
no arquivo redis.conf, certifique-se de comentar estas 3 linhas
você pode ver mais soluções para remover os dados persistentes aqui
fonte
No meu caso, aconteceu porque eu acabei de instalar
redis
usando o caminho rápido. Então redis não está sendo executado como root. Consegui resolver esse problema seguindo as instruções naInstalling Redis more properly
seção do Guia de Iniciação Rápida . Depois disso, o problema foi resolvido eredis
agora está sendo executado como root. Confira.fonte
Depois de enfiar minha cabeça em tantas perguntas de SO, finalmente - para mim, a resposta do @Axel Advento funcionou, mas com algumas etapas extras - eu ainda estava enfrentando os problemas de permissão.
Eu tive que mudar de usuário
redis
, criar um novo diretório no diretório home e depois defini-lo como o dir de redis.fonte
No meu caso, estava relacionado ao espaço livre em disco. (você pode verificá-lo com o
df -h
comando bash) quando eu libero algum espaço, esse erro desapareceu.fonte
Se você estiver executando o Redis localmente em uma máquina Windows, tente "executar como administrador" e verifique se funciona. Comigo, o problema era que o Redis estava localizado na pasta "Arquivos de Programas", que restringe as permissões por padrão. Como deveria.
No entanto, não execute o Redis automaticamente como administrador Você não deseja conceder mais direitos do que deveria. Você quer resolver isso pelo livro.
Portanto, conseguimos identificar rapidamente o problema executando-o como administrador, mas essa não é a solução. Um cenário provável é que você colocou o Redis em uma pasta que não possui direitos de gravação e, como conseqüência, o arquivo DB é armazenado no mesmo local.
Você pode resolver isso abrindo o
redis.windows.conf
e para procurar a seguinte configuração:Mude
dir ./
para um caminho para o qual você tem permissões regulares de leitura / gravação paraVocê também pode simplesmente mover a pasta Redis na sua totalidade para uma pasta que você sabe que possui as permissões corretas.
fonte
Para mim, era apenas um problema de permissões na pasta de dados redis persistente. Eu dei a:
E é obras! Pode ser que seja cedo para dizer que resolve o problema. Como também suspeito que o redis não esteja sendo executado como raiz, preciso inspecionar meu dockerFile para descobrir mais.
fonte
Verifique seu log do Redis antes de executar qualquer ação. Algumas das soluções neste encadeamento podem apagar seus dados Redis, portanto, tenha cuidado com o que está fazendo.
No meu caso, a máquina estava ficando sem memória RAM . Isso também pode acontecer quando não há mais espaço livre em disco no host.
fonte
Por favor, esteja ciente de que este erro aparece quando seu servidor está sendo atacado. Acabei de descobrir que o redis falha ao gravar em '/etc/cron.d/web', onde após a correção das permissões, um novo arquivo que consiste no algoritmo de mineração com algumas opções de ocultação foi adicionado.
fonte
fonte
Como apontado por @ Chris, o problema provavelmente está com pouca memória. Começamos a experimentar quando alocamos muita RAM para o MySQL (
innodb_buffer_pool_size
).Para garantir que haja RAM suficiente para Redis e outros serviços, reduzimos
innodb_buffer_pool_size
no MySQL.fonte
No meu caso, o motivo era muito pouco espaço livre no disco (apenas 35 Mb). Eu fiz o seguinte -
Excluir arquivo redis dump (se dados existentes não forem necessários)
sudo rm /var/lib/redis/*
Exclua todas as chaves de todos os bancos de dados existentes
sudo redis-cli flushall
fonte
você deve chmod e mostrar a nova pasta
chown -R redis e chmod ...
fonte