(Redis)主从哨兵模式与集群模式

Redis 是一款高性能的内存数据库,广泛应用于缓存、消息队列和计数场景。为了保证 Redis 在高并发和大数据量下的可用性,官方提供了两套主要机制:主从 + 哨兵机制集群模式。本文将详细讲解它们的原理、特点及区别。


一、Redis 主从节点 + 哨兵机制(Sentinel)

1️⃣ 主从节点概念

  • Master(主节点)

    • 提供写操作,也可提供读操作。

    • 负责向从节点同步数据。

  • Slave(从节点)

    • 复制主节点的数据。

    • 一般用于读操作或备份,提高可用性和性能。


2️⃣ 哨兵机制概念

Redis Sentinel 是 Redis 官方提供的高可用解决方案,主要功能:

  1. 监控(Monitoring)

    • 哨兵周期性检查主从节点是否正常。
  2. 通知(Notification)

    • 当节点故障时,通知管理员或客户端。
  3. 自动故障转移(Automatic failover)

    • 主节点宕机时,自动将从节点升级为主节点,并让其他从节点指向新主节点。
  4. 配置提供者(Configuration provider)

    • 客户端可通过哨兵获取当前主节点信息,避免连接失效。

3️⃣ 哨兵工作流程

  1. 监控

    • 哨兵定期向主从节点发送 PING 命令。

    • 超时未响应 → 标记为 SDOWN(主观下线)

    • 多数哨兵认为不可用 → ODOWN(客观下线)

  2. 选举

    • 主节点 ODOWN 后,多哨兵投票选出 Leader。

    • Leader 负责选择从节点升级为新主节点。

    • 其他从节点指向新主节点。

  3. 通知

    • 节点状态变化或故障转移完成 → 哨兵通过事件或 API 通知客户端。

    • 客户端通过 SENTINEL get-master-addr-by-name <name> 获取新主节点地址。


4️⃣ 注意事项

  • 哨兵节点至少 3 个以上,避免单点故障。

  • 客户端必须支持哨兵模式。

  • 只适用于单主多从架构,不支持数据分片。


二、Redis 集群模式(Cluster)

1️⃣ 集群概念

Redis Cluster 用于水平扩展 + 高可用,特点:

  • 多个 master 节点,每个负责一部分数据。

  • 每个 master 可有从节点备份。

  • 自动故障转移,不依赖哨兵。

  • 数据分片:16384 个 hash slot 分布到各个 master 节点。


2️⃣ 数据分片机制

  1. 计算 slot

    复制代码
    slot = CRC16(key) % 16384
  2. 分配 slot

    • 每个 master 节点负责一部分 slot。

    • 例如:

      复制代码
      master1: slot 0-5460 master2: slot 5461-10922 master3: slot 10923-16383
  3. 客户端访问

    • 根据 key 的 slot 找到对应 master 节点。

    • 如果访问错误节点 → 返回 MOVED 错误 → 客户端重定向。


3️⃣ 集群高可用

  • Master 宕机 → 从节点通过投票升级为新 master。

  • 集群继续提供服务,保证高可用。

  • 多 master + 多从节点 → 支持读写分离和水平扩展。


4️⃣ 注意事项

  • 客户端必须支持 Cluster 协议(如 Jedis Cluster、Lettuce)。

  • 跨槽操作有限,涉及多个 key 的命令必须在同一 hash slot。

  • 数据迁移需要注意性能影响。


三、哨兵 vs 集群对比

特性 哨兵模式 集群模式
数据分片 ❌ 不分片 ✅ 分片(hash slot)
主节点数量 1 多个
从节点
自动故障转移
水平扩展
客户端要求 普通客户端 支持 Cluster 协议

总结

  • 哨兵 + 主从:适合单主多从场景,保证主节点故障时快速切换。

  • 集群模式:适合数据量大、高并发场景,支持水平扩展和自动容错。

  • 两者是独立方案,一般不会同时使用。

相关推荐
焗猪扒饭4 分钟前
redis stream用作消息队列极速入门
redis·后端·go
NE_STOP2 小时前
MyBatis-配置文件解读及MyBatis为何不用编写Mapper接口的实现类
java
后端AI实验室6 小时前
用AI写代码,我差点把漏洞发上线:血泪总结的10个教训
java·ai
程序员清风8 小时前
小红书二面:Spring Boot的单例模式是如何实现的?
java·后端·面试
belhomme8 小时前
(面试题)Redis实现 IP 维度滑动窗口限流实践
java·面试
Be_Better9 小时前
学会与虚拟机对话---ASM
java
开源之眼11 小时前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
Maori31612 小时前
放弃 SDKMAN!在 Garuda Linux + Fish 环境下的优雅 Java 管理指南
java
用户9083246027312 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
小王和八蛋12 小时前
DecimalFormat 与 BigDecimal
java·后端