redis主从中的Master自动选举之Sentinel哨兵机制
泛域名ssl证书 239元1年送1个月、单域名39元1年,Sectigo(原Comodo证书)全球可信证书,强大的兼容性,高度安全性,如有问题7天内可退、可开发票
加微信VX 18718058521 备注SSL证书
【腾讯云】2核2G4M云服务器新老同享99元/年,续费同价
一、什么是哨兵
监控master和slave是否正常运行
master出现故障时自动将slave
升级为master
二、配置哨兵集群
从redis-6.0.9源码包中拷贝sentinel.conf文件到redis/bin安装目录下
cp /data/program/redis-6.0.9/sentinel.conf /data/program/redis/sentinel.conf
修改以下配置
# 其中name表示要监控的master的名字,这个名字是自己定义,ip和port表示master的ip和端口号,最后一个2表示最低通过票数,也就是说至少需要几个哨兵节点认为master下线才算是真的下线 sentinel monitor mymaster 192.168.221.128 6379 2sentinel down-after-milliseconds mymaster 5000 # 表示如果5s内mymaster没响应,就认为SDOWN sentinel failover-timeout mymaster 15000 # 表示如果15秒后,mysater仍没活过来,则启动failover,从剩下的slave中选一个升级为masterlogfile "/data/program/redis/logs/sentinels.log" # 需要提前创建好文件
通过下面这个命令启动sentinel哨兵
./redis-sentinel ../sentinel.conf
启动成功后,得到一下信息,表示哨兵启动成功并且开始监控集群节点
103323:X 13 Jul 2021 15:16:28.624 # Sentinel ID is2e9b0ac7ffbfca08e80debff744a4541a31b3951103323:X 13 Jul 2021 15:16:28.624 # +monitor master mymaster 192.168.221.1286379 quorum 2103323:X 13 Jul 2021 15:16:28.627 * +slave slave 192.168.221.129:6379192.168.221.129 6379 @ mymaster 192.168.221.128 6379103323:X 13 Jul 2021 15:16:28.628 * +slave slave 192.168.221.130:6379192.168.221.130 6379 @ mymaster 192.168.221.128 6379103323:X 13 Jul 2021 15:16:48.765 * +fix-slave-config slave192.168.221.130:6379 192.168.221.130 6379 @ mymaster 192.168.221.128 6379103323:X 13 Jul 2021 15:16:48.765 * +fix-slave-config slave192.168.221.129:6379 192.168.221.129 6379 @ mymaster 192.168.221.128 6379
+sentinel sentinel d760d62e190354654490e75e0b427d8ae095ac5a 192.168.221.12926379 @ mymaster 192.168.221.128 6379103323:X 13 Jul 2021 15:24:31.421+sentinel sentinel dc6d874fe71e4f8f25e15946940f2b8eb087b2e8 192.168.221.13026379 @ mymaster 192.168.221.128 6379
三、模拟master节点故障
103625:X 13 Jul 2021 15:35:01.241 # +new-epoch 9103625:X 13 Jul 2021 15:35:01.244 # +vote-for-leaderd760d62e190354654490e75e0b427d8ae095ac5a 9103625:X 13 Jul 2021 15:35:01.267 # +odown master mymaster 192.168.221.128 6379#quorum 2/2103625:X 13 Jul 2021 15:35:01.267 # Next failover delay: I will not start afailover before Tue Jul 13 15:35:31 2021103625:X 13 Jul 2021 15:35:02.113 # +config-update-from sentineld760d62e190354654490e75e0b427d8ae095ac5a 192.168.221.129 26379 @ mymaster192.168.221.128 6379103625:X 13 Jul 2021 15:35:02.113 # +switch-master mymaster 192.168.221.128 6379192.168.221.130 6379103625:X 13 Jul 2021 15:35:02.113 * +slave slave 192.168.221.129:6379192.168.221.129 6379 @ mymaster 192.168.221.130 6379103625:X 13 Jul 2021 15:35:02.113 * +slave slave 192.168.221.128:6379192.168.221.128 6379 @ mymaster 192.168.221.130 6379103625:X 13 Jul 2021 15:35:07.153 # +sdown slave 192.168.221.128:6379192.168.221.128 6379 @ mymaster 192.168.221.130 6379
76274:X 13 Jul 2021 15:35:01.240 # +try-failover master mymaster 192.168.221.128637976274:X 13 Jul 2021 15:35:01.242 # +vote-for-leaderd760d62e190354654490e75e0b427d8ae095ac5a 976274:X 13 Jul 2021 15:35:01.242 # d760d62e190354654490e75e0b427d8ae095ac5avoted for d760d62e190354654490e75e0b427d8ae095ac5a 976274:X 13 Jul 2021 15:35:01.247 # dc6d874fe71e4f8f25e15946940f2b8eb087b2e8voted for d760d62e190354654490e75e0b427d8ae095ac5a 976274:X 13 Jul 2021 15:35:01.247 # 2e9b0ac7ffbfca08e80debff744a4541a31b3951voted for d760d62e190354654490e75e0b427d8ae095ac5a 976274:X 13 Jul 2021 15:35:01.309 # +elected-leader master mymaster192.168.221.128 637976274:X 13 Jul 2021 15:35:01.309 # +failover-state-select-slave master mymaster192.168.221.128 637976274:X 13 Jul 2021 15:35:01.400 # +selected-slave slave 192.168.221.130:6379192.168.221.130 6379 @ mymaster 192.168.221.128 637976274:X 13 Jul 2021 15:35:01.400 * +failover-state-send-slaveof-noone slave192.168.221.130:6379 192.168.221.130 6379 @ mymaster 192.168.221.128 637976274:X 13 Jul 2021 15:35:01.477 * +failover-state-wait-promotion slave192.168.221.130:6379 192.168.221.130 6379 @ mymaster 192.168.221.128 637976274:X 13 Jul 2021 15:35:02.045 # +promoted-slave slave 192.168.221.130:6379192.168.221.130 6379 @ mymaster 192.168.221.128 637976274:X 13 Jul 2021 15:35:02.045 # +failover-state-reconf-slaves master mymaster192.168.221.128 637976274:X 13 Jul 2021 15:35:02.115 * +slave-reconf-sent slave 192.168.221.129:6379192.168.221.129 6379 @ mymaster 192.168.221.128 637976274:X 13 Jul 2021 15:35:03.070 * +slave-reconf-inprog slave192.168.221.129:6379 192.168.221.129 6379 @ mymaster 192.168.221.128 637976274:X 13 Jul 2021 15:35:03.070 * +slave-reconf-done slave 192.168.221.129:6379192.168.221.129 6379 @ mymaster 192.168.221.128 637976274:X 13 Jul 2021 15:35:03.133 # +failover-end master mymaster 192.168.221.128637976274:X 13 Jul 2021 15:35:03.133 # +switch-master mymaster 192.168.221.128 6379192.168.221.130 637976274:X 13 Jul 2021 15:35:03.133 * +slave slave 192.168.221.129:6379192.168.221.129 6379 @ mymaster 192.168.221.130 637976274:X 13 Jul 2021 15:35:03.133 * +slave slave 192.168.221.128:6379192.168.221.128 6379 @ mymaster 192.168.221.130 637976274:X 13 Jul 2021 15:35:08.165 # +sdown slave 192.168.221.128:6379192.168.221.128 6379 @ mymaster 192.168.221.130 6379
四、实现原理
每个Sentinel以每秒钟一次的频率向它所知的Master/Slave以及其他 Sentinel 实例发送一个 PING命令
如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-aftermilliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
当有足够数量的 Sentinel(大于等于配置文件指定的值:quorum)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。
在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO命令
当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 ,若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
五、谁来完成故障转移
1.常见的数据一致性算法
paxos,paxos应该是最早也是最正统的数据一致性算法,也是最复杂难懂的算法。
raft,raft算法应该是最通俗易懂的一致性算法,它在nacos、sentinel、consul等组件中都有使用。
zab协议,是zookeeper中基于paxos算法上演变过来的一种一致性算法
distro,Distro协议。Distro是阿里巴巴的私有协议,目前流行的Nacos服务管理框架就采用了Distro协议。Distro 协议被定位为 临时数据的一致性协议
2.Raft协议说明
3.故障转移过程
选出Sentinel Leader之后,由Sentinel Leader向某个节点发送slaveof no one命令,让它成为独立节点。
然后向其他节点发送replicaof x.x.x.x xxxx(本机服务),让它们成为这个节点的子节点,故障转移完成。
断开连接时长,如果与哨兵连接断开的比较久,超过了某个阈值,就直接失去了选举权
优先级排序,如果拥有选举权,那就看谁的优先级高,这个在配置文件里可以设置(replicapriority 100),数值越小优先级越高
复制数量,如果优先级相同,就看谁从master中复制的数据最多(复制偏移量最大)
进程id,如果复制数量也相同,就选择进程id最小的那个