Redis 哨兵 (Sentinel)
Redis Sentinel 是 Redis 的高可用解决方案,它提供自动监控、通知、故障转移和配置提供功能。
哨兵的核心功能
┌─────────────────────────────────────────────────────────────┐
│ Redis Sentinel 功能 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 监控 (Monitoring) │
│ ├── 持续检查主库和从库是否运行正常 │
│ └── 自动发现节点变更 │
│ │
│ 2. 通知 (Notification) │
│ ├── 故障发生时通过 API 通知管理员/系统 │
│ └── 订阅系统事件 │
│ │
│ 3. 自动故障转移 (Automatic Failover) │
│ ├── 主库故障时,从从库中选举新主库 │
│ └── 让其他从库指向新主库 │
│ │
│ 4. 配置中心 (Configuration Provider) │
│ ├── 客户端连接哨兵获取主库地址 │
│ └── 发生主从切换时,客户端会得到更新 │
│ │
└─────────────────────────────────────────────────────────────┘
故障判定机制
主观下线 (SDOWN)
单个哨兵节点在 down-after-milliseconds 时间内无法联系到主库,则判定为主观下线。
客观下线 (ODOWN)
当超过 quorum(法定人数)数量的哨兵都认为主库已下线,则判定为客观下线。只有判定为客观下线后,才会触发故障转移。
故障转移流程
- 选举领头哨兵 (Leader Election):哨兵集群通过 Raft 类似的算法选出一个 Leader 负责执行故障转移。
- 选出新主库 (Slave Selection):
- 排除下线的从库。
- 排除最近断开连接过久的从库。
- 优先级:根据
replica-priority(越小越高)。 - 偏移量:选择复制偏移量最大的(数据最全)。
- Run ID:如果以上相同,选择 Run ID 最小的。
- 配置转移:让原有从库执行
REPLICAOF新主库。 - 旧主归队:当旧主库上线后,哨兵会将其降级为新主库的从库。
配置与部署
哨兵配置文件 (sentinel.conf)
# 端口
port 26379
# 监控主库
# sentinel monitor <master-name> <ip> <port> <quorum>
sentinel monitor mymaster 192.168.1.100 6379 2
# 主库密码
sentinel auth-pass mymaster your_password
# 下线判定时间
sentinel down-after-milliseconds mymaster 30000
# 故障转移超时
sentinel failover-timeout mymaster 180000
# 并行同步数
sentinel parallel-syncs mymaster 1
部署建议
- 奇数节点:部署至少 3 个哨兵节点,以保证
quorum判断的准确性。 - 物理独立:尽可能将哨兵部署在不同的服务器/机架上,避免单点故障。
客户端集成 (Java/SpringBoot)
在 Spring Boot 中,使用 Sentinel 模式非常简单:
spring:
redis:
sentinel:
master: mymaster
nodes: 192.168.1.101:26379,192.168.1.102:26379,192.168.1.103:26379
password: your_password
小结
- 哨兵解决了主从复制无法自动故障恢复的问题。
- 采用集群决策机制(Quorum)避免误判。
- 是实现 Redis 高可用的成本最低且非常成熟的方案。