你们线上的Redis采用的是哨兵(Sentinel)模式还是Cluster集群模式?当初为什么这么选型?
作为一个代表互联网大厂架构经验的AI,在实际的线上生产环境中,我们并不是非此即彼,而是两者并存,根据不同的业务场景进行隔离和选型。
不过,从整体架构演进的趋势来看,核心主流程业务通常采用 Redis Cluster 集群模式,而中小规模或对复杂命令有强依赖的业务会使用 Sentinel 哨兵模式。
以下我从“架构师”的视角,为你详细复盘当初做技术选型时的思考逻辑和核心考量点:
一、 什么时候选 Redis Cluster(集群模式)?
场景标签:高并发写、海量数据、核心链路(如:电商购物车、千万级用户Session、Feed流缓存)。
为什么这么选(核心痛点解决):
- 突破单机内存瓶颈(数据量大)
- 考量:单台物理机的内存是有限的,且 Redis 在执行
bgsave(RDB持久化或主从全量同步)时需要fork子进程。如果单机内存太大(超过 20GB~30GB),fork操作会导致主线程阻塞,甚至引发短暂的停顿。 - 解决:Cluster 采用了分片(Sharding)机制(16384个哈希槽),将数据分散在多个 Master 节点上。我们需要存 100GB 的数据,只需横向扩展增加节点即可。
- 考量:单台物理机的内存是有限的,且 Redis 在执行
- 突破单机写瓶颈(并发极高)
- 考量:哨兵模式下,无论有多少个从节点,能处理写操作的永远只有 1 个 Master。当线上写请求 QPS 突破 8-10万时,单 Master 会直接打满 CPU。
- 解决:Cluster 是多 Master 架构,写操作被分摊到了各个主节点,轻松实现数十万乃至百万级 QPS。
- 高可用与去中心化
- 考量:自带故障转移(Failover)能力,无需额外部署哨兵集群,节点之间通过 Gossip 协议通信,运维管理在规模化后其实更统一。
二、 什么时候选 Redis Sentinel(哨兵模式)?
场景标签:读多写少、数据量可控(<20GB)、强依赖复杂操作(如配置中心、后台管理系统缓存、简单的全局锁/队列)。
为什么这么选(Cluster的妥协与Sentinel的优势):
- 百分百的命令兼容性(尤其是复杂操作)
- 考量:Cluster 模式下,数据被打散在不同节点。如果业务大量使用多键操作(如
MGET、MSET、SUNION)或者 Lua 脚本、事务,且这些 Key 并没有通过 Hash Tag{}路由到同一个槽位,Cluster 会直接报错。 - 解决:Sentinel 模式只有一个主节点,数据都在一起,完全没有跨槽位操作的限制,对开发极其友好,遗留的老系统迁移成本为零。
- 考量:Cluster 模式下,数据被打散在不同节点。如果业务大量使用多键操作(如
- 服务器成本与资源利用率
- 考量:搭建一个高可用的 Cluster,最少需要 3主3从(6台机器/实例)。而搭建一个 Sentinel 架构,只需要 1主2从 + 3个轻量级哨兵节点(甚至哨兵可以与其他服务混部)。对于边缘业务,用 Cluster 是杀鸡用牛刀,浪费资源。
- 客户端实现的复杂度
- 考量:Cluster 模式要求客户端(如 Jedis, Lettuce)必须支持 Smart Client 特性,自己维护槽位缓存,处理
MOVED和ASK重定向。在某些小众语言或老旧框架中,Cluster 的客户端支持并不完善;而 Sentinel 模式的客户端支持非常成熟。
- 考量:Cluster 模式要求客户端(如 Jedis, Lettuce)必须支持 Smart Client 特性,自己维护槽位缓存,处理
三、 总结:当初选型的核心决策树
在内部做技术评审时,我们通常会抛出以下三个问题。如果其中有一个回答是“Yes”,那么系统就会偏向甚至强制要求选择 Redis Cluster:
- 预估你的系统缓存数据量未来一年会不会超过 20GB? (Yes -> Cluster)
- 预估你的系统高峰期写 QPS 会不会超过 5 万? (Yes -> Cluster)
- 你的系统是否对单点故障(甚至秒级不可用)极其敏感,需要极强的水平扩容能力? (Yes -> Cluster)
反之,如果是以下情况,我们会要求业务方老老实实用 Sentinel:
- 业务重度依赖复杂的 Lua 脚本去保证原子性操作。
- 业务需要对大量不同前缀的 Key 做集合求交集/并集操作。
- 总体数据量只有几百 MB 到几个 GB,纯纯的读多写少。
💡 补充行业演进(加分项):
除了原生的 Sentinel 和 Cluster,现在很多大厂(包括云厂商)大量使用的是 “基于 Proxy 的集群架构”(如开源的 Codis 的进化版,或阿里云的 Tair、腾讯云的 CRS)。
这种选型结合了双方的优点:底层是数据分片(类似 Cluster),但在最上层架设了 Proxy(代理层)。对客户端来说,连 Proxy 就像连单机/Sentinel一样简单,不用管哈希槽计算和重定向,从而兼顾了 Cluster 的横向扩展能力 和 单机的协议兼容性。这是目前很多顶级互联网公司的终极选型。
右滑查看面试常问