谈谈 Redis 集群模式?

一则或许对你有用的小广告

欢迎 加入小哈的星球 ,你将获得: 专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目: 《Spring AI 项目实战(问答机器人、RAG 增强检索、联网搜索)》 正在持续爆肝中,基于 Spring AI + Spring Boot3.x + JDK 21...点击查看;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot3.x + JDK 17...点击查看项目介绍; 演示链接: http://116.62.199.48:7070/;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/

面试考察点

  1. 基础掌握度:面试官不仅仅是想知道 Redis 有几种集群模式,更是想知道你是否能说清楚 主从复制、哨兵、Cluster 三者的演进关系、各自解决的核心问题(高可用?扩展性?),以及它们之间的区别。

  2. 原理理解深度:考察你是否了解主从复制的 全量 / 增量同步机制、哨兵的 故障转移流程、Cluster 的 16384 slot 分片与路由机制,而不是只会背概念。

  3. 方案选型能力:能否根据业务场景(数据量、QPS、是否需要强一致)选择合适的集群方案,并说出生产环境的最佳实践。

核心答案

Redis 有 3 种 集群模式,按演进顺序:

模式核心能力解决的问题适用场景
主从复制数据复制,读写分离数据冗余备份、读扩展读多写少,数据量小
哨兵(Sentinel)自动故障转移主从模式下主节点宕机的自动恢复中小规模,需要高可用
Cluster 集群分片 + 高可用数据量和 QPS 超过单节点上限大规模生产环境

一句话结论:主从复制解决 “数据备份和读扩展”,哨兵在主从基础上解决 “自动故障转移”,Cluster 在哨兵基础上解决 “水平扩展(写扩展 + 存储扩展)”。生产环境 大规模用 Cluster,中小规模用 Sentinel + 主从

深度解析

一、主从复制

上图展示了主从复制的架构:

  • 一个 Master + 多个 Slave:所有写操作在 Master 上执行,数据异步复制到 Slave。Slave 是只读的,可以分担读请求。
  • 读写分离:写走 Master,读走 Slave,实现了 读扩展。适合读多写少的场景。
  • 局限:写操作只能在 Master 上,无法通过加机器扩展写能力。Master 宕机后需要人工切换,没有自动故障转移。

主从复制的工作流程

上图展示了主从复制的两种同步方式:

  • 全量同步:Slave 首次连接 Master 或断开时间过长时触发。Master 执行 BGSAVE 生成 RDB 快照发给 Slave,Slave 清空旧数据后加载 RDB。数据量大时耗时长,会阻塞 Master。
  • 增量同步:Slave 短暂断开后重连时触发。Master 检查 Slave 的复制偏移量(offset)是否还在 repl_backlog(环形缓冲区)中,如果在就只发送增量数据,否则退化为全量同步。
  • 关键参数repl-backlog-size 控制环形缓冲区大小,默认 1MB。如果断开期间 Master 写入的数据超过缓冲区大小,就无法增量同步,必须全量。生产环境建议调大(如 256MB)。

二、哨兵模式(Sentinel)

主从复制最大的问题是 Master 宕机需要人工切换。哨兵模式就是为了解决这个问题。

上图展示了哨兵模式的架构:

  • Sentinel 是独立进程:不存储数据,只负责监控、故障转移和通知。通常部署 3 个以上(奇数个),保证高可用。
  • 持续监控:Sentinel 每秒向 Master 和 Slave 发送 PING,如果节点在指定时间内没有回复,就标记为主观下线。
  • 自动故障转移:Master 被判定客观下线后,Sentinel 自动从 Slave 中选举一个晋升为新 Master,并通知其他 Slave 和客户端。

故障转移流程(面试必问)

上图展示了 Sentinel 故障转移的完整流程:

  • 主观下线(SDOWN):单个 Sentinel 认为 Master 没有响应。可能只是网络抖动,不一定真的挂了。
  • 客观下线(ODOWN):超过 quorum 个 Sentinel 都认为 Master 没响应,确认为真的挂了。
  • 选举 Leader Sentinel:Sentinel 集群通过 Raft 算法选出一个 Leader 来执行故障转移。
  • 选举新 Master:从 Slave 中按优先级选择 —— replica-priority 最小的优先,相同时选复制偏移量最大的(数据最新),再相同选 run_id 最小的。
  • 切换:新 Master 执行 SLAVEOF NO ONE 断开复制,其他 Slave 指向新 Master,Sentinel 通知客户端新地址。

三、Cluster 模式

主从和哨兵的写操作都在单个 Master 上,无法水平扩展。当数据量或 QPS 超过单节点上限时,就需要 Cluster。

上图展示了 Redis Cluster 的分片架构:

  • 16384 个 Hash Slot:Cluster 将所有数据划分为 16384 个 slot,分配给不同的 Master 节点。每个 Master 负责一部分 slot。
  • 路由机制:客户端发送命令时,先对 key 做 CRC16(key) % 16384 计算 slot 编号,再路由到负责该 slot 的 Master 节点。
  • 每个 Master 配备 Slave:保证高可用。Master 宕机时,Slave 自动晋升为新 Master。

Cluster 的核心机制

上图展示了 Cluster 的五个核心机制:

  • Gossip 协议:节点之间定期交换状态信息(各自负责的 slot、节点存活状态等),去中心化,没有单点。
  • MOVED 重定向:客户端请求到了错误的节点,该节点返回 MOVED 指令告诉客户端正确的节点地址。客户端会缓存这个映射关系,下次直接路由。
  • ASK 重定向:slot 迁移期间的临时重定向。MOVED 表示 slot 已永久迁移,ASK 表示正在迁移中临时重定向。
  • 故障检测与转移:节点互相 PING 检测存活,超过半数 Master 认为某节点下线,就触发故障转移,该节点的 Slave 晋升为新 Master。
  • Hash Tag:用 {key} 语法强制多个 Key 路由到同一 slot。比如 {user}:name{user}:age 会落在同一个 slot 上,这样可以对它们做 MGET 或 Lua 脚本操作。

四、三种模式对比

上图对比了三种集群模式的核心差异:

  • 数据分片:只有 Cluster 支持数据分片(16384 slot),主从和哨兵的所有数据都在单个 Master 上。
  • 高可用:主从复制需要人工切换,哨兵和 Cluster 都支持自动故障转移。
  • 写扩展:主从和哨兵的写操作只能在单个 Master 上,Cluster 通过分片实现了写扩展。
  • 存储扩展:主从和哨兵的存储受单机内存限制,Cluster 通过分片可以水平扩展存储容量。
  • 复杂度:主从最简单,哨兵中等,Cluster 最复杂(需要考虑 slot 迁移、跨 slot 操作等)。

五、Cluster 的限制

上图列出了 Cluster 的主要限制:

  • 多 Key 操作限制MGETMSET 等批量操作要求所有 Key 在同一 slot 上。解决方案是使用 Hash Tag(如 {user}:name{user}:age)。
  • Lua 脚本限制:Lua 脚本操作的所有 Key 必须在同一 slot。
  • 事务限制MULTI/EXEC 事务中的 Key 也必须在同一 slot。
  • 最小节点数:官方推荐至少 6 个节点(3 主 3 从),保证 slot 分布和高可用。
  • 数据一致性:主从复制是异步的,Master 宕机时可能丢失少量尚未同步的数据。Cluster 追求的是高可用 + 最终一致性,不是强一致性。

面试高频追问

  1. 追问一:为什么 Cluster 用 16384 个 slot,而不是更多或更少?

    Redis 作者 antirez 在 GitHub 上回答过这个问题。主要原因:节点之间通过 Gossip 协议交换 slot 映射信息,16384 个 slot 只需 2KB 的 bitmap 就能表示。如果 slot 数太多(如 65536),每个节点发送的 heartbeat 包就会变大,浪费网络带宽。16384 对于大多数集群规模(1000 个节点以内)完全够用。

  2. 追问二:Cluster 中某个 Master 和它的 Slave 同时宕机怎么办?

    如果某个 slot 范围内的所有节点(Master + 所有 Slave)都宕机了,那这部分数据就完全不可用了。Cluster 有两种配置:cluster-require-full-coverage yes(默认,只要有 slot 不可用,整个集群停止服务)和 cluster-require-full-coverage no(只有不可用的 slot 的请求会报错,其他 slot 正常服务)。生产环境一般设为 no

  3. 追问三:客户端连接 Cluster 需要注意什么?

    客户端需要支持 Cluster 协议(如 JedisCluster、Lettuce)。连接时不需要知道所有节点地址,只需要一个或几个节点地址,客户端会自动发现集群拓扑。请求到错误节点时会收到 MOVED 重定向,客户端需要自动重试。智能客户端会缓存 slot → node 映射关系,后续请求直接路由。

常见面试变体

  • 变体一:"Redis 主从复制原理是什么?"
  • 变体二:"Redis 哨兵的故障转移流程是怎样的?"
  • 变体三:"Redis Cluster 的路由机制是怎样的?"
  • 变体四:"Redis Cluster 和 Sentinel 怎么选?"

记忆口诀

三种模式演进:主从(备份 + 读扩展)→ 哨兵(+ 自动故障转移)→ Cluster(+ 数据分片 + 写扩展)。

Cluster 核心:16384 slot 分片,CRC16 路由,Gossip 通信,自动故障转移。

Cluster 限制:多 Key 操作需同 slot,Lua/事务也受限制,异步复制非强一致。

选型:小规模哨兵,大规模 Cluster,数据备份用主从。

总结

Redis 有三种集群模式:主从复制 实现数据冗余和读写分离;哨兵模式 在主从基础上增加自动故障转移;Cluster 模式 通过 16384 slot 分片实现水平扩展。生产环境大规模场景用 Cluster(分片 + 高可用),中小规模用 Sentinel + 主从(高可用)。Cluster 的核心限制是跨 slot 操作需使用 Hash Tag,且异步复制不保证强一致性。