定义
Redis 哨兵是 Redis 官方提供的高可用解决方案,专门用于监控主从集群,并在主节点故障时自动完成故障转移,以此保证服务的持续可用。
1、监控(Monitoring)
哨兵会以每秒一次的频率,向集群中的所有主节点、从节点发送 ping 命令,来检测它们是否正常运行。 2、自动故障恢复(Automatic failover) 当主节点被判定为客观下线时,哨兵会从从节点中选举一个新的主节点。 它会让其他从节点都指向这个新主节点进行数据同步。 当旧主节点恢复后,会被降级为从节点,去同步新主节点的数据。 3、通知(Notification)
sentinel从单个redis客户端的服务发现来源,在集群发生故障转移后,它会把新的主节点信息推送给客户端,确保客户端可以连接到正确的节点。

服务状态监控
下线判定
-
主观下线(Subjectively Down,SDOWN) :单个哨兵节点(sentinel节点)在规定时间内没有收到某个实例的
ping响应,就会认为该实例主观下线。 -
客观下线(Objectively Down,ODOWN) :当超过
quorum(通常是哨兵数量的半数以上)个哨兵节点都认为同一个实例主观下线时,该实例才会被判定为客观下线,这是为了避免网络抖动导致的误判。

选主规则(新主节点的选举)
哨兵会按照以下优先级从从节点中选择新的主节点:
-
排除不健康节点:先排除与主节点断开时间过长、或处于异常状态的从节点。
-
slave-priority优先 :优先选择slave-priority值更小的节点(值越小,优先级越高)。 -
数据完整性优先 :如果优先级相同,选择
offset(偏移量)更大的节点,代表它的数据与原主节点更接近。 -
运行 ID 优先:如果前两项都相同,选择运行 ID 更小的节点。
脑裂(Split Brain)
1、网络分区(Network Partition),也叫 "脑裂"(Split Brain),是分布式系统中一种常见的故障场景,指的是因为网络故障,一个完整的集群被分割成了多个彼此无法通信的子集群。
2、当网络分区发生时,哨兵集群与原主节点失去了连接,会选举一个从节点成为新主节点。此时集群中就出现了两个主节点,客户端可能会向旧主节点写入数据,而新主节点无法同步这部分数据。

当网络恢复后,旧主节点会被降为从节点,从新主节点同步数据,这就会导致旧主节点上的新写入数据丢失。

可以通过配置两个关键参数来降低数据丢失的风险:
-
min-replicas-to-write 1:主节点必须至少有 1 个从节点保持正常连接,否则拒绝写请求。
-
min-replicas-max-lag 5:主从节点之间的数据同步延迟不能超过 5 秒,否则拒绝写请求。
这两个配置可以确保主节点在无法将数据同步给足够多的从节点时,拒绝新的写操作,以此避免在脑裂场景下的数据丢失。
总结:本文介绍了redis哨兵(sentinel)的定义作用(监控,自动故障恢复,通知)。并介绍了两种实例下线(主观下线,客观下线)判断的依据。还介绍了主节点发生故障时新主节点的选举的规则。最后介绍了网络分区(脑裂)的过程及用来降低此过程数据丢失风险的两个配置(min-replicas-to-write,min-replicas-max-lag )。