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

总结

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

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

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

相关推荐
c++之路11 分钟前
C++20概述
java·开发语言·c++20
Championship.23.2415 分钟前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试
芝士就是力量啊 ೄ೨25 分钟前
Python如何编写一个简单的类
开发语言·python
橘子海全栈攻城狮30 分钟前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
逻辑驱动的ken36 分钟前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
MoonBit月兔37 分钟前
「Why MoonBit 」第一期——Singularity Note AI 学习助手
开发语言·人工智能·moonbit
木木_王1 小时前
嵌入式Linux学习 | 数据结构 (Day05) 栈与队列详解(原理 + C 语言实现 + 实战实验 + 易错点剖析)
linux·c语言·开发语言·数据结构·笔记·学习
冷雨夜中漫步1 小时前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai
超龄编码人1 小时前
Qt Widgets Designer QTabWidget无法添加布局
开发语言·qt
直奔標竿1 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring