(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 协议

总结

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

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

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

相关推荐
江江爱编程3 分钟前
java零基础保姆级教学01
java·开发语言
9624564 分钟前
餐饮 SaaS 优惠券系统架构演进(三):优惠计算引擎——商品级计价、冲突策略与优惠分摊
java·数据库·spring boot
vx_Biye_Design7 分钟前
expressDeepSeek社团咨询助手的学生社团管理系统60746-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·课程设计·express
vx_Biye_Design21 分钟前
springboot宠物领养与救助平台64334-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·课程设计·宠物
泡茶喝茶写代码24 分钟前
A股量化数据工程:从 REST 接口到策略信号(第 5 篇):板块成分股映射与对齐
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据接口
沐晓时光24 分钟前
C语言入门,深入理解指针(2)
c语言·开发语言
vx_Biye_Design25 分钟前
django就业信息推荐系统61953-计算机课程设计、毕业设计
java·vue.js·spring boot·python·架构·django·课程设计
2601_9628857238 分钟前
如何用 Python 做均线粘合选股?(多头发散前的变盘候选)
开发语言·python
知守观41 分钟前
HTML 转 PDF 方案实战:iTextPDF 与 wkhtmltopdf 踩坑复盘,附 Flying Saucer / openhtmltopdf 选型对比
java·后端
2601_9620715743 分钟前
类变量和全局变量的隔离性有什么区别?
java·开发语言·jvm