跳到主要内容

Redis 哨兵 (Sentinel)

Redis Sentinel 是 Redis 的高可用解决方案,它提供自动监控、通知、故障转移和配置提供功能。

哨兵的核心功能

┌─────────────────────────────────────────────────────────────┐
│ Redis Sentinel 功能 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 监控 (Monitoring) │
│ ├── 持续检查主库和从库是否运行正常 │
│ └── 自动发现节点变更 │
│ │
│ 2. 通知 (Notification) │
│ ├── 故障发生时通过 API 通知管理员/系统 │
│ └── 订阅系统事件 │
│ │
│ 3. 自动故障转移 (Automatic Failover) │
│ ├── 主库故障时,从从库中选举新主库 │
│ └── 让其他从库指向新主库 │
│ │
│ 4. 配置中心 (Configuration Provider) │
│ ├── 客户端连接哨兵获取主库地址 │
│ └── 发生主从切换时,客户端会得到更新 │
│ │
└─────────────────────────────────────────────────────────────┘

故障判定机制

主观下线 (SDOWN)

单个哨兵节点在 down-after-milliseconds 时间内无法联系到主库,则判定为主观下线。

客观下线 (ODOWN)

当超过 quorum(法定人数)数量的哨兵都认为主库已下线,则判定为客观下线。只有判定为客观下线后,才会触发故障转移。

故障转移流程

  1. 选举领头哨兵 (Leader Election):哨兵集群通过 Raft 类似的算法选出一个 Leader 负责执行故障转移。
  2. 选出新主库 (Slave Selection)
    • 排除下线的从库。
    • 排除最近断开连接过久的从库。
    • 优先级:根据 replica-priority(越小越高)。
    • 偏移量:选择复制偏移量最大的(数据最全)。
    • Run ID:如果以上相同,选择 Run ID 最小的。
  3. 配置转移:让原有从库执行 REPLICAOF 新主库。
  4. 旧主归队:当旧主库上线后,哨兵会将其降级为新主库的从库。

配置与部署

哨兵配置文件 (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 高可用的成本最低且非常成熟的方案。