Redis Scaling y Failover para servicios DirectumRX

Redis es un sistema de gestión de base de datos de clase NoSQL (DBMS no relacional) que está completamente en RAM. Para acceder a los datos, se utiliza el modelo "clave" - ​​"valor". Tal DBMS se usa a menudo para almacenar cachés en servicios escalables, para almacenar imágenes y datos pequeños.

Redis DBMS es ampliamente utilizado debido a:

  • alta velocidad, porque todos los datos se almacenan en la RAM;
  • multiplataforma;
  • distribución bajo la licencia BSD (se aplica al software de código abierto).

La amplitud de distribución y aplicabilidad de Redis se puede estimar por la gran cantidad de documentación con todo tipo de casos en el sitio web oficial del proyecto .

Si usa la escala horizontal de los servicios de DirectumRX, debe usar la instalación a prueba de fallas de Redis para que funcione correctamente con el servicio de almacenamiento DirectumRX y el servicio de acceso web DirectumRX.

imagen

Redis almacenará datos operativos, cachés y otra información que sea necesaria para la operación de los servicios en modo de escala para que el proceso de interacción del usuario con el sistema no dependa de la instalación con la que está trabajando actualmente.

Redis no almacenará datos confidenciales y no estará bajo una gran carga. Pero en el caso de una falla de Redis, los usuarios experimentarán muchos errores al cambiar entre instalaciones.

En el sitio web oficial de Redis, hay 2 formas de garantizar la escala horizontal y la tolerancia a fallos:

  1. Usando Redis Sentiel .
  2. Usando Redis Cluster .

Considere personalizar estas opciones.

Configurar Redis Sentiel


La opción que usa Redis Sentiel (Redis Tracking Node) se implementó en Redis 2.4 y consiste en usar el servicio adicional Redis Sentiel para monitorear la disponibilidad del asistente. También realiza la configuración de nodos de réplica en caso de falla del asistente. Determina cuál de los nodos SLAVE se convertirá en MAESTRO y realizará la reconfiguración sobre la marcha.

Implementa el esquema clásico:

imagen

Puede haber muchos nodos SLAVE (hasta 1000 según el sitio web oficial), para un trabajo productivo se recomienda utilizar al menos dos nodos SLAVE.

Normalmente, el esquema se configura de tal manera que el servicio Redis Sentiel se configura en los nodos MAESTRO y ESCLAVO, y si el nodo MAESTRO falla, los nodos de monitoreo restantes deciden introducir un nuevo MAESTRO.

La versión actual de Redis está disponible para su descarga desde el sitio web oficial del desarrollador del producto . Sin embargo, el sitio de distribución solo está disponible para Linux. En un momento, el proyecto de Microsoft para portar Redis a Windows se estaba desarrollando, pero en la actualidad el proyecto detuvo el desarrollo en la versión 3.2.100, por lo que en este artículo consideraremos la opción de implementación más relevante: en Linux.

Como nodos de prueba, utilizaremos dos hosts virtuales redis1 y redis2 con la distribución Linux instalada de Debian 10.

Primero, actualice las listas de paquetes desde el repositorio predeterminado e instale Redis:

apt-get update && apt-get upgrade apt install redis-server 

Comprueba la versión:

 root@redis1:/home/user# redis-server -v Redis server v=5.0.3 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=afa0decbb6de285f 

Deje que redis1 actúe como un nodo MAESTRO y redis2 actúe como un nodo ESCLAVO.

Para hacer esto, escribimos en los archivos de configuración de Redis los parámetros necesarios que le permitirán crear una réplica (aún no tolerante a fallas).

Para redis1 en el archivo de configuración /etc/redis/redis.conf, especifique:

 # ,   MASTER     . requirepass TestPass 

Para redis2 en el archivo de configuración /etc/redis/redis.conf, especifique:

 #   MASTER  . slaveof redis1 6379 #      . masterauth TestPass #   ,         . requirepass TestPass 

Reinicie los servicios de redis-server en ambos nodos:

 root@redis1:/etc/redis# /etc/init.d/redis-server stop [ ok ] Stopping redis-server (via systemctl): redis-server.service. root@redis1:/etc/redis# /etc/init.d/redis-server start [ ok ] Starting redis-server (via systemctl): redis-server.service. root@redis2:/etc/redis# /etc/init.d/redis-server stop [ ok ] Stopping redis-server (via systemctl): redis-server.service. root@redis2:/etc/redis# /etc/init.d/redis-server start [ ok ] Starting redis-server (via systemctl): redis-server.service. 

Verificamos en el lado MAESTRO que los nodos se convirtieron en réplicas y recibieron los roles necesarios:

 root@redis1:/etc/redis# redis-cli -a TestPass info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:master connected_slaves:1 slave0:ip=192.168.9.96,port=6379,state=online,offset=28,lag=0 master_replid:56b0a702d5823d107b0ca1ca2c80f8ef650a4b28 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:28 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:28 

En el lado ESCLAVO, vemos la misma situación:
 root@redis2:/etc/redis# redis-cli -a TestPass info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:slave master_host:redis1 master_port:6379 master_link_status:up master_last_io_seconds_ago:4 master_sync_in_progress:0 slave_repl_offset:14 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:56b0a702d5823d107b0ca1ca2c80f8ef650a4b28 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14 

Ahora debe configurar la réplica para que se restaure automáticamente en caso de falla de uno de los nodos. Para hacer esto, necesitamos el servicio de seguimiento Redis Sentinel.

Según la documentación , el servicio de monitoreo de Redis Sentinel puede realizar las siguientes operaciones:

  1. Comprueba la disponibilidad de los nodos MAESTRO y ESCLAVO y puede enviar alertas sobre la inaccesibilidad de los nodos.
  2. Si el nodo MAESTRO falla, el nodo testigo puede poner el nodo ESCLAVO en modo MAESTRO, así como reconfigurar los nodos ESCLAVO restantes y comenzar a trabajar con el nuevo MAESTRO.
  3. Realiza cambios en los archivos de configuración de los nodos MAESTRO y ESCLAVO.

Para la pureza del experimento, colocaremos un servicio de testigos en una VM redis3 separada.

Conectamos el repositorio de Redis de la misma manera e instalamos el paquete redis-sentinel:

 apt install redis-sentinel 

Después de la instalación, debe realizar la configuración en el archivo de configuración del nodo de supervisión /etc/redis/sentinel.conf:

 #    redis1   6379. #   1 -      , #        MASTER-. #       , #     MASTER-. sentinel monitor master01 redis1 6379 1 #  3 ,       . sentinel down-after-milliseconds master01 3000 #    MASTER- sentinel failover-timeout master01 6000 # ,  SLAVE-   . #    ,    , #      . sentinel parallel-syncs master01 1 #    . bind 192.168.9.97 127.0.0.1 ::1 #    MASTER-. sentinel auth-pass master01 TestPass 

Reinicie el servicio después de realizar la configuración:

 root@redis3:/etc/redis# /etc/init.d/redis-sentinel restart [ ok ] Restarting redis-sentinel (via systemctl): redis-sentinel.service. 

Compruebe que el servicio de seguimiento vio MASTER y SLAVE:

 root@redis3:/etc/redis# redis-cli -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master01,status=ok,address=192.168.9.95:6379,slaves=1,sentinels=1 

Comenzamos los experimentos.

Simulamos una falla, detenemos el servicio redis-server en el nodo redis1 y obtenemos la información actual del nodo testigo:

 root@redis3:/etc/redis# redis-cli -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master01,status=ok,address=192.168.9.96:6379,slaves=1,sentinels=1 

Vemos que MASTER ha cambiado.

Restauraremos el funcionamiento del nodo redis1 y verificaremos su estado:

 root@redis3:/var/log/redis# redis-cli -h redis1 -p 6379 -a TestPass info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:slave master_host:192.168.9.96 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:15977 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:6c0c7d0eedccede56f211f2db74a98c4d0ff6d56 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:15977 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:15977 

Vemos que el nodo recibió el rol ESCLAVO, y el nodo redis2 es un nodo MAESTRO.

Simule la falla del nodo redis2 y verifique el estado del nodo testigo:

 root@redis3:/var/log/redis# redis-cli -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master01,status=ok,address=192.168.9.95:6379,slaves=1,sentinels=1 

Y el estado del nodo redis1:

 root@redis3:/var/log/redis# redis-cli -h redis1 -p 6379 -a TestPass info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:master connected_slaves:0 master_replid:6e9d67d6460815b925319c2bafb58bf2c435cffb master_replid2:6c0c7d0eedccede56f211f2db74a98c4d0ff6d56 master_repl_offset:33610 second_repl_offset:26483 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:33610 

Genial, el mecanismo funciona. Pero ahora ha surgido la pregunta de cómo conectaremos nuestros servicios DirectumRX, porque necesitan una dirección de nodo único. Resolveremos la situación utilizando el servicio HAProxy.

Redis Node Proxying


Cualquier servicio proxy tcp puede actuar como un proxy inverso para los nodos Redis. En este artículo, consideraremos el uso de HAProxy, ya que es una herramienta especializada diseñada para proporcionar alta disponibilidad y equilibrio de carga, y es utilizada por servicios en línea universalmente conocidos. Lea más sobre HAProxy en la página del desarrollador .

Instale HAProxy en el nodo redis3:

 root@redis3:/var/log/redis# apt install haproxy 

En el archivo de configuración de HAProxy /etc/haproxy/haproxy.cfg, agregue la configuración para las solicitudes de proxy a los nodos de Redis:

 … frontend ft_redis bind *:6379 name redis mode tcp default_backend bk_redis backend bk_redis mode tcp option tcp-check tcp-check connect #  ,         . tcp-check send AUTH\ TestPass\r\n tcp-check expect string +OK tcp-check send PING\r\n tcp-check expect string +PONG tcp-check send info\ replication\r\n #    MASTER, .. SLAVE      . tcp-check expect string role:master tcp-check send QUIT\r\n tcp-check expect string +OK server Redis1 redis1:6379 check inter 3s server Redis2 redis2:6379 check inter 3s 

En esta configuración, se indica que enviaremos cualquier solicitud que llegue a todas las interfaces de la máquina virtual actual en la dirección del puerto 6379. Transferiremos las solicitudes al nodo que responderá que tiene el rol MAESTRO.

Reinicie el servicio de haproxy:

 root@redis3:/etc/haproxy# /etc/init.d/haproxy restart 

Intentemos conectarnos usando el cliente redis-cli y creemos una clave de prueba:

 root@redis3:/etc/haproxy# redis-cli -p 6379 -a TestPass Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> SET TestKey "Some test string" OK 127.0.0.1:6379> GET TestKey "Some test string" 127.0.0.1:6379> info keyspace # Keyspace db0:keys=1,expires=0,avg_ttl=0 

Detenga el nodo redis1 y vuelva a consultar la lista de claves:

 127.0.0.1:6379> info keyspace Error: Server closed the connection (3.01s) 127.0.0.1:6379> info keyspace # Keyspace db0:keys=1,expires=0,avg_ttl=0 (2.01s) 127.0.0.1:6379> GET TestKey "Some test string" 

Vemos que durante algún tiempo la conexión se desconectó, pero luego la conexión se restableció nuevamente y todos los datos permanecieron en su lugar.

Ahora es suficiente registrar la dirección del proxy inverso en los archivos de configuración de los servicios de DirectumRX para conectarse a Redis.

Configurar Redis Cluster


La opción de agrupación en clúster de Redis, implementada para la versión redis 3.0 y superior, es una solución para crear y administrar un clúster con segmentación y replicación de datos. Realiza tareas de gestión de nodos, replicación, sincronización de datos en nodos y garantiza el acceso de la aplicación del cliente al nodo MAESTRO en caso de falla de uno de varios nodos MAESTROS.

imagen

Redis Cluster funciona en modo multimaestro, cada nodo MAESTRO puede tener uno o más nodos ESCLAVO (hasta 1000).

El escalado es la función principal del clúster. Además, el clúster puede garantizar la tolerancia a fallas del servicio Redis:

  • si algunos nodos no funcionan, el clúster redistribuye la carga de ellos a otros nodos;
  • Si los nodos clave no funcionan, todo el clúster finaliza.

Puede surgir una situación cuando el Cliente 2 escribe en el nodo M2. M2 responde "OK" e intenta escribir en S2. Al mismo tiempo, M2 no espera la finalización correcta del intercambio de datos con S2, sino que responde al cliente de inmediato. En este caso, la réplica S2 puede no tener todos los datos. Por lo tanto, se recomienda usar varias réplicas de SLAVE.

También puede surgir una situación cuando M1, M3 dejan de "ver" M2 y el cliente continúa escribiendo datos en M2. Si la indisponibilidad continuará por un tiempo bastante largo (parámetro cluster-node-timeout), en este caso S2 se pondrá en modo MASTER y M2 dejará de funcionar por sí solo.

La documentación oficial recomienda usar 6 nodos, una instancia de Redis por nodo, lo que permite una mayor confiabilidad, pero nadie prohíbe usar tres nodos con la siguiente topología de conexión:

imagen

Si falla uno de los nodos físicos, las réplicas de SLAVE correspondientes entrarán en modo MAESTRO y la operación no se interrumpirá.

Implementamos 3 máquinas virtuales (redis1, redis2 y redis3) en el banco de pruebas, cada una de las cuales ejecutará 2 instancias de Redis.

La aplicación cliente se conectará a un puerto específico especificado en el archivo de configuración del cliente, por lo tanto, los pares MAESTRO - ESCLAVO deberían funcionar en los mismos puertos.

Para el par M1 - S1 usaremos el puerto 6381
Para el par M2 - S2 usaremos el puerto 6382
Para el par M3 - S3 usaremos el puerto 6383

Prepara los archivos de configuración

En redis1:

 cp /etc/redis/redis.conf /etc/redis/m1_redis.conf cp /etc/redis/redis.conf /etc/redis/s2_redis.conf mv /etc/redis/redis.conf /etc/redis/redis.bak 

En redis2:

 cp /etc/redis/redis.conf /etc/redis/m2_redis.conf cp /etc/redis/redis.conf /etc/redis/s3_redis.conf mv /etc/redis/redis.conf /etc/redis/redis.bak 

En redis3:

 cp /etc/redis/redis.conf /etc/redis/m3_redis.conf cp /etc/redis/redis.conf /etc/redis/s1_redis.conf mv /etc/redis/redis.conf /etc/redis/redis.bak 

Complete los archivos de configuración de acuerdo con la plantilla:

 bind <IP- > protected-mode no #      ,    . port <> pidfile /var/run/redis_<>.pid # <yes/no> -   Redis Cluster cluster-enabled yes # ,      : #  ,  ,    . #         . cluster-config-file nodes-<>.conf #  ,  master-   , #          slaves #    . cluster-node-timeout 15000 

Vamos a lanzar los nodos Redis:

Nodo redis1:

 root@redis1:/etc/redis# redis-server /etc/redis/m1_redis.conf root@redis1:/etc/redis# redis-server /etc/redis/s2_redis.conf 

Redis2 nodo:

 root@redis2:/etc/redis# redis-server /etc/redis/m2_redis.conf root@redis2:/etc/redis# redis-server /etc/redis/s3_redis.conf 

Redis3 nodo:

 root@redis3:/etc/redis# redis-server /etc/redis/m3_redis.conf root@redis3:/etc/redis# redis-server /etc/redis/s1_redis.conf 

Para configurar el clúster, debe usar la utilidad de cliente redis-cli, pasándole una lista de ip: pares de servidores de puertos que desempeñarán los roles de MAESTRO y ESCLAVO:

 redis-cli --cluster create redis1-ip:6381 redis2-ip:6382 redis3-ip:6383 redis1-ip:6382 redis2-ip:6383 redis3-ip:6381 --cluster-replicas 1 

, donde la opción --cluster-replicas 1 le indica cuántos ESCLAVOS tendrá cada maestro, y se seleccionan automáticamente de la lista de réplicas transferidas.

 root@redis1:~/redis/src# redis-cli --cluster create 192.168.9.51:6381 192.168.9.52:6382 192.168.9.53:6383 192.168.9.51:6382 192.168.9.52:6383 192.168.9.53:6381 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.168.9.52:6383 to 192.168.9.51:6381 Adding replica 192.168.9.51:6382 to 192.168.9.52:6382 Adding replica 192.168.9.53:6381 to 192.168.9.53:6383 >>> Trying to optimize slaves allocation for anti-affinity [OK] Perfect anti-affinity obtained! M: e92cb96fd6c20db7509662a248902e3751ebe95f 192.168.9.51:6381 slots:[0-5460] (5461 slots) master M: d499af3672b3063c7239572ec311ad3160f280ae 192.168.9.52:6382 slots:[5461-10922] (5462 slots) master M: 3a41475e1613519c3ecdec695736a898262a24a5 192.168.9.53:6383 slots:[10923-16383] (5461 slots) master S: 182e5cffc9c31c231de69ddbaf507ec1fe17bb09 192.168.9.51:6382 replicates d499af3672b3063c7239572ec311ad3160f280ae S: 44f656062259005adea58bc5ad024071a050e192 192.168.9.52:6383 replicates 3a41475e1613519c3ecdec695736a898262a24a5 S: 485ffb786e9763955e6f10ffc59247690ad9bc11 192.168.9.53:6381 replicates e92cb96fd6c20db7509662a248902e3751ebe95f Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join ..... >>> Performing Cluster Check (using node 192.168.9.51:6381) M: e92cb96fd6c20db7509662a248902e3751ebe95f 192.168.9.51:6381 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: d499af3672b3063c7239572ec311ad3160f280ae 192.168.9.52:6382 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 485ffb786e9763955e6f10ffc59247690ad9bc11 192.168.9.53:6381 slots: (0 slots) slave replicates e92cb96fd6c20db7509662a248902e3751ebe95f S: 182e5cffc9c31c231de69ddbaf507ec1fe17bb09 192.168.9.51:6382 slots: (0 slots) slave replicates d499af3672b3063c7239572ec311ad3160f280ae S: 44f656062259005adea58bc5ad024071a050e192 192.168.9.52:6383 slots: (0 slots) slave replicates 3a41475e1613519c3ecdec695736a898262a24a5 M: 3a41475e1613519c3ecdec695736a898262a24a5 192.168.9.53:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. 

El clúster está construido correctamente. Mostraremos información sobre el clúster:

 root@redis1:~/redis/src# redis-cli -c -h 192.168.9.51 -p 6381 192.168.9.51:6381> CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:1254 cluster_stats_messages_pong_sent:1243 cluster_stats_messages_sent:2497 cluster_stats_messages_ping_received:1238 cluster_stats_messages_pong_received:1254 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:2497 192.168.9.51:6381> 

Para probar una réplica específica, como con Redis Sentiel, puede usar el comando de replicación INFO:

 root@redis1:~/redis/src# redis-cli -c -h 192.168.9.51 -p 6381 192.168.9.51:6381> INFO replication # Replication role:master connected_slaves:1 slave0:ip=192.168.9.53,port=6381,state=online,offset=1946,lag=0 master_replid:59cd95d394dad9d0e49042637fdfd5290db4abfe master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1946 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1946 192.168.9.51:6381> 

Intentemos crear varias claves y verifiquemos que estas claves aparecieron en las réplicas:

 192.168.9.51:6381> SET key1 test1 -> Redirected to slot [9189] located at 192.168.9.52:6382 OK 192.168.9.52:6382> SET key2 test2 -> Redirected to slot [4998] located at 192.168.9.51:6381 OK 192.168.9.51:6381> SET key3 test3 OK 192.168.9.51:6381> 

Compruebe en M2:

 root@redis2:/home/user# redis-cli -c -h 192.168.9.52 -p 6382 192.168.9.52:6382> GET key1 "test1" 192.168.9.52:6382> GET key2 -> Redirected to slot [4998] located at 192.168.9.51:6381 "test2" 192.168.9.51:6381> GET key3 "test3" 192.168.9.51:6381> 

Y en el M3:

 root@redis3:/home/user# redis-cli -c -h 192.168.9.53 -p 6383 192.168.9.53:6383> GET key1 -> Redirected to slot [9189] located at 192.168.9.52:6382 "test1" 192.168.9.52:6382> GET key2 -> Redirected to slot [4998] located at 192.168.9.51:6381 "test2" 192.168.9.51:6381> GET key3 "test3" 192.168.9.51:6381> 

Desactivaremos el nodo redis1 y comprobaremos cómo funciona S1:

 192.168.9.52:6382> CLUSTER NODES <b>182e5cffc9c31c231de69ddbaf507ec1fe17bb09 192.168.9.51:6382@16382 slave,fail d499af3672b3063c7239572ec311ad3160f280ae 1569509904727 1569509900000 4 connected</b> 485ffb786e9763955e6f10ffc59247690ad9bc11 <i>192.168.9.53:6381@16381 master</i> - 0 1569510017272 7 connected 0-5460 44f656062259005adea58bc5ad024071a050e192 192.168.9.52:6383@16383 slave 3a41475e1613519c3ecdec695736a898262a24a5 0 1569510018274 5 connected <b>e92cb96fd6c20db7509662a248902e3751ebe95f 192.168.9.51:6381@16381 master,fail - 1569509906731 1569509901721 1 connected</b> 3a41475e1613519c3ecdec695736a898262a24a5 192.168.9.53:6383@16383 master - 0 1569510019275 3 connected 10923-16383 d499af3672b3063c7239572ec311ad3160f280ae 192.168.9.52:6382@16382 myself,master - 0 1569510017000 2 connected 5461-10922 

Vemos información sobre la falla de M1 y S2 y que S3 ha cambiado al modo MAESTRO.

Verifique dónde están almacenadas las claves:

 192.168.9.52:6382> GET key1 "test1" 192.168.9.52:6382> GET key2 -> Redirected to slot [4998] located at 192.168.9.53:6381 "test2" 192.168.9.53:6381> GET key3 "test3" 192.168.9.53:6381> 

Las claves que se almacenaron anteriormente en redis1 ahora están disponibles en redis3.

Restaure el funcionamiento del nodo redis1 y verifique el estado de los nodos M1 y S2:

 192.168.9.53:6381> CLUSTER NODES <i>e92cb96fd6c20db7509662a248902e3751ebe95f 192.168.9.51:6381@16381 slave 485ffb786e9763955e6f10ffc59247690ad9bc11 0 1569511658217 7 connected 182e5cffc9c31c231de69ddbaf507ec1fe17bb09 192.168.9.51:6382@16382 slave d499af3672b3063c7239572ec311ad3160f280ae 0 1569511657000 4 connected</i> d499af3672b3063c7239572ec311ad3160f280ae 192.168.9.52:6382@16382 master - 0 1569511656000 2 connected 5461-10922 3a41475e1613519c3ecdec695736a898262a24a5 192.168.9.53:6383@16383 master - 0 1569511656000 3 connected 10923-16383 485ffb786e9763955e6f10ffc59247690ad9bc11 192.168.9.53:6381@16381 myself,master - 0 1569511656000 7 connected 0-5460 44f656062259005adea58bc5ad024071a050e192 192.168.9.52:6383@16383 slave 3a41475e1613519c3ecdec695736a898262a24a5 0 1569511657216 5 connected 

La salud de M1 y S2 se ha recuperado, pero ahora M1 está en modo ESCLAVO.

Y las claves también están en el nodo redis3:

 192.168.9.53:6383> GET key1 -> Redirected to slot [9189] located at 192.168.9.52:6382 "test1" 192.168.9.52:6382> GET key2 -> Redirected to slot [4998] located at 192.168.9.53:6381 "test2" 192.168.9.53:6383> GET key3 -> Redirected to slot [935] located at 192.168.9.53:6381 "test3" 

El clúster está configurado y se prueba la recuperación de Redis.

Para acceder a los servicios de DirectumRX, también necesitará configurar proxies inversos, como en el caso de configurar Redis Sentiel.

En lugar de una conclusión


Este artículo no consideró otra forma de aumentar la tolerancia a fallas de Redis: usar un administrador de recursos de clúster de terceros, por ejemplo, Pacemaker . En este caso, será posible sobrevivir con dos nodos, sin embargo, existe una alta probabilidad de pérdida de datos en caso de emergencia.

Para un proxy inverso (en este caso, HAProxy), también es deseable proporcionar tolerancia a fallas, pero este problema también estaba más allá del alcance de este artículo. Si está interesado en el tema, estas opciones de implementación también se pueden considerar en artículos separados con ajuste y prueba paso a paso de los resultados.

Puede encontrar los enlaces a continuación para obtener más información sobre el tema:
Tutorial de clúster de Redis
Documentación de Redis Sentinel
Manual de configuración de HAProxy .

Source: https://habr.com/ru/post/469543/


All Articles