记录一下:Redis Sentinel 哨兵机制详解与故障转移实践
引言
Redis 单实例存在单点故障风险。Sentinel 通过监控、通知、自动故障转移三个核心机制,实现 Redis 的高可用。本文详细解析 Sentinel 的工作原理与部署实践。
Sentinel 三大核心机制
1. 监控 (Monitoring)
Sentinel 定期向 Redis 实例发送 PING 命令检测其存活状态
同时监控主从关系是否正常
2. 通知 (Notification)
当 Redis 实例发生故障时,Sentinel 通过 Pub/Sub 机制向客户端通知
客户端基于通知调整连接目标
3. 自动故障转移 (Failover)
主库故障时,Sentinel 自动选举一个从库提升为新主库
其他从库自动同步到新主库,实现 HA
Sentinel 部署架构
典型的三节点 Sentinel + 一主二从 Redis 架构:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Sentinel 1 │ │ Sentinel 2 │ │ Sentinel 3 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└────────────────┼────────────────┘
监控关系链路
│
┌───────────┼───────────┐
│ │ │
┌───────┐ ┌───────┐ ┌───────┐
│Master │ │Slave1 │ │Slave2 │
│:6379 │ │:6379 │ │:6379 │
└───────┘ └───────┘ └───────┘
实战配置
Sentinel 配置文件 (sentinel.conf
):
# 监听端口
port 26379
# 监控的主库信息
# 格式: sentinel monitor <master-name> <ip> <port> <quorum>
sentinel monitor mymaster 192.168.1.10 6379 2
# 主库无响应超时时间(毫秒)
sentinel down-after-milliseconds mymaster 30000
# 故障转移超时时间(毫秒)
sentinel failover-timeout mymaster 180000
# 故障转移时,最多有多少个从库同时同步新主库
sentinel parallel-syncs mymaster 1
# 日志文件
logfile /var/log/sentinel.log
# 工作目录(用于存储临时文件)
dir /var/lib/sentinel
启动 Sentinel:
redis-sentinel sentinel.conf
故障转移流程
故障检测: 任一 Sentinel 检测到主库 PING 超时 30 秒,将其标记为主观下线 (SDOWN)
主观判断: 当 quorum 数量的 Sentinel 都认为主库故障,标记为客观下线 (ODOWN)
选举: 通过 Raft 算法选举一个 Sentinel Leader 执行故障转移
选从: Leader 从可用从库中选择一个提升为新主库(优先选择复制进度最快的从库)
同步: 其他从库同步到新主库
通知: 发送
+switch-master
事件给客户端
客户端应对策略
Sentinel 通过 Pub/Sub 向客户端发送事件通知:
import redis
from redis.sentinel import Sentinel
# 初始化 Sentinel
sentinels = [
('192.168.1.11', 26379),
('192.168.1.12', 26379),
('192.168.1.13', 26379)
]
sentinel = Sentinel(sentinels)
# 获取主库连接
master = sentinel.master_for('mymaster', socket_timeout=0.1)
# 获取从库连接(支持负载均衡)
slave = sentinel.slave_for('mymaster', socket_timeout=0.1)
# 写操作在主库
master.set('key', 'value')
# 读操作可在从库
value = slave.get('key')
常见问题
1. 故障转移频繁发生
检查网络延迟与丢包情况
调整
down-after-milliseconds
与sentinel-failover-timeout
考虑提升 Sentinel 节点硬件配置
2. 主库故障后客户端无法连接
确保客户端库支持 Sentinel 模式(如 Redis-py、Jedis)
检查 Sentinel 配置中的通知事件是否发送正常
3. 从库提升后数据丢失
由于异步复制的特性,故障转移时可能丢失最后几条命令
对数据一致性要求极高的场景,考虑使用 Redis 6.0+ 的 ACL 与持久化配置
总结
Sentinel 是 Redis 实现 HA 的标准方案。通过合理配置和监控,可以实现秒级的自动故障转移。生产环境应至少部署 3 个 Sentinel 节点以实现高可用。