哨兵模式
哨兵
哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。
哨兵作用
监控:监控master和slave
不断的检查master和slave是否正常运行
master存活检测、master与slave运行情况检测
通知(提醒):当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知
自动故障转移:断开master与slave连接,选取一个slave作为master,将其他slave连接新的master,并告知客户端新的服务器地址
Redis配置哨兵模式
1:设置哨兵监听的主服务器信息, sentinel_number表示参与投票的哨兵数量
sentinel monitor master_name master_host master_port sentinel_number
2:设置判定服务器宕机时长,该设置控制是否进行主从切换
sentinel down-after-milliseconds master_name million_seconds
3:设置故障切换的最大超时时
sentinel failover-timeout master_name million_seconds
4:设置主从切换后,同时进行数据同步的slave数量,数值越大,要求网络资源越高,数值越小,同步时间越长
sentinel parallel-syncs master_name sync_slave_number
- 启动哨兵
redis-sentinel filename
哨兵工作原理
哨兵在进行主从切换过程中经历三个阶段
-
监控
-
通知
-
故障转移
监控阶段
用于同步各个节点的状态信息
-
获取各个sentinel的状态(是否在线)
-
获取master的状态
-
获取所有slave的状态(根据master中的slave信息)
sentinel(哨兵1)----->向master(主)和slave(从)发起info,拿到全信息。
sentinel(哨兵2)----->向master(主)发起info,就知道已经存在的sentinel(哨兵1)的信息,并且连接slave(从)。
sentinel(哨兵2)----->向sentinel(哨兵1)发起subscribe(订阅)。
通知阶段
sentinel在通知阶段要不断的去获取master/slave的信息,然后在各个sentinel之间进行共享
故障转移阶段
通知阶段sentinel发送的通知没得到master的回应,就会把master标记为SRI_S_DOWN,并且把master的状态发给各个sentinel
其他sentinel听到master挂了,说我不信,我也去看看,并把结果共享给各个sentinel,当有一半的sentinel都认为master挂了的时候,就会把master标记为SRI_0_DOWN
这时就要把master给换掉了。然后哪个sentinel发起这个通知呢?sentinel之间会发起投票,每个sentinel都会向其他的sentinel发起通知,说我要参加竞选,然后的票过半的sentinel会当选.
投票方式: 自己最先接到哪个sentinel的竞选通知就会把票投给它。(a b都向c发通知说我要竞选,c先接到b的通知,c就投b一票)。如果一轮下来,谁的票数都没过半,那就再来一轮(竞选次数+1)
钦差大臣出来了,这下要思考这莫多slave谁当master呢?
剔除一下情况的slave:
1.不在线的
2.响应慢的
3.与原来的master断开的时间久的
4.优先原则
4.1优先级 4.2offset(偏移量) 4.3 runid(剔除大的)
选出新皇后,向新的master发送slaveof no one , 昭告天下,通知其他slave新皇master的IP端口。
总结:故障转移阶段
-
发现问题,主观下线与客观下线
-
竞选负责人
-
优选新master
-
新master上任,其他slave切换master,原master作为slave故障恢复后连接