哨兵实现的功能
- 监控:不断地检查各节点是否正常工作
- 自动故障转移:若主节点失效,哨兵会开始自动故障转移,会在失效的主节点的从节点中选出一个新的主节点
- 配置提供者:客户端初始化的时,通过哨兵来获得当前Redis服务的master地址
- 通知:哨兵可以将故障转移的结果发送给客户端
哨兵大致的说明(回头再看遍)
- 哨兵模式是Redis的高可用方式
- 哨兵不提供读写服务,是特殊的Redis节点,哨兵节点存在多个
- 哨兵节点主要是用来监控Redis的各个服务器节点(master以及其下的slave)
- 如果master宕机,哨兵会立马察觉,并在slave节点中选出一个新的master
- 因为要投票选举,所以哨兵节点的数量应该设为奇数
- 哨兵不仅监控Redis服务器,同时也会相互监控
哨兵的工作流程
监控阶段
- 同步信息
通知阶段
- 保持联通
故障转移
- 发现问题,主观下线sdown,客观下线odown
- 竞选负责人
- 优选新master
- 新master上任,其他slave换master,原master作为slave故障恢复后连接
----------------------------------------------------------详细流程---------------------------------------------------------------------------------------------------------------------详细流程---------------------------------------------------------------------------------------------------------------------详细流程-----------------------------------------------------------
监控阶段:
①sentinel(哨兵节点)先会向master发送一个info指令,获取到master的信息,
②建立一个cmd指令通道,这时会在sentinel端和master端同时保存一些信息
③sentinel将会根据info中的slave信息继续连接slave(两端保存的信息会得到更新)
上图右下的"sentinelState:"应改为"sentinelRedisInstance:",下图已纠正
④当有新的sentinel2连接进来,同样会先向master发送一个info指令,同时创建cmd通道,这时创建两端信息(指sentinelState&sentinelRedisInstance)发现已经有了sentinel1的信息,sentinel2会将自己的信息更新到两端,同时会根据已有的信息去连接sentinel1
sentinel互联之后,sentinel之间会同步信息(互通消息),之后sentinel之间会不断发ping确保连接畅通,当越来越多的sentinel连接进来
sentinel之间形成一个连接网,其工作模式为发布订阅:“发布消息、获取消息”
通知阶段:
在这个阶段,sentinel会不断通过cmd通道向服务器节点发送信息,hello,确认节点是否正常工作
每个sentinel拿到信息后都会在连接网中共享自己拿到的信息
故障转移阶段(重点):
故障转移阶段是基于sentinel的日常工作出现问题,
当sentinel在不断给master发送hello的过程中,发现master没有反馈信息,
sentinel会得到一个结论,master挂了
这时,sentinel1先会给master一个特殊标记s_down(表示有节点发现master已经down了)
然后通过内网发送一条信息告诉别的sentinel,
信息内容是:现在对应的服务器地址端口是什么,状态是什么,以及是谁发现
别的sentinel接收到这个信息,会立马去确认信息的正误,向master发送hello,
当他们获取到master的状态,他们也会将自己获得的信息发送到内网
确认过后,会将s_down改成o_down
- s_down是代表有一个sentinel认为该节点的状态是下线,主观下线
- o_down代表有超过一半的sentinel认为该节点下线,客观下线
紧接着,在内网中会发起一次投票,决定由谁去处理这个问题。
每个sentinel都会在内网中发出一个指令,表示要去处理
每个sentinel都有一票,它会投给他最先接到的sentinel,先接到谁的申请指令就投给谁
最后谁的票数最多,谁就获得处理权
-
- 这时有可能选举失败,如果失败了,内网会开启新一轮的选举,直到选举成功
获得了处理权的sentinel将会去选出一个节点,让它成为master
挑选步骤如下:
- 1)排除不在线的
- 2)排除响应速度慢的
- 3)排除与原master响应慢的
- 4)优先原则
-
- 优先级
- offset,越大表示于同步原master的数据越多
- runid
选举成功后,发送指令,告诉所有节点最终结果
发送指令(sentinel)
- 向新的master发送slaveof no one
- 向其他slave发送slaveof 新masterIP端口
原master作为slave故障恢复后连接