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
5. Verificar el uso de memoria en el servidor
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
6.2 Verificamos el uso de la memoria
6.3 Verificamos que un siga funcionando
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/