一、什么是哨兵
Redis的哨兵(Sentinel)是Redis分布式系统中的一种特殊角色,用于监控和管理Redis主从复制架构中的主节点(master)和从节点(slave)。
哨兵的主要功能是确保Redis系统的高可用性。它通过持续监控Redis节点的状态,并在发现节点故障或下线时自动执行故障转移操作,将从节点提升为新的主节点,以确保服务的连续性。当原始的主节点恢复正常时,哨兵还可以将其重新加入到集群中作为从节点。
哨兵的工作模式如下:
- 监控:每个哨兵定期向Redis节点发送心跳检查,以确保节点的健康状态。
- 故障检测:如果一个哨兵在一段时间内无法与主节点通信,它将判断主节点宕机,并开始选举新的主节点。
- 故障转移:哨兵会选举一个从节点作为新的主节点,并通过发送命令通知其他节点更新配置。
- 通知:哨兵会通知客户端Redis节点的变化,使客户端能够连接到新的主节点。
- 自动故障恢复:当原主节点恢复时,哨兵会将其重新加入集群作为从节点,保持主从复制的正常工作。
通过使用哨兵,Redis可以在主节点故障时自动实现故障转移,提供高可用性和容错能力,同时减少了手动干预的需求。哨兵可以监控多个Redis节点,并支持多个哨兵组成的集群,以提供更高的可靠性和扩展性。
二、使用哨兵
(1)搭建主从复制服务
启动一个一主二从的redis系统,启动参考:Linux下使用命令行和配置文件两种方式实现主从复制-CSDN博客
主数据库启动在6381端口,从数据库启动在6382 6383端口。
查看主从复制配置信息:
(2)配置哨兵
建立一个配置文件,如 sentinel.conf 内容如下:
#zy-master表示要监控的主数据库名字,可以自定义
sentinel monitor zy-master 127.0.0.1 6381 1
port 26380
(3)启动哨兵
redis-sentinel sentinel.conf
启动后,哨兵会输出如下内容:
(4)验证哨兵的作用(停止6381节点)
杀死主库的服务,即关闭运行在6381端口的实例
等待指定事件后(可以配置,默认30秒),哨兵会输出如下内容:
到 6383 的实例中查看,可以看到已经成为了主节点:
(5)重新启动6381节点
再次查看6383的主从复制信息:
三、原理
1.下线检测
哨兵和主数据库的连接建立完成后,哨兵会定时执行下面3个操作:
-
心跳检查(Heartbeat Checks):哨兵会定期向主数据库发送心跳检查,以确保主数据库的健康状态。这样可以及时发现主数据库是否仍然正常工作。
-
主观下线检测(Subjective Down Detection):如果哨兵在一定时间内无法与主数据库进行通信,它会认为主数据库发生了故障,并将其标记为主观下线(Subjectively Down)状态。哨兵会将这一信息传播给其他哨兵和相关节点。
-
客观下线检测(Objective Down Detection):当多个哨兵都将主数据库标记为主观下线状态后,它们将进行投票并达成共识,确认主数据库的客观下线(Objectively Down)状态。这时哨兵会执行故障转移操作,选择一个从数据库提升为新的主数据库。
sentinel monitor zy-master 127.0.0.1 6381 1
这里的最后一个参数 1 就是最低通过票数
如果配置成 2 ,就表示至少要有两个Sentinel节点认为该主数据库主观下线时,当前哨兵节点才会认为该主数据库客观下线。需要进行故障恢复。但是故障恢复需要由一个领头的哨兵来完成,这样可以保证同一时间只有一个哨兵节点来进行故障恢复。
2. 哨兵的部署
哨兵以独立进程的方式对一个主从系统进行监控,监控的效果好坏取决于哨兵的视角是否具有代表性,如果一个主从系统配置的哨兵较少,哨兵对整个系统的判断的可靠性就会降低。极端情况下,当只有一个哨兵时,哨兵本身就可能会发生单点故障。整体来讲,相对稳妥的哨兵部署方案是使得哨兵的视角尽可能地与每一个节点的视角一致,即:
(1)为每个节点(无论是主库还是从库)都部署一个哨兵
(2)使每个哨兵与其对应的节点的网络环境相同或相近。
同时设置quorum(最低通过票数)的值为 N/2 + 1 (N为哨兵数量),这样使得只有大部分哨兵节点同意后才会进行故障恢复。