八股文解析
Redis 哨兵和 Cluster 集群有什么区别?
一句话结论
Redis 哨兵(Sentinel)解决 高可用(HA),Cluster 解决 高并发 + 大数据量(水平扩展),二者定位完全不同。
面试标准答法
1. 核心定位差异
| 维度 | Sentinel | Cluster |
|---|---|---|
| 英文全称 | Redis Sentinel | Redis 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)判定
故障转移流程:
- 某 Sentinel 发现 master 超过
down-after-milliseconds未响应 PING → 标记 主观下线(sdown) - 该 Sentinel 向其他 Sentinel 发送
SENTINEL is-master-down-by-addr,超过quorum(通常为 2)确认 → 标记 客观下线(odown) - 选举 Leader Sentinel(Raft 算法),由 Leader 执行 failover
- 从 slave 中选一个晋升为新 master(优先级 → 复制偏移量 → runid 字典序)
- 其他 slave 执行
REPLICAOF指向新 master - 通知客户端新 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 SETSLOT和MIGRATE命令完成 - 集群脑裂:通过
cluster-require-full-coverage参数控制(默认 yes,部分 slot 不可用时集群整体不可写)
对比表格
| 对比项 | Sentinel | Cluster |
|---|---|---|
| 部署复杂度 | 低(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 秒版)
延伸准备
- Redis Cluster 的 Gossip 消息类型:深入讲 MEET/PING/PONG/FAIL 四种消息的格式和触发时机,能体现对协议层的理解。
- slot 迁移的原子性保证:
MIGRATE命令的底层实现(DUMP + RESTORE + DEL),以及迁移过程中ASK重定向与MOVED的区别,这是区分"看过文档"和"真正理解"的分水岭。
- Cluster 模式下 Lua 脚本的限制:脚本中访问的所有 key 必须属于同一 slot,否则报
CROSSSLOT错误。追问时可以提到用 hash tag 规避,以及 Redis 7.0 后引入的FUNCTION如何缓解这个问题。
- 对比 ZooKeeper 实现分布式锁:Redis 的 Redlock 在 Cluster 模式下是否有意义,以及 CAP 理论下 Redis 的 AP 特性对锁正确性的影响——这是高段位面试官常引出的延伸话题。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。