MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

By raymundoortega Sept. 3, 2024, 10:20 p.m. redis

Este error ocurre debido a que el BGSAVE falla, la razon por la que falla es ya sea por que no hay espacio suficiente en disco, pero mayormente es por que el fork de redis no tiene la memoria ram suficiente para asignar, es decir redis siempre requiere el doble de memoria que se este utilizando en el sistema operativo si el sistema operativo tiene 2GB de ram y se esta usando 1.2GB esto provocara el error ya mencionado ya que el fork de redis necesitara 2.4GB de RAM, esto se debe a una configuración de parte del sistema operativo.

Para simular este error y como solucinarlo se usara un servidor Ubuntu 18.0.4 de 2G de Ram y se seguiran los siguientes pasos:

1.Instalar el Redis en un servidor de 2GB de memoria

https://www.digitalocean.com/community/tutorials/como-instalar-y-proteger-redis-en-ubuntu-18-04-es

2. Instalar pipenv e instalamos redis en un entorno

  sudo apt install python3-pip
  sudo pip3 install pipenv
  pipenv shell

  pip install redis

3. Crear un archivo python con el siguiente script

  import random
  import string
  import uuid
  import redis

  MEM_GB = 2 * 1024**3
  KEY_SIZE = 1024**2
  TOTAL_KEYS = 100
  def gen_data():
      return ''.join([random.choice(string.ascii_letters + string.digits) for x in range(1024)]) * 1024

  r = redis.StrictRedis()

  for i in range(TOTAL_KEYS):
      r.set(str(uuid.uuid4()), gen_data())

Lo que hara este script es crear llaves aleatorias en redis con un tamaño 1M por cada una, en este script se crearan 100 llaves las cuales seran 100M en memoria ram

4. Ejecutamos el script

python ejemplo.py

5. Verificar el uso de memoria en el servidor

    htop

Si se crearon mas de 1000 llaves el uso de memoria debe ser mayor al 1GB

6. Verificar el uso de memoria en el redis y veficar que siga funcionando

6.1 Entramos al redis

redis-cli

6.2 Verificamos el uso de la memoria

 info memory

6.3 Verificamos que un siga funcionando

BGSAVE

Si devulve un Background saving started esta funcionando correctamente pero si devuelve (error) ERR quiere decir que el error de memoria ha ocurrido

Y para ver exactamente el error hay que ir al log de redis

sudo tail -f /var/log/redis/redis-server.log

Si en el log muestra algo como Can't save in background: fork: Cannot allocate memory quiere decir que el error de memoria de redis ha ocurrido

OBSERVACIONES: En nuestro caso repetimos los pasos del 4 al 6 unas 7 veces, esto para saber en que uso de memoria Ram ocurría el error, cuando se llego a la séptima vez que repetimos los pasos el uso de memoria era de 8.5 de los cuales 7 eran usados por redis y el resto por el sistema operativo, al parecer no necesariamente tiene que pasar el 50% de la memoria ram para que ocurra el error.

SOLUCIÓN

Para solicionar este error se ejecutara el siguiente comando en el servidor

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

Agregar al archivo /etc/sysctl.conf la variable vm.overcommit_memory = 1, esto hara que cuando se reinicie el servidor no pierda esa configuración

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

Ponemos en memoria la variable vm.overcommit_memory=1, esto hara que se solucione el problema, cuando el servidor se reinicia se pierde esta configuracion

sysctl vm.overcommit_memory=1

Verificamos que la variable esta configurada

sysctl vm.overcommit_memory

Lo que hara esta configuración es hacer que el sistema operativo realice la asignación de memoria de una mas optimista para el fork de redis.

Finalmente para verificar que el error se soluciono correctamente podemos realizar el paso 6.3

Fuentes: https://jobs.zalando.com/en/tech/blog/understanding-redis-background-memory-usage/?gh_src=4n3gxh1 https://blog.sakuragawa.moe/debugging-misconf-redis-is-configured-to-save-rdb-snapshots/