2012-02-10 17 views
26

Hemos configurado el servidor Redis con un maestro y dos esclavos. Si mi maestro falla, ¿cómo podemos manejar la conmutación por error sin reiniciar el servidor Redis?Redis Fail Over

Respuesta

30

Actualización:

Hoy en día, recomendaría retirar redis-sentinel, una herramienta de autor antirez Redis' para el seguimiento y recuperación automática.

respuesta original:

Comprobar la SLAVEOF comando: http://redis.io/commands/slaveof

Cuando descubre que su maestro falla, un tema SLAVEOF NO ONE en uno de sus esclavos para promoverlo de dominar. Luego señala a tu otro esclavo con su nuevo maestro. Consulte también "Actualización o reinicio de una instancia de Redis sin tiempo de inactividad": http://redis.io/topics/admin

Para gestionar archivos de configuración, puede hacer algo en esta línea (precaución: no probado, solo como ejemplo). El ejemplo siguiente supone dos archivos de configuración para cada servidor (/etc/redis/server1.master.conf, /etc/redis/server1.slave.conf, etc), una de ellas con ese servidor como esclavo de algún maestro predefinido:

#!/bin/sh 

master() 
{ 
    server_name=$1 
    redis-cli slaveof no one 
    ln -sf /etc/redis/$server_name.master.conf /etc/redis/$server_name.conf 
} 

# Usage: slave(server1 server2 6379) 
slave() 
{ 
    server_name=$1 
    master=$2 
    master_port=$3 
    redis-cli slaveof $master $master_port 
    ln -sf /etc/redis/$server_name.slave.conf /etc/redis/$server_name.conf 
} 

En lugar de tener los archivos de configuración predefinidos, puede editarlos en la mosca con, por ejemplo, sed. Básicamente, asegúrese de tener siempre una estrofa slaveof en los archivos de configuración, ya sea apuntando a un maestro o slaveof no one. Vuelva a grabar la configuración mediante sed (de nuevo, no probado, sólo significaba como alimento para el pensamiento):

#!/bin/sh 

master() 
{ 
    server_name=$1 
    config=$server_name.conf 
    redis-cli slaveof no one 
    sed -i "s/^slaveof.*/slaveof no one/" $config 
} 

# Usage: slave(server1 server2 6379) 
slave() 
{ 
    server_name=$1 
    config=$server_name.conf 
    master=$2 
    master_port=$3 
    redis-cli slaveof $master $master_port 
    sed -i "s/^slaveof.*/slaveof $master $master_port/" $config 
} 
+0

Gracias Linus, he tratado de que en el cliente Redis su funcionamiento muy bien, pero la forma de cambiar el mismo en conf Redis sobre la marcha, ¿Hay alguna secuencia de comandos disponibles para eso? Gracias – vijay

+0

Gran! I don' Saber qué biblioteca de cliente de redis utiliza, pero supongo que tiene un comando 'slaveof'. Para los archivos de configuración, puede tener dos configuraciones para cada servidor, una para esclavo y otra para maestro, y enlace simbólico entre ellas. –

1

recomendaría mirar en Redis Cluster (versión 3.2 como última estable hoy en día). Cluster: este es un nuevo enfoque, ya no hay centinelas. El principio de falla es el mismo, el esclavo se promueve para dominar en caso de que el maestro esté inactivo y una nueva funcionalidad más, incluida la lógica de fusión compatible con Redis. La aplicación solo necesita conectarse al clúster que tiene un conjunto de nodos, eso es todo.

Si hablamos de falla general, tenga en cuenta que Redis Cluster no garantiza una gran consistencia.

Encuentre fragmento de: http://redis.io/topics/cluster-tutorial

"Cluster Redis no es capaz de garantizar la consistencia fuerte En términos prácticos, esto significa que bajo ciertas condiciones es posible que Redis Cluster perderá escrituras que eran. reconocido por el sistema para el cliente.

la primera razón por la Redis Cluster puede perder escrituras se debe a que utiliza la replicación asíncrona.

Hay otro escenario notable en el que Redis Cluster perderá escrituras, que ocurre durante una partición de red donde un cliente está aislado con una minoría de instancias que incluye al menos un maestro."