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的定时任务
- 每10s每个sentinel对master和slave执行info,发现slave节点,确定主从关系
- 每2s每个sentinel通过master节点的channel交换信息,通过sentinel_:hello频道交互,交互对节点的看法和自身信息
- 每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进程监控一组主从服务器
一、实现主从复制
- 在所有服务器修改监听地址、密码及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
- 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 - 启动所有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
二、实现哨兵
-
修改sentinel配置文件:
(所有sentinel配置文件相同,需在启动服务前将配置文件拷贝到其他哨兵服务器,因为启动后会有配置自动生成)
sentinel monitor 888 10.0.0.81 6379 2
sentinel auth-pass 888 123456
sentinel down-after-milliseconds 888 3000 判断SDOWN条件为3s 便于快速观察现象 -
重启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
- 查看信息
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>
- 重新启动原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

浙公网安备 33010602011771号