MISCONF Redis está configurado para salvar instantâneos RDB

Durante as gravações no Redis ( SET foo bar ) estou recebendo o seguinte erro:

O MISCONF Redis está configurado para salvar os instantâneos do RDB, mas atualmente não é capaz de persistir no disco. Comandos que podem modificar o dataset estão desativados. Por favor, verifique os logs do Redis para detalhes sobre o erro.

Basicamente eu 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.

Também a seguinte questão tem o mesmo problema, é abandonada há muito tempo sem respostas e muito provavelmente sem tentativas de resolver o problema.

Caso você encontre o erro e alguns dados importantes não possam ser descartados na instância do redis em execução (problemas com permissions para o arquivo rdb ou seu diretório incorretamente, ou falta de espaço em disco), você sempre pode redirect o arquivo rdb para ser gravado em algum lugar outro.

Usando redis-cli , você pode fazer algo assim:

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

Depois disso, você pode querer executar um comando BGSAVE para certificar-se de que os dados serão gravados no arquivo rdb . Certifique-se de que quando você executa INFO , bgsave_in_progress já é 0 (a operação é bem-sucedida ou há um erro encontrado). Depois disso, você pode começar a fazer o backup do arquivo rdb gerado em algum lugar seguro.

Você pode pará-lo tentando salvar o instantâneo:

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

Esta é uma solução rápida, mas se você se preocupa com os dados para os quais está usando, você deve verificar se o bgsave falhou em primeiro lugar.

Pode haver erros durante o processo bgsave devido a pouca memory. Tente isto (do Redis Background Save FAQ)

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

Apenas muito breve sobre a resposta. abra o terminal e digite os seguintes comandos

 redis-cli 

e agora digite

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

Obrigado a todos por verificarem o problema, aparentemente o erro foi produzido durante o bgsave .

Para mim, digitando config set stop-writes-on-bgsave-error no em um shell e reiniciar Redis resolveu o problema.

caso você esteja trabalhando em uma máquina linux, também verifique novamente as permissions de arquivo e pasta do database.

O db e o caminho para ele podem ser obtidos via:

em redis-cli :

CONFIG GET dir

CONFIG GET dbfilename

e na linha de comando ls -l . As permissions para o diretório devem ser 755 e as do arquivo devem ser 644 . Além disso, normalmente redis-server é executado como o usuário redis , portanto, também é bom dar ao usuário a propriedade da pasta executando sudo chown -R redis:redis /path/to/rdb/folder . Isso foi elaborado na resposta aqui .

Inicie o Redis Server em um diretório no qual o Redis tenha permissions de gravação

As respostas acima resolverão definitivamente o seu problema, mas eis o que realmente está acontecendo:

O local padrão para armazenar o arquivo rdb.dump é ./ (denotando o diretório atual). Você pode verificar isso no seu arquivo redis.conf . Portanto, o diretório de onde você inicia o servidor redis é onde um arquivo dump.rdb será criado e atualizado.

Parece que você começou a executar o servidor redis em um diretório no qual o redis não possui as permissions corretas para criar o arquivo dump.rdb .

Para piorar, os redis provavelmente também não permitirão que você desligue o servidor até que ele seja capaz de criar o arquivo rdb para garantir a salvaguarda adequada dos dados.

Para resolver este problema, você deve entrar no ambiente ativo do cliente redis usando redis-cli e atualizar a chave dir e definir seu valor para a pasta do projeto ou qualquer pasta em que o non-root tenha permissions para salvar. Em seguida, execute o BGSAVE para invocar a criação do arquivo dump.rdb .

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

(Agora, se você precisar salvar o arquivo dump.rdb no diretório em que iniciou o servidor, precisará alterar as permissions do diretório para que os redis possam gravar nele. É possível pesquisar stackoverflow para saber como fazer isso. ).

Agora você deve ser capaz de 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 seu projeto e mudar a dir key back to . / `.

 CONFIG SET dir "./" BGSAVE 

Dessa forma, quando você precisar de redis para outro projeto, o arquivo de despejo será criado no diretório do seu projeto atual e não no diretório do projeto do caminho codificado.

Uma correção mais permanente pode ser procurar em /etc/redis/redis.conf pelas linhas 200-250; há configurações para os resources rdb, que não faziam parte dos redis de volta nos 2.x dias.

notavelmente

 dir ./ 

pode ser alterado para

 dir /home/someuser/redislogfiledirectory 

ou você pode comentar todas as linhas salvas e não se preocupar com a persistência. (Veja os comentários em /etc/redis/redis.conf)

Além disso, não esqueça

 service redis-server stop service redis-server start 

FWIW, eu corri para isso e a solução foi simplesmente adicionar um swapfile à checkbox. Eu usei esse método: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04

todas essas respostas não explicam o motivo pelo qual o rdb save falhou.


como no meu caso, chequei o log de redis e encontrei:

14975: M 18 Jun 13: 23: 07.354 # Poupança em segundo plano terminada por sinal 9

execute o seguinte comando no terminal:

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

exibir:

/var/log/kern.log.1:Jun 18 13:23:07 10-10-88-16 kernel: [28152358.208108] Processo morto 28416 (redis-servidor) total-vm: 7660204kB, anon-rss: 2285492kB, arquivo-rss: 0kB

é isso! esse processo (redis save rdb) é morto pelo killer da OOM

refere-se:

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

Descobrindo qual processo foi morto pelo assassino Linux OOM

Este erro ocorre porque BGSAVE está falhando. Durante BGSAVE, Redis bifurca um processo filho para salvar os dados no disco. Embora a razão exata para a falha do BGSAVE possa ser verificada a partir de logs (geralmente em /var/log/redis/redis-server.log em máquinas linux), mas muitas vezes o BGAVE falha porque o fork não pode alocar memory. Muitas vezes o fork não consegue alocar memory (embora a máquina tenha RAM suficiente disponível) devido a uma otimização conflitante pelo SO.

Como pode ser lido em Redis FAQ :

O esquema de salvamento em segundo plano Redis baseia-se na semântica copy-on-write do fork em sistemas operacionais modernos: forks Redis (cria um processo filho) que é uma cópia exata do pai. O processo filho despeja o database no disco e finalmente sai. Em teoria, o filho deve usar tanta memory quanto o pai sendo uma cópia, mas, na verdade, graças ao semântico copy-on-write implementado pela maioria dos sistemas operacionais modernos, o processo pai e filho compartilhará as páginas de memory comuns. Uma página será duplicada apenas quando for alterada no filho ou no pai. Como, em teoria, todas as páginas podem mudar enquanto o processo filho está sendo salvo, o Linux não pode informar com antecedência a quantidade de memory que a criança receberá, portanto, se a configuração overcommit_memory estiver definida como zero, falhará, a menos que haja RAM livre necessário para realmente duplicar todas as páginas de memory pai, com o resultado de que, se você tiver um dataset Redis de 3 GB e apenas 2 GB de memory livre, ele falhará.

A definição de overcommit_memory para 1 indica que o Linux relaxa e executa o fork de maneira mais otimista, e é isso que você deseja para o Redis.

O Redis não precisa de tanta memory quanto o sistema operacional acha que precisa gravar no disco, portanto, pode falhar preventivamente o fork.

Para resolver isso, você pode:

Modifique o /etc/sysctl.conf e adicione:

 vm.overcommit_memory=1 

Em seguida, reinicie o sysctl com:

No FreeBSD:

 sudo /etc/rc.d/sysctl reload 

No Linux:

 sudo sysctl -p /etc/sysctl.conf 

Como apontado pelo @Chris, é provável que o problema ocorra com pouca memory. Nós começamos a experimentá-lo quando alocamos muita memory RAM para o MySQL ( innodb_buffer_pool_size ).

Para garantir que haja RAM suficiente para o Redis e outros serviços, reduzimos o innodb_buffer_pool_size no MySQL.

Eu acertei esse problema enquanto trabalhava em um servidor com espaço em disco do AFS porque meu token de autenticação tinha expirado, o que gerou respostas de Permission Denied quando o servidor-redis tentou salvar. Eu resolvi isso atualizando meu token:

kinit USERNAME_HERE -l 30d && aklog

No meu caso, o motivo foi muito pouco espaço livre no disco (apenas 35 Mb). Eu fiz o seguinte –

  1. Parou todo o processo relacionado ao Redis
  2. Exclua alguns arquivos no disco para liberar espaço adequado
  3. Excluir arquivo de despejo de detalhes (se os dados existentes não forem necessários)

    sudo rm /var/lib/redis/*

  4. Exclua todas as chaves de todos os bancos de dados existentes

    sudo redis-cli flushall

  5. reiniciar todas as tarefas de aipo e verificar os logs correspondentes para quaisquer problemas

Eu também estava enfrentando o mesmo problema. Ambas as respostas (a mais votada e a mais aceita) apenas dão uma solução temporária para a mesma.

Além disso, o config set stop-writes-on-bgsave-error no é uma maneira horrível de procurar este erro, pois o que esta opção faz é parar os redis de notificar que as gravações foram paradas e continuar sem gravar os dados em um instantâneo. Isso é simplesmente ignorar esse erro. Referir isto

Como para configurar o dir na config no redis-cli, assim que você reiniciar o serviço de redis, este também será limpo eo mesmo erro aparecerá novamente. O valor padrão de dir em redis.conf é ./ , e se você iniciar o redis como usuário root, então ./ é / para o qual as permissions de gravação não são concedidas e, portanto, o erro.

A melhor maneira é definir o parâmetro dir no arquivo redis.conf e definir permissions apropriadas para esse diretório. A maioria das distribuições debian deve tê-lo em /etc/redis/redis.conf

Se você estiver executando o Redis localmente em uma máquina Windows, tente “executar como administrador” e veja se funciona. Comigo, o problema era que o Redis estava localizado na pasta “Arquivos de Programas”, que restringe as permissions por padrão. Como deveria.

No entanto, não execute automaticamente o Redis como um administrador Você não deseja conceder mais direitos que é suposto ter. Você quer resolver isso pelo livro.

Assim, conseguimos identificar rapidamente o problema executando-o como administrador, mas essa não é a cura. Um cenário provável é que você tenha colocado o Redis em uma pasta que não possui direitos de gravação e, como conseqüência, o arquivo do database é armazenado no mesmo local.

Você pode resolver isso abrindo o redis.windows.conf e procurando pela seguinte configuração:

# 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 ./

Alterar dir ./ para um caminho que você tem permissions regulares de leitura / gravação para

Você também pode simplesmente mover a pasta Redis em sua totalidade para uma pasta que você sabe que tem as permissions corretas.

Solução para @Govind Rai ‘para salvar o arquivo dump.rdb no diretório em que você iniciou o servidor’:

Clique com o botão direito sua pasta Redis, clique em Propriedades e, em seguida, clique na guia Segurança. Clique em Editar para abrir a checkbox de diálogo Permissões para.

Clique em TODOS OS PACOTES DE APLICATIVOS

Na checkbox Permissões para, marque a checkbox de seleção Permitir ‘Controle total’.