前言
上文介绍了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节点情况下,数据存在丢失的可能,并且如果单机性能有限,也没有横向扩展的能力。