欢迎光临
我们一直在努力

Redis哨兵集群结构和作用

一、前言:为什么需要哨兵集群?

在 Redis 主从架构中,主节点一旦宕机,整个系统将无法写入。
如果依赖人工干预(如手动执行 SLAVEOF NO ONE),恢复时间可能长达数分钟,严重影响业务可用性。

Redis Sentinel(哨兵) 就是为解决这一问题而设计的——它是一个轻量级、分布式、自动化的高可用解决方案。

而单个哨兵存在单点故障风险,因此生产环境必须部署 哨兵集群。

本文将带你:
✅ 看懂哨兵集群的整体结构
✅ 理解它的三大核心作用
✅ 掌握最小部署建议与工作流程


二、哨兵集群整体结构图

一个典型的 Redis 哨兵集群包含两部分:

1. Redis 数据节点(主从架构)

  • 1 个主节点(Master):负责读写
  • N 个从节点(Slave):只读,用于数据冗余和读扩展

2. Sentinel 哨兵节点(监控集群)

  • 至少 3 个 Sentinel 实例:相互协作,共同决策

✅ 关键特点:

  • Sentinel 不存储业务数据,只存储集群元信息
  • Sentinel 默认端口:26379
  • 所有 Sentinel 节点对等(peer-to-peer),无中心节点

三、哨兵集群的三大核心作用

作用 1️⃣:持续监控(Monitoring)

  • 每个 Sentinel 定期向 主节点、从节点 发送 PING 命令
  • 若节点在 down-after-milliseconds 时间内无响应,则标记为 主观下线(SDOWN)

# sentinel.conf 示例
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel down-after-milliseconds mymaster 30000 # 30秒无响应即 SDOWN


作用 2️⃣:自动故障转移(Automatic Failover)

当主节点被判定为 客观下线(ODOWN) 后,哨兵集群会:

  • 选举 Leader:通过投票选出一个 Sentinel 负责执行故障转移
  • 选择新主:从健康的从节点中选出最优者(优先级 + 数据新鲜度)
  • 升主 & 重配:
    • 向新主发送 SLAVEOF NO ONE
    • 向其他从节点发送 SLAVEOF <new_master>
  • 通知客户端:更新主节点地址
  • ⏱️ 整个过程通常在 10~30 秒内完成,无需人工介入!


    作用 3️⃣:配置提供者(Configuration Provider)

    • 客户端不直接连接 Redis 主节点,而是先连接 Sentinel
    • 通过命令获取当前主节点地址:

      SENTINEL get-master-addr-by-name mymaster

    • 或订阅事件(如 +switch-master)实现动态感知主节点变更

    ✅ 这使得应用在主从切换后无需重启,自动路由到新主!


    四、哨兵集群如何达成共识?(ODOWN 判定)

    单个 Sentinel 认为主节点宕机 ≠ 真的宕机(可能是网络抖动)。
    哨兵集群通过 quorum 机制 避免误判:

    sentinel monitor mymaster 192.168.1.100 6379 2
    # ↑
    # quorum = 2

    • 主观下线(SDOWN):任一 Sentinel 认为节点不可达
    • 客观下线(ODOWN):至少 quorum 个 Sentinel 同意 SDOWN

    🔑 注意:

    • quorum 不是多数派,而是 ODOWN 的门槛值
    • 但 Leader 选举仍需多数派(> N/2) 才能成功
    Sentinel 节点数推荐 quorum最小容忍故障数
    3 2 1
    5 3 2

    ✅ 生产建议:部署 3 个 Sentinel 节点,quorum=2


    五、客户端如何使用哨兵集群?

    Java(Jedis 示例)

    Set<String> sentinels = Set.of(
    "192.168.1.11:26379",
    "192.168.1.12:26379",
    "192.168.1.13:26379"
    );

    // 创建哨兵连接池
    JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);

    try (Jedis jedis = pool.getResource()) {
    jedis.set("hello", "world"); // 自动写入当前主节点
    System.out.println(jedis.get("hello"));
    }

    Spring Boot 配置

    spring:
    redis:
    sentinel:
    master: mymaster
    nodes:
    – 192.168.1.11:26379
    – 192.168.1.12:26379
    – 192.168.1.13:26379

    ✅ 客户端会自动发现主节点变化,实现无缝切换!


    六、部署最佳实践

    ✅ 必须遵守

  • 至少 3 个 Sentinel 节点(部署在不同物理机/可用区)
  • 不要与 Redis 实例混部(避免资源竞争)
  • 所有 Sentinel 配置相同(sentinel monitor 一致)
  • ✅ 推荐配置

    # sentinel.conf
    port 26379
    daemonize yes
    logfile "/var/log/redis/sentinel.log"

    sentinel monitor mymaster 192.168.1.100 6379 2
    sentinel down-after-milliseconds mymaster 30000
    sentinel failover-timeout mymaster 180000
    sentinel parallel-syncs mymaster 1

    ❌ 常见错误

    • 只部署 1 个 Sentinel → 失去高可用意义
    • quorum 设置过大(如 3 节点设 quorum=3)→ 无法达成 ODOWN
    • 忘记开放 26379 端口 → Sentinel 无法通信

    七、结语

    感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

    赞(0)
    未经允许不得转载:171主机测评 » Redis哨兵集群结构和作用
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址