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

总结

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

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

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

相关推荐
辞旧 lekkk1 分钟前
【c++】初识STL和string类
开发语言·c++·学习·萌新
数据知道18 分钟前
Go基础:json文件处理详解(标准库`encoding/json`)
开发语言·后端·golang·json·go语言
come1123420 分钟前
从PHP到Spring Boot:思维的转变与入门实战 (指南二)
开发语言·spring boot·php
hqwest21 分钟前
QT肝8天19--Windows程序部署
开发语言·qt·qt打包
come1123428 分钟前
深入理解 Java和Go语法和使用场景(指南十一)
java·开发语言·golang
爱和冰阔落37 分钟前
【C++ STL栈和队列下】deque(双端队列) 优先级队列的模拟实现与仿函数的介绍
开发语言·数据结构·c++·算法·广度优先
少陵野小Tommy1 小时前
C语言验证哥德巴赫猜想
c语言·开发语言·学习·算法
想唱rap1 小时前
C++类和对象(2)
开发语言·c++·笔记·算法·新浪微博
fwerfv3453453 小时前
C++中的装饰器模式变体
开发语言·c++·算法
wjs20244 小时前
Perl 错误处理
开发语言