Redis Sentinel (parte 1)

Redis es un gestor de bases de datos nosql clave-valor que por si mismo no funciona en alta disponibilidad. Para conseguir la alta disponibilidad se utiliza sentinel que ya viene con redis desde la versión 2.8.

En este artículo indico como conseguir un redis en HA y como usarlo desde python ahorrándote unas horas de aprendizaje.

Si no tienes conocimientos básicos de clustering tendrás que hacer un acto de fe cuando diga ciertas cosas como que necesitamos al menos tres servidores. No voy a explicarlo en este artículo.

Como funciona

Sistemas

Redis se puede configurar en un conjunto de réplica con un primario y múltiples secundarios. El problema es que no tenemos failover, es decir, si se cae el redis primario todo el sistema deja de funcionar.

Para solucionar el problema, en vez de dotar de failover al propio redis, se ha creado otro componente llamado sentinel que monitoriza a los redis y es capaz de reconfigurar el replicaset para volver a otro estado estable y avisar a los clientes en caso de caída de un nodo de la réplica.p>

Salvando las distancias, es como si en mongodb tuviéramos 3 nodos árbitros y tres nodos de datos sin capacidad de votación. 6 procesos en total.

Desarrollo

Cuando te ofrecen un redis con un primario para hacer las escrituras y un secundario para lecturas asíncronas que seguramente pasarás de usar por si tiene datos desfasados, si se cae el primario tu programa dejará de funcionar.

Para solucionar ese problema, en vez de acceder directamente al redis, accederemos a sentinel que nos dirá cual es el nodo primario de redis y una vez tengamos esa información ya podremos acceder al redis primario.

Es solo agregar una línea más de código.

Despliegue

Necesitas tres servidores que llamaremos redis-01, redis-02 y redis-03.

Por si no quieres montarlos te los puedes bajar de los tres enlaces anteriores. Son contenedores lxc comprimidos así que para usarlos instala lxc con un

sudo apt-get install lxc
los descomprimes en /var/lib/lxc/ y los arrancas con
sudo lxc-start -n redis-01 -d
sudo lxc-start -n redis-02 -d
sudo lxc-start -n redis-03 -d
Puedes conectarte con root/root a las direcciones 10.0.3.201, 10.0.3.202 y 10.0.3.203.

Replica set

Tras instalar redis, nos aseguramos de que en /etc/redis.conf escuche en todas las interfaces comentando la línea:

bind_ip=127.0.0.1

Elegimos uno de los tres como primario y configuramos el resto como esclavos con un:

redis-cli
slaveof 10.0.3.201 6379

Tras hacerlo en los dos esclavos ejecutamos info en el maestro para comprobar que están replicando adecuadamente:

redis-cli
info

Sentinel

Viene junto con redis a partir de la versión 2.8 así que ya lo tendrás instalado sin saberlo.

Lo único que hay decirle a los sentinel es la ip y puerto del primario en la replica set. Con eso sacará cuales son los demás nodos del replica set y los demás sentinel que se hayan conectado a ese maestro.

En /etc/redis/redis-sentinel.conf de todos cambia esta línea

sentinel monitor mymaster 127.0.0.1 6379 2
Por esta otra
sentinel monitor mymaster 10.0.3.201 6379 2
Y ejecutar
redis-sentinel /etc/redis/redis-sentinel.conf
en los tres servidores.