深入理解Redis哨兵模式原理

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

前言

上文介绍了Redis主从复制的原理,它解决了Redis数据备份的问题,master节点发生故障后不能自动选举出新的主节点,需要人工将slave节点设置成主节点,效率低下,不能实现自动故障转移,Redis官方提供了一个高可用解决方案Sentinel。

一、Redis sentinel是什么?

Redis Sentinel是Redis的官方高可用性解决方案。Redis Sentinel为Redis提供高可用性。实际上,这意味着使用Sentinel可以创建一个Redis集群,在没有人为干预的情况下抵抗某些类型的失败,自动实现故障转移。 

二、sentinel能干什么?

1、监控redis集群节点(master+replica)和sentinel节点健康状态

2、自动故障转移:如果master出现故障,sentinel可以实现故障转移,并且通知客户端连接新的master。

3、通知:通过api,可以发送通知到管理员,开发人员,监控的redis实例出现了故障

4、配置中心:客户端连接到sentinel,sentinel可以访问master将节点信息返回给客户端 

三、启动sentinel方法

1、redis-sentinel /path/to/sentinel.conf

2、redis-server /path/to/sentinel.conf --sentinel 

sentinel​.conf配置说明如下​

# 配置需要监控的master节点信息 2代表法定人数 作用是表示需要最少需要多少个sentinel节点同意
#master节点不可达才标记为客观下线
#举例 5个sentinel实例 quorum设置成2 那么有2个sentinel节点认为master不可达,
#则其中一个会启动故障转移#如果至少有三个哨兵可到达,故障转移将被授权并实际启动。
sentinel monitor mymaster 127.0.0.1 6379 2 
#只需要配置master sentinel会自动检测slave信息
sentinel down-after-milliseconds mymaster 60000 
#如果master在指定时间内没有响应ping命令/或报错,则认为主观下线了。
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1 
#指定故障转移的时候,同时支持多少个replica并行的与master同步数据,越小故障转移越久
#以上配置可以通过SENTINEL SET command.来实时修改。
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
复制代码

注意点:

Redis-sentinel必须使用配置文件启动,重启需要根据配置文件恢复,默认打开26379端口,sentinel之间必须开放端口访问,方便相互访问。 

四、Sentinel工作流程

1、首先sentinel​之间是通过redis的pub/subscribe​机制实现动态感知。

2、sentinel是如何感知master​挂掉的呢?

这里有两种情况,一种是master主观下线,一种是​master客观下线。

主观下线:每个sentinel每1s向master发送ping命令,如果在down-after-milliseconds时间内master没有响应,则该sentinel节点认为master​主观下线了。

​客观下线:

当主观下线的节点是主节点时,哨兵节点会通过指令sentinel is-masterdown-by-addr寻求其它哨兵节点对主节点的判断,当超过quorum(在sentinel配置中配置的法定人数)个数,此时哨兵节点则认为该主节点确实有问题,这样就客观下线了,大部分哨兵节点都同意下线操作,也就说是客观下线。 

注意客观下线只针对master节点生效,它会触发故障转移

3,master下线了,需要进行故障转移

这里又分为两步,首先需要选择sentinel哨兵主节点,通过sentinel主节点来进行​redis的故障转移。

首先是sentinel选举领导者。使用raft算法(状态共识算法)。

每一个Sentinel节点都可以成为Leader,当一个Sentinel节点确认redis集群的主节点主观下线后,会请求其他Sentinel节点要求将自己选举为Leader。被请求的Sentinel节点如果没有同意过其他Sentinel节点的选举请求,则同意该请求(选举票数+1),否则不同意。

如果一个Sentinel节点获得的选举票数达到Leader最低票数(quorum和Sentinel节点数/2+1的最大值),则该Sentinel节点选举为Leader;否则重新进行选举。

Raft核心思想:先到先得,少数服从多数。 

sentinel选举出主节点后,sentinel主节点需要选举出redis​集群主节点,构建新的集群关系。

选举新redis主节点的依据​是:

1、与sentinel断开连接的时间。过滤发现与主sentinel服务器断开连接的时间超过配置的主机超时时间down-after-milliseconds的副本slaves

2、副本优先级。 优先选择replica-priority低的。

3、如果优先级相同,已处理复制偏移量。越大越优先,这个更符合业务场景功能。

4、如果复制offset相同,就看运行ID。优先选择小的。 

选择出master节点后,开始维护集群关系。

1、sentinel节点,向新主节点发送,slave no one命令,让它成为独立节点

2、sentinel节点,向其他节点发送 slaveof ip port,跟随到主节点 

五、总结

通过上面的分析,sentinel通过定时监控手段,可以实现自动故障转移,不过sentinel还是有一些问题,比如单个master节点情况下,数据存在丢失的可能,​并且如果单机性能有限,也没有横向扩展的能力。​

猜你喜欢

转载自juejin.im/post/7055694098837012511