redis的哨兵sentinel

sentinel解决的问题

redis2.6之后引入了哨兵技术,2.8之后趋于稳定。哨兵技术解决了redis主从复制的单点失败问题;master故障不需要像主从复制一样手动提升slave成为master,哨兵会自动修改redis配置文件指向新的master。

sentinel的工作逻辑

sentinel是一个分布式系统,在一个架构中运行多个哨兵进程,哨兵进程独立于master和slave,可以监控多组redis主从,通过master-name区分每组主从,监听在26379端口。哨兵进程之间使用所谓流言协议收发master是否下线的消息,并使用投票协议决定是否执行故障迁移,以及决定哪个slave提升为master。每个哨兵向其他哨兵、主、从定时发送消息以确认对方是否存活,当对方没有回应则认为该节点为DOWN状态(Subjective Down),当所有哨兵通过sentinel is-master-down-by-addr命令交流后,其中超过半数认为该节点DOWN,则该节点被判为客端DOWN(Objectively Down),当主节点被判为客观down,则通过哨兵来提升一个从节点成为新的主节点,同常设置及数个哨兵节点,防止投票时脑裂。

三个sentinel的定时任务

  1. 每10s每个sentinel对master和slave执行info,发现slave节点,确定主从关系
  2. 每2s每个sentinel通过master节点的channel交换信息,通过sentinel_:hello频道交互,交互对节点的看法和自身信息
  3. 每1s每个sentinel对其他sentinel和redis执行ping

sentinel的连接

实现redis的sentinel后,客户端不在直接连到redis的主从服务器,而是连接到sentinel进程来获取监控的环境中主节点和从节点,当主从之间切换,客户端不需要做修改,可以将sentinel理解为调度器

sentinel的配置文件及介绍

[root@81 tmp]# grep "^[^#]" /etc/redis-sentinel.conf 
port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2      哨兵监控的主从复制组名及master,2表示超过2个及以上哨兵认为该master Sdown则为Odown
sentinel auth-pass mymaster 123456               master的密码,用于该节点切连接master使用,该项必须在前一项的后面配置
sentinel down-after-milliseconds mymaster 30000    判断该组中节点为SDOWN的条件,30s,建议调小
sentinel parallel-syncs mymaster 1                 故障转移后,同时向新master同步数据的数量;在从节点较多的情况下,需调小此值以减小新master的压力
sentinel failover-timeout mymaster 180000          故障每个从节点指向新master的超时时长,需根据数据量大小调整时间
sentinel deny-scripts-reconfig yes
logfile /var/log/redis/sentinel.log

实现sentinel


结构如上,一主两从,每台服务器运行redis及sentinel进程。使用三个sentinel进程监控一组主从服务器

一、实现主从复制

  1. 在所有服务器修改监听地址、密码及master密码认证(从master同步数据时需要认证密码)

sed -ri.bak '/^# requirepass/s/^# requirepass foobared/requirepass 123456/' /etc/redis.conf
sed -ri '/^# masterauth/s/^# masterauth <master-password>/masterauth 123456/' /etc/redis.conf
sed -ri '/^bind 127.0.0.1/s/127.0.0.1/0.0.0.0/' /etc/redis.conf

  1. slave服务器82 83,设置为81的从节点
    [root@82 tmp]# sed -ri '/^# replicaof/s/^# replicaof <masterip> <masterport>/replicaof 10.0.0.81 6379/' /etc/redis.conf
    [root@83 ~]# sed -ri '/^# replicaof/s/^# replicaof <masterip> <masterport>/replicaof 10.0.0.81 6379/ /etc/redis.conf
  2. 启动所有redis,查看master info信息
role:master
connected_slaves:2
slave0:ip=10.0.0.83,port=6379,state=online,offset=196,lag=1
slave1:ip=10.0.0.82,port=6379,state=online,offset=196,lag=1

二、实现哨兵

  1. 修改sentinel配置文件:
    (所有sentinel配置文件相同,需在启动服务前将配置文件拷贝到其他哨兵服务器,因为启动后会有配置自动生成)
    sentinel monitor 888 10.0.0.81 6379 2
    sentinel auth-pass 888 123456
    sentinel down-after-milliseconds 888 3000 判断SDOWN条件为3s 便于快速观察现象

  2. 重启sentinel服务
    配置文件重启前后对比,确保每个哨兵的sentinel myid 不同

[root@81 ~]# grep "^[^#]" /etc/redis-sentinel.conf 
port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
sentinel monitor mymaster 10.0.0.81 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
logfile /var/log/redis/sentinel.log

[root@81 ~]# systemctl restart redis-sentinel.service

[root@81 ~]# ss -ntl
State         Recv-Q        Send-Q               Local Address:Port                  Peer Address:Port                 
LISTEN        0             128                        0.0.0.0:26379                      0.0.0.0:*           
LISTEN        0             128                        0.0.0.0:6379                       0.0.0.0:*  

[root@81 ~]# grep "^[^#]" /etc/redis-sentinel.conf 
port 26379
daemonize no
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel myid 5780b7dd90e17374e8de5ab3027c95230b44f72f
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 10.0.0.81 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 0
protected-mode no
supervised systemd
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 10.0.0.82 6379
sentinel known-replica mymaster 10.0.0.83 6379
sentinel current-epoch 0
  1. 查看信息
127.0.0.1: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=mymaster,status=ok,address=10.0.0.81:6379,slaves=2,sentinels=3

三、故障模拟

1、停止master 10.0.0.81 redis-server 服务,查看日志观察主从切换过程
可以通过设置redis配置文件中slave的优先级,实现slave上位成master的优先级:replica-priority 100

[root@81 ~]# systemctl stop redis
[root@81 ~]# tail -f /var/log/redis/sentinel.log 
 # -odown master mymaster 10.0.0.81 6379                                     判定81为ODOWN
 # +failover-end master mymaster 10.0.0.81 6379
 # +switch-master mymaster 10.0.0.81 6379 10.0.0.83 6379                     master由81切换为83
 * +slave slave 10.0.0.82:6379 10.0.0.82 6379 @ mymaster 10.0.0.83 6379      82指向新master83
 * +slave slave 10.0.0.81:6379 10.0.0.81 6379 @ mymaster 10.0.0.83 6379      81指向新master83
 # +sdown slave 10.0.0.81:6379 10.0.0.81 6379 @ mymaster 10.0.0.83 6379

2、观察redis的配置文件
实现主从时配置的replicof已经被删除

[root@81 ~]# grep replicaof /etc/redis.conf
# Master-Replica replication. Use replicaof to make a Redis instance a copy of
# replicaof <masterip> <masterport>
  1. 重新启动原master 81,观察日志和配置文件

原master重启后仍是slave,不会进行抢占恢复master身份

[root@81 ~]# systemctl start redis.service 
28833:X 13 Aug 2021 09:49:15.577 # -sdown slave 10.0.0.81:6379 10.0.0.81 6379 @ mymaster 10.0.0.83 6379
28833:X 13 Aug 2021 09:49:25.524 * +convert-to-slave slave 10.0.0.81:6379 10.0.0.81 6379 @ mymaster 10.0.0.83 6379

重新启动后,原master的配置文件 replicaof 项自动指向新master

[root@81 ~]# grep replicaof /etc/redis.conf
# Master-Replica replication. Use replicaof to make a Redis instance a copy of
# replicaof <masterip> <masterport>
replicaof 10.0.0.83 6379

手动下线主节点

[root@83 ~]# redis-cli -p 26379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:26379> sentinel failover mymaster
OK
posted @ 2021-09-20 00:09  windman  阅读(308)  评论(0)    收藏  举报