Principio maestro-esclavo de Redis + modo centinela

1. Principio de la replicación maestro-esclavo

Inserte la descripción de la imagen aquí
①: El servidor esclavo establece una conexión de socket larga antes que el servidor maestro maestro
②: El servidor esclavo esclavo envía un comando PSYNC al servidor maestro maestro para solicitar la replicación de datos.
③: Una vez que el servidor maestro recibe el comando PSYNC, utilizará el subproceso para generar el último archivo de instantánea rdb a través del comando bgsave y enviarlo al servidor esclavo esclavo.
Durante el período de persistencia, el maestro continuará recibiendo solicitudes del cliente y almacenará en caché estas solicitudes que pueden modificar el conjunto de datos en el búfer de respuesta de memoria
④: El esclavo borra los datos inútiles y acepta los datos del maestro para cargarlos en la memoria
⑤: maestro Luego envíe el comando que se almacenó en caché en la memoria durante la persistencia anterior al esclavo.
⑥: El esclavo acepta el nuevo comando enviado por el maestro y lo ejecuta.
⑦: En este momento, los datos se han sincronizado. Cuando el maestro tiene una nueva operación de escritura, se enviará continuamente al esclavo a través de la conexión larga del socket para garantizar la coherencia de los datos maestro-esclavo.
Nota: Si el maestro recibe múltiples solicitudes de conexión simultáneas de múltiples esclavos, solo persistirá una vez, no una sola conexión, y luego enviará esta pieza de datos persistentes a múltiples esclavos conectados simultáneamente.

1. ¿Qué pasa si el nodo esclavo cuelga durante la transmisión maestro-esclavo?

Cuando Salve cuelga cuando recibe la mitad de los datos debido a la red y otras razones, después de un período de tiempo, el nodo esclavo salve se reinicia artificialmente, entonces, ¿cómo se maneja la transmisión de datos en este momento?
Respuesta: A partir de la versión redis 2.8, redis usa el comando PSYNC que admite la replicación de datos parcial para sincronizar los datos con el maestro. El esclavo y el maestro solo pueden realizar la replicación de datos parcial (transmisión reanudada) después de que la conexión de red se desconecta y se vuelve a conectar. El diagrama de flujo es el siguiente:
Inserte la descripción de la imagen aquí
①: Primero, redis abrirá un grupo de búfer de forma predeterminada cuando se esté ejecutando, que se utiliza para almacenar en caché los últimos comandos de redis. Puede configurar
repl-backlog-size 1mb en 6379.conf #### grupo de búfer de comando de redis, el tamaño predeterminado 1Mb
②: Cuando el esclavo se desconecta del maestro y se restablece la conexión, el esclavo enviará un comando PSYNC al maestro y usará el desplazamiento de compensación para ubicar la posición de la transmisión de datos cuando la conexión se desconecta, y comenzará desde esta posición para continuar la transferencia.
③: Si el nodo esclavo está desconectado durante demasiado tiempo y el desplazamiento es demasiado antiguo, y no se puede encontrar la posición correspondiente en el grupo de búfer de comando en el maestro, se realizará una copia de datos completa. ¡No se puede usar el punto de interrupción para reanudar la carga!

2. ¿Qué es una tormenta de replicación maestro-esclavo?

Tormenta de replicación maestro-esclavo: varios nodos esclavos replican el nodo maestro al mismo tiempo, lo que genera una presión excesiva sobre el nodo maestro.
Para resolver el problema de la tormenta de replicación maestro-esclavo, algunos nodos esclavos pueden sincronizar datos con nodos esclavos. La arquitectura está diseñada de la siguiente manera:
Inserte la descripción de la imagen aquí

3. Ventajas y desventajas de la replicación maestro-esclavo

1. Ventajas

Inserte la descripción de la imagen aquí

2. Desventajas

Inserte la descripción de la imagen aquí

Dos, implementación del proyecto Redis

1. Topología del proyecto

Inserte la descripción de la imagen aquí

2. Medio ambiente

 一台主服务器  master :192.168.1.10
两台备服务器   slave1 :192.168.1.11
             slave2 :192.168.1.12

1. Instale redis

Es necesario instalar tanto el servidor
activo como el servidor en espera. Transfiera el paquete de instalación de redis a través de archivos xshell

1. Descomprimir

[root@master ~]# tar zxvf redis-5.0.4.tar.gz   
[root@master ~]# cd redis-5.0.4/
[root@master redis-5.0.4]# make 配置安装
[root@master redis-5.0.4]# make DREFIX=/usr/local/redis install
更改安装路径可以用make PREFIX=安装路径 install
[root@master redis-5.0.4]# cd

2. Crea un vínculo

[root@master ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/    
[root@master ~]# cd redis-5.0.4/utils/    
[root@master utils]# ls -lh    查看安装脚本
[root@master utils]# ./install_server.sh    运行脚本
[root@master utils]# netstat -anpt | grep redis   查看端口状态

Inserte la descripción de la imagen aquí
Después de que la instalación rápida sea exitosa, la configuración básica de Redis está completa

2. Configurar el servicio de replicación maestro-esclavo de Redis

En el servidor maestro

[root@master utils]# cd
[root@master ~]# vi /etc/redis/6379.conf 
[root@master ~]# /etc/init.d/redis_6379 stop    #服务关闭
[root@master ~]# /etc/init.d/redis_6379 start    #服务开启
修改添加
bind 0.0.0.0                     修改监听地址为0.0.0.0
daemonize yes                    开启守护进程
logfile /var/log/redis_6379.log  修改日志文件目录
dir /var/lib/redis/6379          修改工作目录
appendonly yes                   开启AOF持久化功能

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Editar la configuración en el dispositivo 1, 2

[root@slave1 utils]# vi /etc/redis/6379.conf 
[root@slave1 utils]# /etc/init.d/redis_6379 restart  服务重启
修改添加
bind 0.0.0.0                 修改监听地址为0.0.0.0
appendonly yes               开启AOF持久化功能
replicaof 192.168.1.10 6379     增加一个同步master节点IP和端口

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Ver en el servidor maestro para
verificar el efecto maestro-esclavo

[root@master ~]# tail -f /var/log/redis_6379.log 

Inserte la descripción de la imagen aquí
Igual que el anterior para el servidor en espera 2

Pruebe la función de replicación de datos maestro-esclavo
en el servidor maestro

[root@master ~]# redis-cli   #进入数据库
127.0.0.1:6379> set fa a     #设置fa键得值为a
127.0.0.1:6379> get fa       #查看fa键得值
127.0.0.1:6379> info replication   #信息复制,状态信息

Inserte la descripción de la imagen aquí
En el servidor en espera 1

[root@slave1 ~]# redis-cli    #进入数据库
127.0.0.1:6379> get fa        #获取fa键得值
127.0.0.1:6379> info replication     #信息复制,状态信息

Inserte la descripción de la imagen aquí
En el servidor en espera 2

// An highlighted block
var foo = 'bar';

Inserte la descripción de la imagen aquí

3. Después de que el servidor principal simulado se cuelga

En el servidor maestro, apague el servicio

[root@master ~]# /etc/init.d/redis_6379 stop      关闭服务
[root@master ~]# tail -f /var/log/redis_6379.log  查看日志

Inserte la descripción de la imagen aquí
Compruebe el fenómeno en el servidor en espera 1

[root@slave1 ~]# tail -f /var/log/redis_6379.log 查看日志
[root@slave1 ~]# redis-cli                       进入数据库
127.0.0.1:6379> get k                            获取k的键值                    
"aa"                                                  
127.0.0.1:6379> info replication               信息复制,状态信息
# Replication
role:slave                                    状态:从服务器
master_host:192.168.1.10        

Inserte la descripción de la imagen aquí
En el servidor en espera 2,
Inserte la descripción de la imagen aquí
puede ver que después de apagar el servidor principal, el estado del servidor esclavo no se convertirá al servidor maestro, pero los datos se copiarán y transferirán, y se podrán leer y ver.

Solución: a
través de la función centinela, el estado del maestro y el esclavo puede cambiar automáticamente cuando falla el servidor maestro

Primero restaure al estado anterior en el
maestro y
reanude en línea

[root@master ~]# /etc/init.d/redis_6379 start      服务启动
[root@master ~]# tail -f /var/log/redis_6379.log   查看日志
[root@master ~]# redis-cli                         进入数据库
127.0.0.1:6379> info replication            信息复制,状态查看
# Replication
role:master          主服务 
connected_slaves:2   连接2个服务器
slave0:ip=192.168.1.11,port=6379,state=online,offset=84,lag=1
slave1:ip=192.168.1.12,port=6379,state=online,offset=84,lag=0
master_replid:087088c1aa398b11c1e4759e93eb8abb6bc277e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
127.0.0.1:6379> set nb b      添加nb键值为b
OK
127.0.0.1:6379> get nb        获取nb的键值
"b"

Inserte la descripción de la imagen aquí
En el servidor en espera 1

[root@slave1 ~]# tail -f /var/log/redis_6379.log   #查看日志
[root@slave1 ~]# redis-cli             

Inserte la descripción de la imagen aquí

Tres, el principio del modo centinela

  • Sentinel Sentinel es un servicio especial de Redis, que no proporciona servicios de lectura y escritura. Se utiliza principalmente para monitorear el estado de los nodos de instancia de Redis.
  • Bajo la arquitectura centinela, cuando el cliente solicita el servicio redis por primera vez, primero encontrará el nodo maestro redis del centinela, y luego accederá directamente al nodo maestro redis. No accederá al nodo maestro redis a través del agente centinela cada vez. Cuando el nodo maestro cambia, el centinela lo percibirá por primera vez y notificará al cliente sobre el nuevo nodo maestro de redis (el lado del cliente de redis generalmente implementa la función de suscripción y se suscribe al mensaje de cambio de nodo publicado por Sentinel)
  • Inserte la descripción de la imagen aquí

1. El papel principal del centinela

1. Fenómeno

Cuando el nodo principal cuelga, la consola del servidor imprimirá un error de tiempo de espera de conexión.Después de un período de tiempo, vuelve a la normalidad y puede continuar escribiendo datos en redis.

2. Razón

  • La razón es que el centinela siempre monitoreará el nodo maestro. Cuando el nodo maestro está inactivo, la consola del servidor imprimirá un error de tiempo de espera de conexión. Pero al mismo tiempo, el centinela confirma que el maestro ha caído por la mitad del mecanismo y elegirá a un esclavo como nuevo maestro.
  • Durante el período de elección, la consola seguirá imprimiendo errores. Una vez que la elección sea exitosa, se restablecerá la conexión normal. ¡Esta es también la razón del fenómeno anterior! !
  • Cuando se restaure el nodo maestro originalmente colgado, se llamará automáticamente el nuevo nodo del clúster maestro, completando la arquitectura centinela de alta disponibilidad.

El centinela debe establecerse en un número impar, al menos tres, ¡lo que implica votar!

2. Proceso de implementación de Sentinel


Edite el archivo de configuración del modo centinela en el servidor maestro

[root@master ~]# vi redis-5.0.4/sentinel.conf 
修改添加
protected-mode no               关闭安全模式
daemonize yes                   指定sentine1为后台启动,开启守护进程
logfile "/var/log/sentinel.log" 指定日志存放路径
dir /var/lib/redis/6379         指定数据库存放路径

sentinel monitor mymaster 192.168.1.10 6379 2     
指定几个哨兵(slave)检测主服务器故障,才会进行故障迁移(主服务器ip地址,端口号,slave数)

sentinel down-after-milliseconds mymaster 3000  
 判定服务器down掉的时间周期,默认30000毫秒(30秒)
 
sentinel failover-timeout mymaster 100000
故障节点的最大超时时间为100000毫秒(100秒)

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Copiar archivos a esclavo1 y esclavo2

[root@master ~]# scp redis-5.0.4/sentinel.conf root@192.168.1.11:/root/redis-5.0.4
[root@master ~]# scp redis-5.0.4/sentinel.conf root@192.168.1.12:/root/redis-5.0.4

Inserte la descripción de la imagen aquí
Inicie el modo centinela
, inicie primero el servidor maestro y luego inicie el servidor esclavo

[root@master ~]# redis-sentinel redis-5.0.4/sentinel.conf &
[1] 69742
[root@slave1 ~]# redis-sentinel redis-5.0.4/sentinel.conf &
[1] 62685
[root@slave2 ~]# redis-sentinel redis-5.0.4/sentinel.conf &
[1] 62250


1. Ver el registro en el servidor maestro

[root@master ~]# tail -f /var/log/sentinel.log 

2. Ver el estado del proceso

[root@master ~]# ps aux | grep redis
[root@master ~]# ps aux | grep sentinel

Inserte la descripción de la imagen aquí
Indica que se ha iniciado el servicio de centinela
3. Inicie sesión de forma remota en la base de datos para ver el estado del centinela

[root@master ~]# redis-cli -h 192.168.1.10 -p 26379 info sentinel
[root@master ~]# redis-cli -h 192.168.1.10 -p 6379 info replication

1. Simular un problema con el servidor primario y fuera de servicio, verifique el cambio de estado del servidor secundario

En el servidor maestro

[root@master ~]# /etc/init.d/redis_6379 stop  停止服务
[root@master ~]# ps aux | grep redis        查看进程状态

Inserte la descripción de la imagen aquí
Ver registros en el servidor esclavo

[root@slave1 ~]#  tail -f /var/log/sentinel.log 

Se encontró que el estado maestro se transfiere al esclavo 1

Ver inicio de sesión remoto para ver información de centinela en esclavo2

[root@slave2 ~]# redis-cli -h 192.168.1.11 -p 26379 info sentinel

2. Ver la dirección del servidor principal detectado por el centinela configurado previamente

En el servidor en espera 1

[root@slave1 ~]# vi redis-5.0.4/sentinel.conf 

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Los cambios de dirección de configuración encontrados en el servidor principal también cambiarán automáticamente la dirección de detección cuando el estado principal se cambie automáticamente

3. Ver los cambios de estado cuando el servidor maestro original vuelve a estar en línea

En el servidor maestro

[root@master ~]# /etc/init.d/redis_6379 start  服务启动
[root@master ~]# ps aux | grep redis           查看进程端口状态
[root@master ~]# tail -f /var/log/sentinel.log 查看日志文件

Inserte la descripción de la imagen aquí


Ver el estado del centinela de la base de datos en slave2

[root@slave2 ~]# redis-cli -h 192.168.1.11 -p 26379 info sentinel

Se descubre que después de que el servidor maestro original se conecte, el estado maestro no volverá a cambiar a sí mismo. Esto es diferente del servicio vrrp porque vrrp tiene una configuración de prioridad, pero el servicio aquí no.

Supongo que te gusta

Origin blog.csdn.net/F2001523/article/details/111466296
Recomendado
Clasificación