Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。
Redis哨兵(Redis Sentinel)是一种用于监控和管理Redis主从复制架构的特殊进程。它可以自动检测主节点故障,并进行故障转移,将一个从节点升级为新的主节点,以确保系统的高可用性。
哨兵的作用如下:
监控:Sentinel 会不断检查您的master和slave是否按预期工作
自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主
通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端
集群监控原理:
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:
•主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。
•客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。
集群故障恢复原理:
一旦发现master故障,sentinel需要在salve中选择一个作为新的master,选择依据是这样的:
- 首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds * 10)则会排除该slave节点
- 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举
- 如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高
- 最后是判断slave节点的运行id大小,越小优先级越高。
当选出一个新的master后,该如何实现切换呢?
选择新的master流程如下:
- sentinel给备选的slave1节点发送slaveof no one命令,让该节点成为master
- sentinel给所有其它slave发送slaveof 新masterIP地址和端口 命令,让这些slave成为新master的从节点,开始从新的master上同步数据。
- 最后,sentinel将故障节点标记为slave,当故障节点恢复后会自动成为新的master的slave节点
Redis哨兵的一般工作流程:
配置哨兵:在每个Redis哨兵节点上,创建一个配置文件sentinel.conf,并在其中指定监控的Redis实例的IP地址和端口号。
启动哨兵:启动每个Redis哨兵节点,并以配置文件sentinel.conf为参数。
选举领导者:当哨兵节点启动后,它们将相互通信以选举出一个领导者(leader),领导者负责监视主节点的状态并做出决策。
监控主节点:哨兵节点通过发送命令来监控主节点的运行状况,包括PING、INFO、PING、ROLE等命令。
检测主节点故障:如果哨兵节点在一定时间内没有收到来自主节点的回复或检测到了其他问题,它们将判断主节点发生了故障。
故障转移:一旦哨兵节点检测到主节点故障,它会选择一个合适的从节点作为新的主节点,并将其他从节点切换到新的主节点上。这个过程称为故障转移(failover)。
客户端重定向:一旦故障转移完成,哨兵节点将向客户端发送重定向信息,使得客户端可以连接到新的主节点。
恢复主节点:当原来的主节点恢复后,它将成为新的从节点,根据配置文件sentinel.conf中的配置进行操作。
通过Redis哨兵,可以实现Redis主从架构的自动故障检测和转移,提高了系统的可用性和容错能力。哨兵还提供了监控和通知功能,可以及时发现和解决Redis集群中的问题。