哨兵模式

哨兵

哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。

redis哨兵脑裂解决方案 redis 哨兵 原理_主从切换

哨兵作用

监控:监控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信息)

redis哨兵脑裂解决方案 redis 哨兵 原理_主从切换_02

sentinel(哨兵1)----->向master(主)和slave(从)发起info,拿到全信息。

sentinel(哨兵2)----->向master(主)发起info,就知道已经存在的sentinel(哨兵1)的信息,并且连接slave(从)。

sentinel(哨兵2)----->向sentinel(哨兵1)发起subscribe(订阅)。

通知阶段

sentinel在通知阶段要不断的去获取master/slave的信息,然后在各个sentinel之间进行共享

redis哨兵脑裂解决方案 redis 哨兵 原理_redis哨兵脑裂解决方案_03

故障转移阶段

通知阶段sentinel发送的通知没得到master的回应,就会把master标记为SRI_S_DOWN,并且把master的状态发给各个sentinel

其他sentinel听到master挂了,说我不信,我也去看看,并把结果共享给各个sentinel,当有一半的sentinel都认为master挂了的时候,就会把master标记为SRI_0_DOWN

redis哨兵脑裂解决方案 redis 哨兵 原理_主从切换_04

这时就要把master给换掉了。然后哪个sentinel发起这个通知呢?sentinel之间会发起投票,每个sentinel都会向其他的sentinel发起通知,说我要参加竞选,然后的票过半的sentinel会当选.

投票方式: 自己最先接到哪个sentinel的竞选通知就会把票投给它。(a b都向c发通知说我要竞选,c先接到b的通知,c就投b一票)。如果一轮下来,谁的票数都没过半,那就再来一轮(竞选次数+1)

redis哨兵脑裂解决方案 redis 哨兵 原理_redis哨兵脑裂解决方案_05

钦差大臣出来了,这下要思考这莫多slave谁当master呢?

剔除一下情况的slave:

1.不在线的

2.响应慢的

3.与原来的master断开的时间久的

4.优先原则

   4.1优先级 4.2offset(偏移量) 4.3 runid(剔除大的)

选出新皇后,向新的master发送slaveof no one , 昭告天下,通知其他slave新皇master的IP端口。

redis哨兵脑裂解决方案 redis 哨兵 原理_服务器_06

总结:故障转移阶段

  1. 发现问题,主观下线与客观下线
  2. 竞选负责人
  3. 优选新master
  4. 新master上任,其他slave切换master,原master作为slave故障恢复后连接