Expansión horizontal de clústeres de alta disponibilidad de redis

Aunque Redis3.0 y las versiones posteriores tienen la función de clúster y brindan mayor rendimiento y disponibilidad que el modo centinela de la versión anterior, la expansión horizontal del clúster es más problemática. Hoy, les mostraré cómo el clúster de alta disponibilidad de Redis puede Expansión, el clúster original (ver la figura a continuación) consta de 6 nodos, que se distribuyen en tres máquinas, utilizando un modelo de tres maestros y tres esclavos

1. Inicie el clúster

# Iniciar todo el clúster

cd /usr/local/redis-cluster
bin/redis-server 9001/redis.conf
bin/redis-server 9002/redis.conf
bin/redis-server 9003/redis.conf
bin/redis-server 9004/redis.conf
bin/redis-server 9005/redis.conf
bin/redis-server 9006/redis.conf

# El cliente se conecta a la instancia de redis del puerto 9001

bin / redis-cli -a smsp -c -h 10.18.4.25 -p 9001

Como se puede ver en la figura anterior, todo el clúster está funcionando normalmente, con tres nodos maestros y tres nodos esclavos. El nodo de instancia en el puerto 9001 almacena las ranuras hash 0-5460, y el nodo de instancia en el puerto 9002 almacena las ranuras hash 5461- 10922 y el puerto 9003. El nodo de instancia almacena las ranuras hash 10923-16383. Todas las ranuras hash almacenadas por los tres nodos maestros forman las ranuras de almacenamiento del clúster redis. Los puntos esclavos son los nodos esclavos de respaldo de cada nodo maestro, y el las ranuras de almacenamiento no se muestran.  

2. Operación de clúster

Agregamos un maestro (9007) y un esclavo (9008) sobre la base del clúster original. El clúster después de agregar los nodos se muestra en la figura a continuación, y los nuevos nodos están representados por cuadros discontinuos.

Aumentar la instancia de redis

Los dos nodos 9007 y 9008 se colocan en la máquina 10.18.4.28, el proceso de creación es exactamente el mismo que el de los primeros tres grupos, ¡solo comienza después de la creación!

Ver la ayuda de comandos para el clúster de redis

cd /usr/local/redis-5.0.0

src / redis-cli --cluster help

  • crear: crea un entorno de clúster host1: puerto1 ... hostN: puertoN
  • llamada: puede ejecutar comandos de redis
  • add-node: agrega un nodo al clúster, el primer parámetro es la ip: puerto del nuevo nodo y el segundo parámetro es la ip: puerto de cualquier nodo existente en el clúster
  • del-node: eliminar un nodo
  • reshard: reshard
  • comprobar: comprobar el estado del clúster

Configurar 9007 como nodo maestro del clúster

# Use el comando add-node para agregar un nodo maestro 9007 (maestro), el verde es un nuevo nodo y el rojo es un nodo conocido. Al final del registro, hay "[OK] Nuevo nodo agregado correctamente" indicando que el nuevo nodo se agregó correctamente

bin / redis-cli -a smsp --cluster add-node 10.18.4.28:9007 10.18.4.25:9001

# Ver el estado del clúster

Nota: Cuando el nodo se agrega con éxito, el nuevo nodo no tendrá ningún dato, ya que no ha asignado ninguna ranura (ranura hash), necesitamos asignar manualmente la ranura hash para el nuevo nodo.

# Utilice el comando redis-cli para asignar ranuras hash para 9007, busque cualquier nodo maestro en el clúster (la posición roja indica cualquier nodo maestro en el clúster) y vuelva a fragmentarlo.

[root @ smsp-dev001-10 redis-cluster] # bin / redis-cli -a smsp --cluster reshard 10.18.4.25:9001

El resultado es el siguiente:

... ...

¿Cuántas ranuras desea mover (de 1 a 16384)? 600

(PD: cuántas ranuras se necesitan para pasar al nuevo nodo, configurado por usted mismo, como 600 ranuras hash)

¿Cuál es el ID del nodo receptor? 7430f93681e95eb176ce036d171bf126ae67697d

(PD: A qué nodo mover estas ranuras de 600 hash, debe especificar la identificación del nodo, aquí está la identificación del nodo 9007)

Introduzca todos los ID de nodo de origen.

  Escriba 'todos' para usar todos los nodos como nodos de origen para las ranuras hash.

  Escriba 'listo' una vez que haya ingresado todos los ID de los nodos de origen.

Nodo de origen 1: todos

(ps: ingrese todos para extraer el número correspondiente de ranuras de todos los nodos maestros (9001, 9002, 9003) y asígnelos al nuevo nodo. El número total de ranuras extraídas es 600)

 ... ...

¿Quiere continuar con el plan de restauración propuesto (sí / no)?

(ps: ingrese sí para confirmar el inicio de la tarea de fragmentación)

# Ver el estado más reciente del clúster

Como se muestra en la figura anterior, nuestro 9007 ahora tiene una ranura hash, lo que significa que podemos leer y escribir datos en el 9007 . Hasta ahora, nuestro 9007 se ha agregado al clúster y es el nodo maestro (maestro)

9008 es el nodo esclavo de 9007

# Agregue el nodo esclavo 9008 al clúster y vea el estado del clúster

[root @ smsp-dev001-10 redis-cluster] # bin / redis-cli -a smsp --cluster add-node 10.18.4.28:9008 10.18.4.25:9001

Como se muestra en la figura, sigue siendo un nodo maestro y no se le han asignado ranuras hash.

# Necesitamos ejecutar el comando replicate para especificar el ID del nodo maestro del nodo actual (nodo esclavo). Primero, necesitamos conectarnos al cliente del nodo 9008 recién agregado, y luego usar el comando cluster para operar, asignar el nodo actual 9008 (esclavo) a Debajo de un nodo maestro (aquí se usa el nodo maestro 9007 creado antes, y el rojo indica la identificación del nodo )

bin / redis-cli -a smsp -c -h 10.18.4.28 -p 9008

10.18.4.28:9008> réplica de clúster 7430f93681e95eb176ce036d171bf126ae67697d

# Ver el estado del clúster, el nodo 9008 se ha agregado correctamente como nodo esclavo del nodo 9007

 Eliminar el nodo esclavo 9008

# Use del-node para eliminar el nodo esclavo 9008, especifique la IP y el puerto de eliminación del nodo, y la identificación del nodo (el rojo es la identificación del nodo 9008)

bin / redis-cli -a smsp --cluster del-node 10.18.4.28:9008 8ff4bb628a9c22828ca434674bfd60cc1c52fd25

# Verifique el estado del clúster nuevamente, como se muestra en la figura a continuación, el nodo esclavo 9008 se ha eliminado y el servicio redis de este nodo también se ha detenido

Eliminar el nodo maestro 9007

Finalmente, intentamos eliminar el nodo maestro 9007 previamente agregado. Este paso es relativamente problemático. Debido a que el nodo maestro tiene una ranura hash asignada, primero debemos colocar la ranura hash en 9007 en otros maestros disponibles. Vaya al nodo, y luego elimine la operación del nodo, de lo contrario habrá problemas de pérdida de datos (actualmente solo los datos del maestro se pueden migrar a un nodo y la función de distribución promedio no se puede realizar temporalmente), ejecute el comando de la siguiente manera:

bin / redis-cli -a smsp --cluster reshard 10.18.4.28:9007

El resultado es el siguiente:

 ... ...

¿Cuántas ranuras desea mover (de 1 a 16384)? 600

¿Cuál es el ID del nodo receptor? 2349fa527eebba23a4c2749c56c9ee5a8b0d1812

( ps: ¿Dónde se moverán los datos aquí? La identificación del nodo maestro de 9001)

Introduzca todos los ID de nodo de origen.

  Escriba 'todos' para usar todos los nodos como nodos de origen para las ranuras hash.

  Escriba 'listo' una vez que haya ingresado todos los ID de los nodos de origen.

Nodo de origen 1: 7430f93681e95eb176ce036d171bf126ae67697d

( ps: aquí está la fuente de datos, que es nuestra identificación de nodo 9007 )

Nodo de origen 2: hecho

( ps: ingrese directamente hecho aquí para comenzar a generar el plan de migración)

 ... ...

¿Desea continuar con el plan de restauración propuesto (sí / no)?

( ps: ingrese sí aquí para comenzar la migración)

En este punto, hemos migrado con éxito los datos del nodo maestro 9007 a 8001. Podemos echar un vistazo al estado actual del clúster como se muestra en la siguiente figura. Verá que no hay una ranura hash debajo de 9007, lo que prueba que ¡la migración es exitosa!

# Finalmente, podemos usar directamente el comando del-node para eliminar el nodo maestro 9007 (el rojo indica la identificación del nodo 9007).

bin / redis-cli -a smsp --cluster del-node 10.18.4.28:9007 7430f93681e95eb176ce036d171bf126ae67697d

# Verifique el estado del clúster, ¡todo se restaura al estado inicial! ¡Eso es todo!

# En este momento, encontrará que las ranuras entre 9001, 9002 y 9003 no son iguales y puede realizar la operación de reequilibrio para equilibrar la carga de las ranuras. (El rojo es cualquier nodo superviviente)

bin / redis-cli -a smsp - rebalanceo del clúster 10.18.4.25:9001

Se puede ver que algunas de las ranuras en 9001 se movieron a 9002 y 9003, porque cuando se acaba de eliminar 9007, las 600 ranuras en él se movieron a 9001 (actualmente no se admite mover a varios nodos de destino)

Vuelva a comprobar la distribución de las tragamonedas, ¡se ha distribuido uniformemente!

3. Análisis del principio de elección del clúster de Redis

Cuando el esclavo descubre que su maestro pasa al estado FAIL, intenta realizar una conmutación por error para convertirse en el nuevo maestro. Dado que el maestro colgado puede tener varios esclavos, existe un proceso en el que varios esclavos compiten para convertirse en el nodo maestro. El proceso es el siguiente:

1. El esclavo descubre que su maestro se convierte en FALLO

2. Agregue 1 al cluster currentEpoch registrado por usted mismo y transmita la información de FAILOVER_AUTH_REQUEST  .

3. Cuando otros nodos reciben la información, solo el maestro responde (solo el nodo maestro tiene derecho a votar) , juzga la legitimidad del solicitante y envía FAILOVER_AUTH_ACK , y solo envía un acuse de recibo una vez por cada época.

4. Intente realizar una conmutación por error del esclavo para recopilar  FAILOVER_AUTH_ACK

5. Conviértete en el nuevo maestro después de más de la mitad

6. Transmita Pong para notificar a otros nodos del clúster.

¡la información del clúster puede verificar el ciclo de elección del clúster!

El nodo esclavo no intenta iniciar una elección tan pronto como el nodo maestro entra en el estado FAIL, pero hay un cierto retraso. Un cierto retraso asegura que esperemos a que el estado FAIL se propague en el clúster. Si el esclavo intenta elegir inmediatamente, otros maestros pueden no darse cuenta del estado FALLO., Puede negarse a votar

• Fórmula de cálculo de retardo:

 DELAY = 500ms + aleatorio (0 ~ 500ms) + SLAVE_RANK * 1000ms

• SLAVE_RANK representa el rango de la cantidad total de datos que este esclavo ha copiado del maestro. Cuanto menor sea el rango, más nuevos serán los datos que se han copiado. Cuanto menor sea el Rango, menor será la demora, de esta manera, el esclavo que tenga los últimos datos iniciará la elección primero (en teoría).

 

 

Supongo que te gusta

Origin blog.csdn.net/u014225733/article/details/103051314
Recomendado
Clasificación