为什么会有Redis哨兵?
在Redis中,如果一个从节点宕机,那么其可以去找主节点同步数据,那么当一个主节点宕机后,此时Redis只能进行从节点的读操作而无法进行写操作,如果此时主节点长时间不能恢复,那势必会造成严重的影响(长时间不能向Redis中进行写操作),为了解决这一问题,Redis哨兵应运而生。
Redis哨兵的作用?
哨兵的作用体现在三个方面:1.监控:Sentinel会不断的监控Redis当中的主节点以及从节点,判断其是否按照预期进行工作
2.自动故障恢复:当主节点故障时,Sentinel会在从节点中选取一个slave(从节点)并将其提拔成master(主节点),即便是此时主节点恢复了也是以刚提拔的从节点为主。
3.通知:Sentinel会在集群发生故障时,将最新的信息推送给Redis客户端,保障信息一致。
此时又会有一些问题了,例如Sentinel是如何来判断某一节点是否是正常运行的呢?
在集群当中,从节点不止一个,Sentinel在提拔从节点时是如何选择的呢?
Sentinel是如何实现推送最新信息给各个节点的呢?
首先,第一个问题Sentinel是如何来判断某一节点是否是正常运行的?
Sentinel基于心跳机制监测服务状态,每隔一秒向集群的每个实例发送ping命令
这里有两个概念分别是主观下线和客观下线。
主观下线顾名思义就是我主观认为你是下线了,而客观下线说明你的下线是一个客观事实
如果某一个Sentinel监测到某一个实例没有在规定的时间内响应,则该Sentinel认为该实例主观下线,如果说一定数量的Sentinel都认为该实例主观下线,那么该实例客观下线。
这里的一定数量(quorum)是可以配置的,通常情况下我们认为,数量应该超过Sentinel实例的一半。
其次,Sentinel在提拔从节点时是如何选择的呢?
选择的依据有以下几点:
1.首先去判断slave节点与master节点断开时间的长短,如果超过了指定值(down-after-milliseconds*10)则会排除该slave节点。这样的话我们就首先排除了一些过旧的节点了。
2.其次在slave节点当中有自己的一个优先级,值是slave-priority,其值越小则优先级越高,如果值是0,则代表不参与选择。
3.然后去判断offset的值,如果offset值越大,代表其数据越新,因为他是最新完成增量覆盖的,那么其便会更容易成为新的master
4.最后去判断slave节点的运行id大小,越小优先级越高。
最后,Sentinel是如何实现推送最新信息给各个节点的呢?
首先,Sentinel先对选举成功的slave节点发送一个命令(slaveof no one),此时这个节点就会成为新的master节点
然后,Sentinel向其他的所有节点发送命令,让这些节点成为新的master节点的从节点,向新的master节点上同步数据。命令格式为 slaveof <ip地址> <端口号>
最后,Sentinel将原先故障的节点设置为slave,当其恢复后将变成新的master节点的从节点。