NiceOffer

八股文解析

Redis 哨兵和 Cluster 集群有什么区别?

Redis集群八股文

一句话结论

Redis 哨兵(Sentinel)解决 高可用(HA),Cluster 解决 高并发 + 大数据量(水平扩展),二者定位完全不同。

面试标准答法

1. 核心定位差异

维度SentinelCluster
英文全称Redis SentinelRedis Cluster
解决的问题主从切换(Failover)数据分片(Sharding)+ 高可用
数据存储单主多从,全量数据在每台机器上数据按 slot 分散在多个 master 上
容量上限受单机内存限制可水平扩容至 PB 级
客户端连接连接任意节点,通过 SENTINEL get-master-addr-by-name 获取当前 master连接任意节点,自动重定向至对应 slot 所在节点

2. Sentinel 工作原理

核心组件:Sentinel 本身是一个独立进程,通常部署 3 个(奇数)形成哨兵集群。

三大定时任务

  • 每 10s 向 master/slave 发送 INFO 命令,更新拓扑结构
  • 每 2s 向 __sentinel__:hello 频道发布自己的信息,用于发现其他 Sentinel
  • 每 1s 向所有实例发送 PING,用于主观下线(Subjective Down)判定

故障转移流程

  1. 某 Sentinel 发现 master 超过 down-after-milliseconds 未响应 PING → 标记 主观下线(sdown)
  2. 该 Sentinel 向其他 Sentinel 发送 SENTINEL is-master-down-by-addr,超过 quorum(通常为 2)确认 → 标记 客观下线(odown)
  3. 选举 Leader Sentinel(Raft 算法),由 Leader 执行 failover
  4. 从 slave 中选一个晋升为新 master(优先级 → 复制偏移量 → runid 字典序)
  5. 其他 slave 执行 REPLICAOF 指向新 master
  6. 通知客户端新 master 地址

关键参数

  • quorum:确认客观下线所需 Sentinel 数
  • down-after-milliseconds:判定节点失效的超时时间
  • failover-timeout:故障转移超时

3. Cluster 工作原理

数据分片:使用 一致性哈希槽(CRC16) 算法,CRC16(key) % 16384 将 key 映射到 0-16383 共 16384 个哈希槽(Hash Slot)。每个 master 负责一段 slot 区间。

节点间通信:使用 Gossip 协议,节点间通过 CLUSTER MEET 建立连接,维护集群状态。每个节点每秒发送 PING,通过 PONG 交换状态信息。

请求路由:客户端连接任意节点,如果 key 不在当前节点,返回 MOVED 错误(包含正确节点地址),客户端需重新请求。支持 Cluster 模式客户端(如 JedisCluster)自动处理重定向。

高可用:每个 master 可配置 0-N 个 slave。当 master 失效,其 slave 通过选举晋升为新 master(类似 Sentinel 的 failover 逻辑,但内置在节点中,无需额外组件)。

关键机制

  • cluster-enabled yes:开启集群模式
  • cluster-node-timeout:节点超时判定
  • 重分片(Resharding):在线迁移 slot,通过 CLUSTER SETSLOTMIGRATE 命令完成
  • 集群脑裂:通过 cluster-require-full-coverage 参数控制(默认 yes,部分 slot 不可用时集群整体不可写)

对比表格

对比项SentinelCluster
部署复杂度低(3 个 Sentinel 进程 + 主从)高(至少 6 个节点,3 master + 3 slave)
数据容量单机内存上限水平扩展,无理论上限
写入性能单 master 写入多 master 并行写入
多 key 操作支持(同一实例内)有限制(需相同 hash tag {user1}:age
事务支持完整仅限同一 slot 内
客户端支持所有语言需支持 Cluster 协议(部分老客户端不支持)
运维成本高(需监控 slot 分布、重分片等)
适合场景中小型应用,单机内存够用大数据量、高并发写入

常见追问

追问要点
Sentinel 的 quorum 设多少合适?奇数且 ≥ 2,通常 3 个 Sentinel 设 quorum=2。quorum 过小会导致误判,过大导致 failover 无法触发
Cluster 为什么是 16384 个 slot 而不是更多?① 心跳包中 bitmap 压缩效率高(2KB);② 节点数上限约 1000 个,slot 数足够分配;③ 重分片时迁移粒度适中
Cluster 模式下如何实现分布式锁?Redlock 算法在多 master 场景下仍可用,但需注意:锁的 key 需在同一 slot(用 hash tag)保证原子性;或者使用 ZooKeeper/etcd 替代
Sentinel 和 Cluster 能一起用吗?可以,但不推荐。Cluster 内置了 failover 能力,再套 Sentinel 会引入额外复杂度和脑裂风险。官方推荐二选一
脑裂是什么?如何避免?网络分区导致旧 master 仍在服务,新 master 已选出。Sentinel 通过 min-replicas-to-write 参数限制旧 master 写入;Cluster 通过 cluster-node-timeout + 多数派选举避免

面试回答模板(30 秒版)

延伸准备

  1. Redis Cluster 的 Gossip 消息类型:深入讲 MEET/PING/PONG/FAIL 四种消息的格式和触发时机,能体现对协议层的理解。
  1. slot 迁移的原子性保证MIGRATE 命令的底层实现(DUMP + RESTORE + DEL),以及迁移过程中 ASK 重定向与 MOVED 的区别,这是区分"看过文档"和"真正理解"的分水岭。
  1. Cluster 模式下 Lua 脚本的限制:脚本中访问的所有 key 必须属于同一 slot,否则报 CROSSSLOT 错误。追问时可以提到用 hash tag 规避,以及 Redis 7.0 后引入的 FUNCTION 如何缓解这个问题。
  1. 对比 ZooKeeper 实现分布式锁:Redis 的 Redlock 在 Cluster 模式下是否有意义,以及 CAP 理论下 Redis 的 AP 特性对锁正确性的影响——这是高段位面试官常引出的延伸话题。

想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。