Redis Sentinel通过监控主从节点及Raft协议实现高可用,自动故障转移并提供服务发现,需至少3个Sentinel节点达成共识,确保集群容灾与客户端自动切换。
Redis Sentinel 是 Redis 官方提供的高可用(HA)解决方案,用于 自动故障转移、主从监控 和 服务发现。 核心功能:
- 监控:持续检查主节点和从节点是否正常运行。
- 通知:通过 API 或消息系统告知管理员节点故障。
- 自动故障转移:主节点宕机时,自动选举新主节点并切换客户端流量。
- 配置提供:客户端可通过 Sentinel 获取当前主节点地址。
一、Redis Sentinel 概念
1. 架构组成
- Sentinel 节点:独立进程,不存储业务数据,仅负责监控和协调故障转移。
- 主节点(Master) :提供读写服务的 Redis 实例。
- 从节点(Replica) :复制主节点数据,故障转移后可能升级为主节点。
2. 故障转移流程
- 主观下线(SDOWN) :单个 Sentinel 认为主节点不可用。
- 客观下线(ODOWN) :多个 Sentinel 达成共识确认主节点下线。
- 领导者选举:Sentinel 节点通过 Raft 协议选举领导者。
- 故障转移:选举新主节点,切换从节点复制关系,通知客户端。
二、Redis Sentinel 安装部署
1. 部署步骤
-
部署 Redis 主从集群
- 主节点:
redis-server --port 6379 - 从节点:
redis-server --port 6380 --replicaof 127.0.0.1 6379
- 主节点:
-
配置 Sentinel 节点 创建配置文件
sentinel.conf:port 26379 sentinel monitor mymaster 127.0.0.1 6379 2 # 监控主节点,2表示需2个Sentinel确认故障 sentinel down-after-milliseconds mymaster 5000 # 5秒无响应判定主观下线 sentinel failover-timeout mymaster 60000 # 故障转移超时时间(毫秒) -
启动 Sentinel
redis-sentinel sentinel.conf
2. 部署建议
- Sentinel 节点数量:至少 3 个(避免脑裂问题)。
- 分散部署:将 Sentinel 部署在不同物理服务器上。
三、Redis Sentinel API 详解
1. 常用命令
# 查看主节点信息
SENTINEL get-master-addr-by-name mymaster # 返回主节点 IP 和端口
# 查看所有 Sentinel 节点
SENTINEL sentinels mymaster
# 查看监控的所有主节点
SENTINEL masters
# 强制触发故障转移(无需主节点下线)
SENTINEL failover mymaster
2. 动态配置
# 添加监控的主节点
SENTINEL monitor mymaster2 127.0.0.1 6381 2
# 移除监控的主节点
SENTINEL remove mymaster2
四、Redis Sentinel 客户端
1. 客户端工作流程
- 客户端连接 Sentinel 节点,获取当前主节点地址。
- 订阅 Sentinel 的频道,监听主节点切换事件。
- 主节点切换后,客户端自动重连到新主节点。
2. 示例(Python redis-py)
from redis.sentinel import Sentinel
sentinel = Sentinel([('127.0.0.1', 26379)], socket_timeout=0.1)
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')
五、Redis Sentinel 实现原理
1. 监控机制
- 定期 PING:Sentinel 每 1 秒向所有节点发送
PING。 - 主观下线:若主节点在
down-after-milliseconds内未响应,标记为 SDOWN。
2. 客观下线
- Sentinel 向其他 Sentinel 发送
SENTINEL is-master-down-by-addr请求。 - 当
quorum个 Sentinel 确认主节点下线,标记为 ODOWN。
3. 领导者选举
- 基于 Raft 协议选举领导者 Sentinel,由其执行故障转移。
4. 故障转移流程
- 从从节点列表中选出优先级高、复制偏移量最新的节点作为新主节点。
- 向新主节点发送
REPLICAOF NO ONE,升级为主节点。 - 向其他从节点发送
REPLICAOF,指向新主节点。
六、Redis Sentinel 开发运维实践
1. 生产环境建议
-
节点部署:
- 至少 3 个 Sentinel 节点,跨机房部署。
- 主节点和 Sentinel 节点分散在不同机器。
-
配置参数:
sentinel down-after-milliseconds mymaster 30000 # 网络延迟高时增大阈值 sentinel parallel-syncs mymaster 1 # 故障转移时同时同步的从节点数
2. 监控与日志
-
监控指标:
sentinel_known_slaves:从节点数量。sentinel_masters:监控的主节点数量。
-
日志分析:检查 Sentinel 日志中的
+switch-master事件。
3. 常见问题处理
- 脑裂问题: 现象:网络分区导致出现多个主节点。 解决:配置
min-replicas-to-write 1(主节点需至少1个从节点才能写入)。 - 故障转移失败: 原因:从节点数据太旧或无法连接。 解决:检查从节点复制状态,确保
master_repl_offset同步。
总结
| 场景 | 推荐方案 |
|---|---|
| 小型集群高可用 | 3 Sentinel + 1主2从 |
| 跨机房容灾 | 每个机房部署 Sentinel 和从节点 |
| 客户端自动故障转移 | 使用支持 Sentinel 的客户端库(如 Jedis) |
通过合理配置 Sentinel 集群、监控关键指标,并结合客户端自动重试机制,可构建高可用的 Redis 服务,保障业务连续性。