Esta pagina se ve mejor con JavaScript habilitado

Sincronización Redis, bucle infinito

 ·  🎃 kr0m

La sincronización de redis puede ser problemática si el dataset a transferir es de gran tamaño, mientras un master le pasa el dataset a un slave los cambios realizados en el master se guardan en ram, cuando el slave ha recibido los datos del dataset se le pasan los cambios que el master había almacenado.

Si el buffer de cambios en el master es demasiado pequeño para almacenar estos cambios realizados mientras se le transfería el dataset al slave se reiniciará el proceso de sincronización desde cero, esta reinicialización se producirá de forma indefinida formando un bucle infinito.

En los logs del master podremos ver algo parecido a esto:

[4394] 06 Jan 23:42:48.977 # Client addr=X.X.X.X:41702 fd=22 name= age=1287 idle=463 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=19354 omem=536875344 
events=rw cmd=sync scheduled to be closed ASAP for overcoming of output buffer limits.

Vamos a subir los límites del buffer pero debemos tener en cuenta que necesitaremos mas ram en el master para mantener esos cambios adicionales.

Todos los comandos de manipulación de buffers se ejecutarán en el master.

Consultamos los valores actuales para poder revertir el cambio una vez haya finalizado la sincronización:

redis 127.0.0.1:6379> config get client-output-buffer-limit

1) "client-output-buffer-limit"
2) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"

Cambiamos los valores:

redis 127.0.0.1:6379> config set client-output-buffer-limit "slave 536870912 536870912 0"

OK

Nos aseguramos de que se hayan aplicado los cambios:

redis 127.0.0.1:6379> config get client-output-buffer-limit

1) "client-output-buffer-limit"
2) "normal 0 0 0 slave 536870912 536870912 0 pubsub 33554432 8388608 60"

Si el slave sigue sin sincronizar seguiremos aumentando el buffer en el master hasta que la sincronización finalize satisfactoriamente.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí