哨兵机制是 Redis 高可用中重要的一环,其核心是 通过高可用哨兵集群,监控主从复制的健康状态,并实现自动灾备:
哨兵集群以集群的方式进行部署,这种分布式特性具有以下优点:
避免系统中存在单点,防止灾备机制失效
切换 master 必须经过多个 sentinel 节点协商同意,避免出现误判
为了保证 Redis 服务的高可用,哨兵机制提供了以下功能:
监控Monitoring:实时监控主从节点的健康状况
通知Notification:通过事件 API 将服务实例异常情况即时告知监听者
自动灾备Automatic failover:当 master 节点失效时从 slave 中选举出新的 master
服务发现Configuration provider:客户端通过哨兵集群获取 master 实例信息,在发生自动灾备时能及时将 master 变化告知客户端
相关配置建立哨兵集群的配置相对简单,只需配置以下选项即可:
sentinel monitor <master-name> <ip> <port> <quorum>需要监控的 master 节点的信息(由于 sentinel 会自动发现 slave 节点信息,因此无需配置)
master-name 用于区分不同的 master 节点,会被用于 master 发现
quorum 是启动故障转移failover时,所需的最小 sentinel 数量
故障转移前需要选举出一个 leader 节点执行 master 切换,为了达成共识,该过程必须有半数以上的节点majority参与
假设当前哨兵集群总共有 m 个节点,当 quorum 设置为 n 时(n ≤ m)
若同时有 n 个节点判断当前 master 已经下线,则其中的某个 sentinel 会尝试发起故障转移
实际执行故障转移需要进行 leader 选举,因此仅当集群中至少有 m/2 以上的 sentinel 节点可用时,故障转移才可能启动
简而言之,quorum 仅影响故障检测流程,用于控制发起故障转移的时机,但是无法决定 failover 是否会被执行
因此,哨兵实例应不少于 3 个,否则一旦某个哨兵节点失效后,即便 quorum 设置为 1,依然无法启动 faiover