Redis哨兵(Sentinel)-剖析其作用与原理

为什么会有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节点的从节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值