Durante las escrituras a Redis ( SET foo bar
) obtengo el siguiente error:
MISCONF Redis está configurado para guardar instantáneas RDB, pero actualmente no puede persistir en el disco. Los comandos que pueden modificar el conjunto de datos están deshabilitados. Consulte los registros de Redis para obtener detalles sobre el error.
Básicamente entiendo que el problema es que redis no puede guardar datos en el disco, pero no tengo idea de cómo deshacerse del problema.
Además, la siguiente pregunta tiene el mismo problema, se abandonó hace mucho tiempo sin respuestas y muy probablemente sin intentos de resolver el problema.
redis
, ¡pero no ayuda!Respuestas:
En caso de que encuentre el error y algunos datos importantes no se puedan descartar en la instancia de redis en ejecución (problemas con los permisos para el
rdb
archivo o su directorio incorrectamente, o quedarse sin espacio en disco), siempre puede redirigir elrdb
archivo para que se escriba en otro lugar.Usando
redis-cli
, puedes hacer algo como esto:Después de esto, es posible que desee ejecutar un
BGSAVE
comando para asegurarse de que los datos se escribirán en elrdb
archivo. Asegúrese de que cuando ejecuteINFO persistence
,bgsave_in_progress
ya esté0
yrdb_last_bgsave_status
estéok
. Después de eso, ahora puede comenzar a hacer una copia de seguridad delrdb
archivo generado en un lugar seguro.fuente
dir C:/Temp/
. Haga un bgsave para verificar que funciona ..Utilizando
redis-cli
, puede detenerlo tratando de guardar la instantánea:Esta es una solución rápida, pero si le importan los datos para los que la está utilizando, debe verificar para asegurarse de por qué bgsave falló en primer lugar.
fuente
Puede haber errores durante el proceso de bgsave debido a la poca memoria. Pruebe esto (desde el fondo de redis guarde las preguntas frecuentes)
fuente
Este error se produce porque BGSAVE ha fallado. Durante BGSAVE, Redis bifurca un proceso secundario para guardar los datos en el disco. Aunque la razón exacta de la falla de BGSAVE puede verificarse desde los registros (generalmente en
/var/log/redis/redis-server.log
máquinas Linux), pero muchas veces BGAVE falla porque la bifurcación no puede asignar memoria. Muchas veces, la bifurcación no puede asignar memoria (aunque la máquina tiene suficiente RAM disponible) debido a una optimización conflictiva por parte del sistema operativo.Como se puede leer en las preguntas frecuentes de Redis :
Redis no necesita tanta memoria como el sistema operativo cree que necesita para escribir en el disco, por lo que puede fallar preventivamente la bifurcación.
Para resolver esto, puedes:
Modificar
/etc/sysctl.conf
y agregar:Luego reinicie sysctl con:
En FreeBSD:
En Linux:
fuente
systemctl status redis
reveló que hay una advertencia que sugiere cambiar exactamente laovercommit_memory=0
configuración. Alterar eso realmente resolvió el problema para mí.Reinicie su servidor redis.
brew services restart redis
.sudo service redis restart
/sudo systemctl restart redis
services.msc
, Enter-> Buscar yRedis
luego haga clic enrestart
.Personalmente tuve este problema después de actualizar redis con Brew (
brew upgrade
). Después de reiniciar la computadora portátil, funcionó de inmediato.fuente
sudo
:brew services stop redis; sudo brew services start redis
.en caso de que esté trabajando en una máquina Linux, también vuelva a verificar los permisos de archivos y carpetas de la base de datos.
La base de datos y la ruta a ella se pueden obtener a través de:
en
redis-cli
:y en la línea de comando
ls -l
. Los permisos para el directorio deben ser 755 , y los del archivo deben ser 644 . Además, normalmente redis-server se ejecuta como el usuarioredis
, por lo tanto, también es bueno darle al usuarioredis
la propiedad de la carpeta mediante la ejecuciónsudo chown -R redis:redis /path/to/rdb/folder
. Esto ha sido elaborado en la respuesta aquí .fuente
Gracias a todos por verificar el problema, aparentemente el error se produjo durante
bgsave
.Para mí, escribir
config set stop-writes-on-bgsave-error no
un shell y reiniciar Redis resolvió el problema.fuente
Inicie Redis Server en un directorio donde Redis tiene permisos de escritura
Las respuestas anteriores definitivamente resolverán su problema, pero esto es lo que realmente está sucediendo:
La ubicación predeterminada para almacenar el
rdb.dump
archivo es./
(denotando el directorio actual). Puede verificar esto en suredis.conf
archivo. Por lo tanto, el directorio desde donde inicia el servidor redis es dondedump.rdb
se creará y actualizará un archivo.Parece que ha comenzado a ejecutar el servidor redis en un directorio donde redis no tiene los permisos correctos para crear el
dump.rdb
archivo.Para empeorar las cosas, redis probablemente tampoco le permitirá apagar el servidor hasta que pueda crear el archivo rdb para garantizar el correcto almacenamiento de los datos.
Para resolver este problema, debe ingresar al entorno activo del cliente redis utilizando
redis-cli
y actualizando ladir
clave y estableciendo su valor en la carpeta de su proyecto o en cualquier carpeta en la que el usuario no root tenga permisos para guardar. Luego, ejecuteBGSAVE
para invocar la creación deldump.rdb
archivo.(Ahora, si necesita guardar el archivo dump.rdb en el directorio en el que inició el servidor, deberá cambiar los permisos para que el directorio pueda escribir en él. Puede buscar en stackoverflow cómo hacerlo). )
Ahora debería poder cerrar el servidor redis. Tenga en cuenta que codificamos el camino. El hardcoding rara vez es una buena práctica y recomiendo iniciar el servidor redis desde el directorio de su proyecto y cambiar el
dir key back to
. / `.De esta forma, cuando necesite redis para otro proyecto, el archivo de volcado se creará en el directorio de su proyecto actual y no en el directorio de proyecto de la ruta codificada.
fuente
redis
así que:sudo chown redis:redis /var/lib/redis
Si está ejecutando MacOS y se ha actualizado recientemente a Catalina, es posible que deba ejecutar
brew services restart redis
como se sugiere en este número .fuente
Encontré este error y pude averiguar en el registro que el error se debe a que el espacio en disco no es suficiente. Todos los datos que se insertaron en mi caso ya no eran necesarios. Así que traté de FLUSHALL. Dado que el proceso redis-rdb-bgsave se estaba ejecutando, tampoco permitía ENJUAGAR los datos. Seguí los pasos a continuación y pude continuar.
El proceso redis-rdb-bgsave ya no se estaba ejecutando después de los pasos anteriores.
fuente
Me enfrenté al problema similar, la razón principal detrás de esto fue el consumo de memoria (RAM) por redis. Mi máquina EC2 tenía 8 GB de RAM (arounf 7.4 disponible para consumo)
Cuando mi programa se estaba ejecutando, el uso de RAM subió a 7.2 GB dejando apenas ~ 100 MB en RAM, esto generalmente desencadena el
MISCONF Redis error ...
Puede determinar el consumo de RAM con el
htop
comando. Busque el atributo Mem después de ejecutar el comando htop. Si muestra un alto consumo (como en mi caso fue de 7.2GB / 7.4GB) Es mejor actualizar las instancias con mayor memoria. En este escenario, el usoconfig set stop-writes-on-bgsave-error no
será un desastre para el servidor y puede provocar la interrupción de otros servicios que se ejecutan en el servidor (si corresponde). Por lo tanto, es mejor evitar el comando config y ACTUALIZAR SU MÁQUINA REDIS .FYI: Puede que necesite instalar htop para que esto funcione:
sudo apt-get install htop
Una solución más a esto puede ser algún otro servicio pesado de RAM que se ejecute en su sistema, verifique si hay otro servicio que se ejecute en su servidor / máquina / instancia y deténgalo si no es necesario. Para verificar todos los servicios que se ejecutan en su máquina, use
service --status-all
Y una sugerencia para las personas que pegan directamente el comando de configuración, por favor investigue un poco y al menos advierta al usuario antes de usar dichos comandos. Y como @Rodrigo mencionó en su comentario: "No se ve bien ignorar los errores".
---ACTUALIZAR---
También puede configurar
maxmemory
ymaxmemory-policy
definir el comportamiento de Redis cuando se alcanza un límite específico de memoria. Por ejemplo, si quiero mantener el límite de memoria de 6 GB y eliminar las claves utilizadas menos recientemente de la base de datos para asegurarme de que el uso de redis mem no supere los 6 GB, entonces podemos establecer estos dos parámetros (en redis.conf o CONFIG SET) mando):Hay muchos otros valores que puede establecer para estos dos parámetros que puede leer sobre esto desde aquí: https://redis.io/topics/lru-cache
fuente
Una solución más permanente podría ser buscar en /etc/redis/redis.conf alrededor de las líneas 200-250 hay configuraciones para las funciones rdb, que no formaban parte de redis en los días 2.x.
notablemente
se puede cambiar a
o puede comentar todas las líneas guardadas y no preocuparse por la persistencia. (Ver los comentarios en /etc/redis/redis.conf)
Además, no olvides
fuente
Todas esas respuestas no explican la razón por la cual falló el guardado de rdb.
como mi caso, revisé el registro de redis y encontré:
ejecuta el siguiente comando en la terminal:
muestra:
¡eso es! este proceso (redis save rdb) es asesinado por OOM killer
se refiere:
https://github.com/antirez/redis/issues/1886
Encontrar qué proceso fue asesinado por el asesino de OOM de Linux
fuente
FWIW, me encontré con esto y la solución fue simplemente agregar un archivo de intercambio a la caja. Usé este método: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04
fuente
Yo también estaba enfrentando el mismo problema. Ambas respuestas (la más votada y la aceptada) solo dan una solución temporal para la misma.
Además,
config set stop-writes-on-bgsave-error no
es una forma horrible de pasar por alto este error, ya que lo que hace esta opción es evitar que Redis notifique que se han detenido las escrituras y seguir adelante sin escribir los datos en una instantánea. Esto simplemente ignora este error. Refiera estoEn cuanto a la configuración
dir
enconfig
redis-cli, una vez que reinicie el servicio de redis, esto también se borrará y aparecerá el mismo error nuevamente. El valor predeterminado dedir
inredis.conf
es./
, y si comienza a redis como usuario root, entonces./
es/
a qué permisos de escritura no se otorgan, y de ahí el error.La mejor manera es establecer el
dir
parámetro en el archivo redis.conf y establecer los permisos adecuados para ese directorio. La mayoría de las distribuciones de Debian lo tendrán en/etc/redis/redis.conf
fuente
Hoy en día, los problemas de acceso de escritura de Redis que le dan este mensaje de error al cliente volvieron a aparecer en los
redis
contenedores oficiales del acoplador.Redis de la
redis
imagen oficial intenta escribir el archivo .rdb en la/data
carpeta de contenedores , lo cual es bastante desafortunado, ya que es una carpeta propiedad de raíz y también es una ubicación no persistente (los datos escritos allí desaparecerán si su contenedor / pod se bloquea).Entonces, después de una hora de inactividad, si ha ejecutado su
redis
contenedor como un usuario no root (por ejemplo, endocker run -u 1007
lugar de predeterminadodocker run -u 0
), obtendrá un mensaje de error muy detallado en el registro de su servidor (verdocker logs redis
):Entonces, lo que debe hacer es asignar la
/data
carpeta del contenedor a una ubicación externa (donde el usuario no root, aquí: 1007, tiene acceso de escritura, como/tmp
en la máquina host), por ejemplo:Por lo que es una mala configuración de la imagen de la ventana acoplable oficial (que debe escribir en
/tmp
no/data
) que produce esta "bomba de tiempo" que es muy probable que el encuentro sólo en la producción ... durante la noche sobre algún fin de semana especialmente silencioso: /fuente
para mi
y recargo mi mac, funciona
fuente
Me encontré con este problema mientras trabajaba en un servidor con espacio en disco AFS porque mi token de autenticación había expirado, lo que produjo
Permission Denied
respuestas cuando el servidor redis intentó guardar. Resolví esto actualizando mi token:kinit USERNAME_HERE -l 30d && aklog
fuente
En caso de que esté usando docker / docker-compose y desee evitar que redis escriba en el archivo, puede crear una configuración de redis y montarla en un contenedor
docker.compose.override.yml
Puede descargar la configuración predeterminada desde aquí
en el archivo redis.conf asegúrese de comentar estas 3 líneas
Puede ver más soluciones para eliminar los datos persistentes aquí.
fuente
En mi caso sucedió porque acabo de instalar
redis
usando la forma rápida. Entonces redis no se está ejecutando como root. Pude resolver este problema siguiendo las instrucciones en laInstalling Redis more properly
sección de su Guía de inicio rápido . Después de hacerlo, el problema se resolvió yredis
ahora se ejecuta como root. Echale un vistazo.fuente
Después de golpearme la cabeza con tantas preguntas SO finalmente, para mí la respuesta de @Axel Advento funcionó pero con unos pocos pasos adicionales, todavía me enfrentaba a los problemas de permisos.
Tuve que cambiar de usuario a
redis
, crear un nuevo directorio en el directorio de inicio y luego configurarlo como el directorio de redis.fuente
En mi caso, estaba relacionado con el espacio libre en disco. (puede verificarlo con el
df -h
comando bash) cuando libero espacio, este error desapareció.fuente
Si está ejecutando Redis localmente en una máquina con Windows, intente "ejecutar como administrador" y vea si funciona. Conmigo, el problema era que Redis estaba ubicado en la carpeta "Archivos de programa", lo que restringe los permisos de forma predeterminada. Como debería.
Sin embargo, no ejecute Redis automáticamente como administrador . No desea otorgarle más derechos de los que se supone que tiene. Quieres resolver esto con el libro.
Por lo tanto, hemos podido identificar rápidamente el problema ejecutándolo como administrador, pero esta no es la solución. Un escenario probable es que haya puesto Redis en una carpeta que no tiene derechos de escritura y, como consecuencia, el archivo DB se almacena en esa misma ubicación.
Puede resolver esto abriendo
redis.windows.conf
y para buscar la siguiente configuración:Cambie
dir ./
a una ruta para la que tenga permisos de lectura / escritura regularesTambién puede simplemente mover la carpeta Redis en su totalidad a una carpeta que sabe que tiene los permisos correctos.
fuente
Para mí fue solo un problema de permisos en la carpeta de datos de redis persistente. Le di un:
¡Y funciona! Puede ser temprano para decir que está resolviendo el problema. Debido a que también sospecho que redis no se está ejecutando como root, entonces necesito inspeccionar mi dockerFile para descubrir más.
fuente
Verifique su registro de Redis antes de tomar cualquier medida. Algunas de las soluciones en este hilo pueden borrar sus datos de Redis, así que tenga cuidado con lo que está haciendo.
En mi caso, la máquina se estaba quedando sin RAM . Esto también puede suceder cuando no hay más espacio libre en disco en el host.
fuente
Tenga en cuenta que este error aparece cuando su servidor está bajo ataque. Acabo de descubrir que redis no puede escribir en '/etc/cron.d/web' donde, después de corregir los permisos, se agregó un nuevo archivo que consiste en un algoritmo de minería con algunas opciones de ocultación.
fuente
fuente
Como señaló @Chris, es probable que el problema se deba a poca memoria. Comenzamos a experimentarlo cuando asignamos demasiada RAM a MySQL (
innodb_buffer_pool_size
).Para garantizar que haya suficiente RAM para Redis y otros servicios, redujimos
innodb_buffer_pool_size
en MySQL.fuente
En mi caso, la razón era muy poco espacio libre en el disco (solo 35 Mb). Hice lo siguiente -
Eliminar el archivo de volcado de redis (si no se necesitan datos existentes)
sudo rm /var/lib/redis/*
Eliminar todas las claves de todas las bases de datos existentes
sudo redis-cli flushall
fuente
debe chmod y chown la nueva carpeta
chown -R redis y chmod ...
fuente