commands - MISCONF Redis está configurado para guardar instantáneas RDB
redis vs mongodb (18)
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 archivo rdb.dump
es ./
(que denota el directorio actual). Puedes verificar esto en tu archivo redis.conf
. Por lo tanto, el directorio desde donde inicia el servidor redis es donde se creará y actualizará un archivo dump.rdb
.
Parece que ha comenzado a ejecutar el servidor redis en un directorio donde redis no tiene los permisos correctos para crear el archivo dump.rdb
.
Para empeorar las cosas, redis probablemente tampoco le permitirá cerrar el servidor hasta que sea capaz de crear el archivo rdb para garantizar el correcto almacenamiento de datos.
Para resolver este problema, debe ingresar al entorno de cliente redis activo usando redis-cli
y actualizar la tecla dir
y establecer su valor en la carpeta de su proyecto o en cualquier carpeta donde no root tenga permisos para guardar. Luego ejecute BGSAVE
para invocar la creación del archivo dump.rdb
.
CONFIG SET dir "/hardcoded/path/to/your/project/folder"
BGSAVE
(Ahora, si necesita guardar el archivo dump.rdb en el directorio en el que inició el servidor, deberá cambiar los permisos del directorio para que redis pueda escribir en él. Puede buscar stackoverflow para saber cómo hacerlo. ).
Ahora debería poder apagar el servidor redis. Tenga en cuenta que hemos codificado el camino. La codificación no suele ser una buena práctica y recomiendo encarecidamente iniciar el servidor redis desde el directorio de su proyecto y dir key back to
cambiar la dir key back to
.
CONFIG SET dir "./"
BGSAVE
De esa manera, cuando necesite redisección para otro proyecto, el archivo de volcado se creará en el directorio de su proyecto actual y no en el directorio del proyecto de la ruta codificada.
Durante las escrituras a Redis ( SET foo bar
) recibo 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 no haya ningún intento de resolver el problema.
Como lo señaló @Chris, es probable que el problema sea de poca memoria. Comenzamos a experimentarlo cuando innodb_buffer_pool_size
demasiada RAM a MySQL ( innodb_buffer_pool_size
).
Para asegurarnos de que haya suficiente RAM para Redis y otros servicios, redujimos innodb_buffer_pool_size
en MySQL.
Demasiado breve acerca de la respuesta. Abre el terminal y escribe los siguientes comandos.
redis-cli
y ahora escribe
config set stop-writes-on-bgsave-error no
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 archivo rdb
o su directorio incorrectamente, o quedándose sin espacio en el disco), siempre puede redirigir el archivo rdb
para que se escriba en algún lugar más.
Usando redis-cli
, puedes hacer algo como esto:
CONFIG SET dir /tmp/some/directory/other/than/var
CONFIG SET dbfilename temp.rdb
Después de esto, es posible que desee ejecutar un comando BGSAVE
para asegurarse de que los datos se escribirán en el archivo rdb
. Asegúrese de que cuando ejecute INFO
, bgsave_in_progress
ya sea 0
(ya sea que la operación sea exitosa o se encuentre un error). Después de eso, ahora puede iniciar la copia de seguridad del archivo rdb
generado en algún lugar seguro.
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 db y el camino a ella se pueden obtener a través de:
en redis-cli
:
CONFIG GET dir
CONFIG GET dbfilename
y en la linea de comandos 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 usuario redis
, por lo tanto, también es bueno darle al usuario redis
la propiedad de la carpeta ejecutando sudo chown -R redis:redis /path/to/rdb/folder
. Esto ha sido elaborado en la respuesta here .
En mi caso, la razón era el espacio libre en disco muy bajo (solo 35 Mb). Hice lo siguiente
- Se detuvieron todos los procesos relacionados con Redis.
- Eliminar algunos archivos en el disco para hacer suficiente espacio libre
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
- reinicie todas las tareas de apio y verifique los registros correspondientes para cualquier problema
Encontré este error y pude deducir del 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 fueron necesarios. Así que traté de FLUSHALL. Dado que el proceso redis-rdb-bgsave se estaba ejecutando, no permitía FLUSH los datos también. Seguí los siguientes pasos y pude continuar.
- Inicia sesión para redis cliente
- Ejecute el conjunto de configuración stop-writes-on-bgsave-error no
- Ejecutar FLUSHALL (Los datos almacenados no fueron necesarios)
- Ejecute el conjunto de configuración stop-writes-on-bgsave-error yes
El proceso redis-rdb-bgsave ya no se estaba ejecutando después de los pasos anteriores.
Encontré este problema mientras trabajaba en un servidor con espacio en disco AFS porque mi token de autenticación había caducado, lo que produjo respuestas de Permission Denied
cuando el servidor redis intentó guardar. Resolví esto refrescando mi token:
kinit USERNAME_HERE -l 30d && aklog
Este error se produce debido a un error de BGSAVE. Durante BGSAVE, Redis realiza un proceso secundario para guardar los datos en el disco. Aunque la razón exacta de la falla de BGSAVE se puede verificar desde los registros (generalmente en /var/log/redis/redis-server.log
en máquinas Linux) pero muchas de las 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 redis.io/topics/faq :
El esquema de ahorro de fondo de Redis se basa en la semántica de copia en escritura de los sistemas operativos modernos: la redis forks (crea un proceso secundario) que es una copia exacta del padre. El proceso hijo vuelca el DB en el disco y finalmente sale. En teoría, el niño debería usar tanta memoria como el padre como copia, pero en realidad, gracias a la semántica de copia en escritura implementada por la mayoría de los sistemas operativos modernos, el proceso padre e hijo compartirán las páginas de la memoria común. Una página se duplicará solo cuando cambie en el elemento secundario o en el principal. Como en teoría todas las páginas pueden cambiar mientras el proceso secundario se está guardando, Linux no puede saber de antemano cuánta memoria tomará el niño, por lo que si la configuración de overcommit_memory se establece en cero, la bifurcación fallará a menos que haya tanta RAM libre como se requiere para duplicar realmente todas las páginas de memoria principal, con el resultado de que si tiene un conjunto de datos Redis de 3 GB y solo 2 GB de memoria libre, se producirá un error.
Establecer overcommit_memory en 1 dice que Linux se relajará y ejecutará la bifurcación en una forma de asignación más optimista, y esto es realmente lo que desea para Redis.
Redis no necesita tanta memoria como el sistema operativo cree que hace para escribir en el disco, por lo que puede fallar preventivamente la bifurcación.
Para resolver esto, puedes:
Modifique /etc/sysctl.conf
y agregue:
vm.overcommit_memory=1
Luego reinicie sysctl con:
En FreeBSD:
sudo /etc/rc.d/sysctl reload
En Linux:
sudo sysctl -p /etc/sysctl.conf
FWIW, me encontré con esto y la solución fue simplemente agregar un archivo de intercambio a la caja. Utilicé este método: https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04
Gracias a todos por revisar el problema, aparentemente el error se produjo durante bgsave
.
Para mí, escribir config set stop-writes-on-bgsave-error no
en un shell y reiniciar Redis resolvió el problema.
Puede haber errores durante el proceso bgsave debido a poca memoria. Prueba esto
echo ''vm.overcommit_memory = 1'' >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
Puedes detenerlo intentando guardar la instantánea:
config set stop-writes-on-bgsave-error no
Esta es una solución rápida, pero si le interesan los datos para los que la está utilizando, debe verificar para asegurarse de que bgsave haya fallado en primer lugar.
Si está ejecutando Redis localmente en una máquina con Windows, intente "ejecutar como administrador" y ver si funciona. En mi caso, el problema era que Redis se encontraba en la carpeta "Archivos de programa", 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 que se supone que tiene. Quieres resolver esto por el libro.
Por lo tanto, hemos podido identificar rápidamente el problema ejecutándolo como administrador, pero no es la solución. Un escenario probable es que haya puesto a Redis en una carpeta que no tiene derechos de escritura y, como consecuencia, el archivo DB se almacena en la misma ubicación.
Puede resolver esto abriendo el redis.windows.conf
y busque la siguiente configuración:
# 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 ./
Cambie dir ./
a una ruta para la que tenga permisos regulares de lectura / escritura
También puede simplemente mover la carpeta Redis en su totalidad a una carpeta que sepa que tiene los permisos correctos.
Solución para @Govind Rai''s ''para guardar el archivo dump.rdb en el directorio en el que inició el servidor'':
Haga clic con el botón derecho en su carpeta Redis, haga clic en Propiedades y luego haga clic en la pestaña Seguridad. Haga clic en Editar para abrir el cuadro de diálogo Permisos para.
Haga clic en TODOS LOS PAQUETES DE APLICACIÓN
En el cuadro Permisos para, seleccione la casilla de verificación Permitir ''Control total''.
Todas esas respuestas no explican la razón por la que falló el guardado de rdb.
como mi caso, revisé el registro de redis y encontré:
14975: M 18 de junio 13: 23: 07.354 # El ahorro de fondo terminó con la señal 9
Ejecuta el siguiente comando en la terminal:
sudo egrep -i -r ''killed process'' /var/log/
muestra:
/var/log/kern.log.1:Jun 18 13:23:07 10-10-88-16 kernel: [28152358.208108] Proceso muerto 28416 (redis-server) vm total: 7660204kB, anon-rss: 2285492kB, archivo-rss: 0kB
¡eso es! este proceso (redis save rdb) es asesinado por OOM killer
se refiere:
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 características de rdb, que no eran parte de redis en los días 2.x.
notablemente
dir ./
se puede cambiar a
dir /home/someuser/redislogfiledirectory
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
service redis-server stop
service redis-server start
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, el config set stop-writes-on-bgsave-error no
es una manera horrible de pasar por alto este error, ya que lo que hace esta opción es evitar que redis notifique que las escrituras se han detenido y seguir adelante sin escribir los datos en una instantánea. Esto es simplemente ignorar este error. Refiera esto
En cuanto a configurar dir
en config
en redis-cli, una vez que reinicie el servicio de redis, esto también se borrará y el mismo error volverá a aparecer. El valor predeterminado de dir
en redis.conf
es ./
, y si inicia redis como usuario root, entonces ./
es /
para el cual no se conceden los permisos de escritura y, por lo tanto, el error.
La mejor manera es establecer el parámetro dir
en el archivo redis.conf y establecer los permisos adecuados para ese directorio. La mayoría de las distribuciones debian lo tendrán en /etc/redis/redis.conf