一、What?
Redis Sentinel是一个分布式系统,为Redis提供高可用性解决方案。可以在一个架构中运行多个Sentinel进程(progress),这些进程使用流言协议 (gossip protocols)来接收关于主服务器是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个从服务器作为 新的主服务器。
Redis的Sentinel系统用于管理多个Redis服务器,该系统执行以下三个任务:
- 监控:Sentinel会不断地定期检查你的主服务器和从服务器是否运作正常。
- 提醒:当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。
- 自动故障迁移:当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效 主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。
二、How?
每隔1秒每个哨兵会向主节点、从节点及其余哨兵节点发送一次ping命令做一次心跳检测,这个是哨兵用来判断节点是否正常的重要依据。
1、主观下线、客观下线
主观下线:所谓主观下线,就是单个sentinel认为某个服务下线(有可能是接收不到订阅,网络不通等原因)。
sentinel配置文件中的down-after-milliseconds设置了判断主观下线的时间长度,如果实例在down-after-milliseconds毫秒内,返回的都是无效回复, 那么sentinel认为该实例已(主观)下线,修改其flags状态为SRI_S_DOWN。如果多个sentinel监视一个服务,有可能存在多个sentinel的 down-after-milliseconds配置不同,这个在实际生产中要注意。
客观下线:当主观下线的节点是主节点时,此时哨兵节点会通过指令sentinel is-masterdown-by-addr寻求其它哨兵节点对主节点的判断,如果其他的哨兵也认为 主节点主观下线了,且当认为主观下线的票数超过了quorum(一般配置为哨兵节点个数的一般+1)个数,此时哨兵节点则认为该主节点确实有问题,这样就客观下线了, 大部分哨兵节点都同意下线操作,也就说是客观下线。
2、哨兵leader选举流程
哨兵leader选举流程: 如果主节点被判定为客观下线之后,就要选取一个哨兵节点来完成后面的故障转移工作,选举出一个leader的流程如下:
- 每个在线的哨兵节点都可以成为领导者,当它确认主节点下线时,会向其它哨兵发is-master-down-by-addr命令,征求判断并要求将自己设置为领导者, 由领导者处理故障转移
- 当其它哨兵收到此命令时,可以同意或者拒绝它成为领导者
- 如果哨兵发现自己在选举的票数大于等于num(sentinels)/2+1时,将成为领导者,如果没有超过,继续选举
3、自动故障转移机制
在从节点中选择新的主节点: sentinel状态数据结构中保存了主服务的所有从服务信息,领头sentinel按照如下的规则从从服务列表中挑选出新的主服务:
- 较低的slave_priority(这个是在配置文件中指定,默认配置为100),如果有则返回没有就继续选择
- 较大的replication offset(每个slave在与master同步后offset自动增加),复制偏移量越大则数据复制的越完整,如果有就返回了,没有就继续
- 较小的runid(每个redis实例,都会有一个runid,通常是一个40位的随机字符串,在redis启动时设置,重复概率非常小)
- 如果以上条件都不足以区别出唯一的节点,则会看哪个slave节点处理之前master发送的command多,就选谁。
更新主从状态:
- 通过slaveof no one命令,让选出来的从节点成为主节点;并通过slaveof命令让其他节点成为其从节点。
- 将已下线的主节点设置成新的主节点的从节点,当其回复正常时,复制新的主节点,变成新的主节点的从节点