哨兵模式(Sentinel) 是 Redis 提供的一种高可用性(High Availability, HA)解决方案,用于监控和管理 Redis 主从架构中的主节点(Master)和从节点(Slave)。当主节点出现故障时,哨兵可以自动进行故障转移(Failover),将一个从节点提升为新的主节点,从而保证服务的持续可用。
1. 哨兵模式的作用
- 监控:哨兵会不断检查主节点和从节点的健康状态。
- 通知:当某个节点出现故障时,哨兵可以通过 API 或脚本通知管理员。
- 自动故障转移:如果主节点不可用,哨兵会自动将一个从节点提升为新的主节点。
- 配置提供者:客户端可以通过哨兵获取当前的主节点地址。
2. 哨兵模式的架构
哨兵模式通常由多个哨兵节点和一个 Redis 主从集群组成:
- Redis 主节点(Master):负责写操作。
- Redis 从节点(Slave):负责读操作,并复制主节点的数据。
- 哨兵节点(Sentinel):监控主从节点的健康状态,执行故障转移。
3. 哨兵模式的配置
配置 Redis 主从集群
假设我们有一个主节点和两个从节点:
- 主节点:
127.0.0.1:6379
- 从节点 1:
127.0.0.1:6380
- 从节点 2:
127.0.0.1:6381
在从节点的配置文件中,添加以下内容:
slaveof 127.0.0.1 6379
配置哨兵节点
创建一个哨兵配置文件(例如 sentinel.conf
),内容如下:
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
port 26379
:哨兵节点的端口号。sentinel monitor mymaster 127.0.0.1 6379 2
:- 监控名为
mymaster
的主节点(127.0.0.1:6379
)。 2
表示至少需要 2 个哨兵节点同意才能进行故障转移。
- 监控名为
sentinel down-after-milliseconds mymaster 5000
:- 如果主节点在 5000 毫秒内没有响应,哨兵会认为它已经下线。
sentinel failover-timeout mymaster 10000
:- 故障转移的超时时间为 10000 毫秒。
sentinel parallel-syncs mymaster 1
:- 故障转移后,同时同步新主节点的从节点数量为 1。
启动哨兵节点
redis-sentinel /path/to/sentinel.conf
4. 哨兵模式的工作原理
- 监控:
- 哨兵节点会定期向主节点和从节点发送
PING
命令,检查它们的健康状态。
- 哨兵节点会定期向主节点和从节点发送
- 故障检测:
- 如果主节点在指定时间内没有响应,哨兵会将其标记为“主观下线”(Subjectively Down, SDOWN)。
- 当多个哨兵节点都认为主节点下线时,会将其标记为“客观下线”(Objectively Down, ODOWN)。
- 故障转移:
- 哨兵会从从节点中选举出一个新的主节点。
- 更新其他从节点的配置,使它们复制新的主节点。
- 通知客户端新的主节点地址。
- 恢复:
- 如果旧的主节点重新上线,哨兵会将其配置为从节点,并让它复制新的主节点。
5. 哨兵模式的优点
- 高可用性:自动故障转移,减少服务中断时间。
- 自动化:无需人工干预,哨兵会自动处理故障。
- 可扩展性:支持多个哨兵节点,提高监控的可靠性。
6. 哨兵模式的缺点
- 配置复杂:需要配置多个哨兵节点和 Redis 主从集群。
- 脑裂问题:在网络分区的情况下,可能会出现多个主节点。
- 性能开销:哨兵节点需要不断监控和通信,有一定的性能开销。
7. 哨兵模式 vs Redis Cluster
- 哨兵模式:
- 适合小规模集群。
- 提供高可用性,但不支持数据分片。
- Redis Cluster:
- 适合大规模集群。
- 提供高可用性和数据分片。
8. 实践建议
- 至少部署 3 个哨兵节点,以确保高可用性。
- 监控哨兵节点的状态,确保其正常运行。
- 在生产环境中,结合 Redis Cluster 使用,以获得更好的扩展性和性能。