Redis 分片和集群怎么选:主从、哨兵、代理分片和 Redis Cluster

5次阅读
没有评论

Redis 单实例很好用,但当数据量、可用性和吞吐上来以后,问题会变成:是加从库,还是上哨兵,还是做分片,还是直接用 Redis Cluster。

这几个词经常混在一起说。实际上它们解决的问题不一样:主从和哨兵主要解决高可用和读扩展,分片主要解决容量和写扩展,Redis Cluster 则把分片、主从和故障转移放进官方集群方案里。

先区分两个问题

第一个问题是高可用:主节点挂了以后,服务能不能自动恢复。

第二个问题是分片:单个 Redis 实例放不下或扛不住时,数据能不能拆到多个主节点上。

只做主从复制,并不等于做了分片。一个主节点加多个从节点,数据通常仍然是完整复制,容量上限主要还是由主节点决定。

只做分片,也不等于自动高可用。如果每个分片只有一个主节点,某个主节点挂了,对应 key 范围仍然不可用。

所以 Redis 架构要先问清楚:当前主要痛点是可用性、读压力、写压力,还是内存容量。

主从复制:读扩展和高可用基础

主从复制的基本过程可以简化成:

  1. 从节点连接主节点,请求同步。
  2. 主节点生成快照,并记录同步期间发生的写命令。
  3. 从节点加载快照。
  4. 主节点继续把后续写命令同步给从节点。

主从复制的好处是结构简单,可以把部分读请求放到从节点上,也为后续故障切换提供基础。

但主从复制本身不等于自动故障转移。主节点挂了以后,如果没有额外机制,客户端仍然可能连着旧主节点地址,需要人工切换或依赖外部系统更新路由。

另外,主从复制有延迟。对一致性要求高的读请求,不要默认读从库。比如刚写完马上读、余额扣减、幂等状态判断这类场景,要明确读写路径和一致性边界。

哨兵:给主从加自动故障转移

Sentinel 哨兵主要解决主从模式下的自动故障发现和切换。

它会持续监控主节点、从节点和其他哨兵。当主节点长时间无响应,哨兵会先标记主观下线;多个哨兵达成一致后,再标记客观下线,并从从节点里选一个提升为新主节点。

哨兵模式适合:

  • 单主数据量还能放下。
  • 主要需求是高可用,而不是把数据拆到多个主节点。
  • 客户端或连接池能感知哨兵返回的新主地址。

它的边界也很清楚:哨兵不负责把一份大数据拆成多份。所有从节点复制的仍然是同一份主数据。如果单实例内存或写吞吐已经到上限,哨兵不是容量扩展方案。

客户端分片:路由放在业务里

客户端分片指业务代码自己根据 key 计算应该访问哪个 Redis 实例。常见做法是 hash、取模、一致性 hash 或自定义路由表。

它的优点是路径短,少一层代理,性能好,规则完全可控。

但缺点也明显:

  • 每个业务都要理解分片规则。
  • 扩容缩容要改路由或迁移数据。
  • 多语言、多服务共用时,规则一致性难维护。
  • 故障处理和监控需要自己补齐。

客户端分片更适合团队对 Redis 使用方式有统一封装,或者业务规模还没大到需要完整集群治理,但已经需要拆容量的场景。

代理分片:路由放在中间层

代理分片是在业务和 Redis 实例之间加一层代理。业务只连代理,代理根据路由规则把请求转发到对应实例。

典型思路是 Twemproxy、Codis 这类中间件。它的好处是业务侧简单,连接治理和迁移流程可以集中到代理层。

代价是多了一跳网络和中间层成本。代理本身也要高可用,否则 Redis 没挂,代理挂了,业务一样会受影响。

代理分片比较适合多业务共享 Redis 能力、希望业务少感知分片细节、并且团队愿意维护一层中间件的场景。

Redis Cluster:官方分片方案

Redis Cluster 是官方集群方案。它把 key 空间划分为 01638316384 个 hash slot。每个 key 会通过 CRC16 计算落在哪个 slot,再由 slot 映射到具体主节点。

每个主节点负责一部分 slot。为了高可用,每个主节点可以配置一个或多个从节点。主节点故障后,从节点可以被提升为新主节点。

它的优点是:

  • 官方方案,生态支持更完整。
  • 客户端可以直连节点,不一定需要中心代理。
  • 分片和高可用在同一套模型里。
  • 数据容量和写压力可以通过增加主分片扩展。

它的限制也要提前知道:

  • 客户端必须支持 Cluster 协议和重定向。
  • 跨 slot 的多 key 操作有限制。
  • 扩容缩容涉及 slot 迁移,不能只加机器不迁数据。
  • 键设计要注意 hash tag,否则相关 key 可能分散到不同 slot。

如果业务大量依赖 mget、Lua、多 key 事务或集合间运算,迁到 Cluster 前一定要先盘点这些命令是否跨 slot。

扩容时真正麻烦的是什么

Redis 扩容不是“多起几个实例”这么简单。真正麻烦的是旧数据已经按旧规则分布了,新规则上线后,客户端会把新请求打到新位置,旧数据却还在旧位置。

常见风险包括:

  • hash 规则变化导致同一个 key 落点变化。
  • 直接复制实例后出现重复数据或热点没有消失。
  • 长期不过期的 key 堆积,迁移成本越来越高。
  • 迁移期间读写双写、回源和一致性策略没有想清楚。

所以扩容前要先做数据画像:key 数量、内存占用、过期时间、热点 key、命令类型、最大 value、持久化和复制延迟。不要只看 Redis 总内存。

一个实用选型顺序

如果只是想提高读可用性,先考虑主从复制;如果还要自动故障转移,在主从基础上加哨兵。

如果单主容量和写压力已经吃紧,就要进入分片。团队能统一封装客户端、规则简单,可以考虑客户端分片;希望业务少感知,且能维护代理层,可以考虑代理分片。

如果新系统从一开始就需要多主分片、高可用和官方生态支持,Redis Cluster 是更主线的选择。但要提前约束 key 设计和多 key 命令使用方式。

可以粗略记成:

  • 主从:解决读扩展和复制基础。
  • 哨兵:解决主从自动切换。
  • 客户端分片:把容量拆分逻辑放到业务侧。
  • 代理分片:把容量拆分逻辑放到中间层。
  • Redis Cluster:官方 slot 分片加高可用方案。

小结

Redis 架构不要只按名词选型。先判断当前瓶颈是什么:

  • 可用性问题:主从加哨兵。
  • 读压力问题:读写分离,但要接受复制延迟。
  • 容量问题:分片。
  • 写压力问题:多主分片或 Cluster。
  • 运维治理问题:优先选团队能长期维护的方案。

Redis 很快,但它不是魔法缓存。分片规则、过期策略、热点 key、复制延迟和迁移流程,才是大多数线上问题真正发生的地方。

正文完
 0
bdspAdmin
版权声明:本站原创文章,由 bdspAdmin 于2026-06-22发表,共计2457字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)