4. Redis 集群与高可用:主从复制、哨兵模式、Redis Cluster 分片集群、数据分片策略

在生产环境中,单机 Redis 面临单点故障、容量瓶颈和性能上限三大问题。本章围绕“高可用”与“水平扩展”两条主线,系统讲解 Redis 从主从复制到哨兵模式,再到 Redis Cluster 分片集群的演进路径,并深入剖析数据分片策略的核心原理。

4.1 主从复制:高可用的基石

主从复制(Replication)是 Redis 高可用的基础。一个主节点(Master)可以挂载多个从节点(Slave),从节点实时同步主节点的数据,实现读写分离与数据冗余。

4.1.1 复制流程

  1. 连接建立:从节点向主节点发送 PSYNC 命令,请求同步。
  2. 全量复制:主节点执行 BGSAVE 生成 RDB 快照,发送给从节点;同时将新写入的命令缓存到复制缓冲区。
  3. 增量复制:从节点加载完 RDB 后,主节点将缓冲区中的增量命令发送给从节点,保持数据一致。
  4. 命令传播:后续主节点每执行一条写命令,都会异步推送给所有从节点。
关键参数:repl-backlog-size 默认 1MB,决定增量复制的容错窗口。网络中断时间超过 backlog 容量时,将触发全量复制。

4.1.2 主从架构的局限性

问题 说明
主节点单点故障 主节点宕机后,需要人工切换从节点,期间服务不可用。
写能力瓶颈 所有写操作集中在主节点,无法水平扩展写性能。
存储容量受限 所有节点存储全量数据,单机内存上限即集群上限。

4.2 哨兵模式:自动故障转移

哨兵(Sentinel)模式在主从复制基础上增加了自动故障检测与转移能力。哨兵节点监控主从节点的健康状态,当主节点不可用时,自动选举一个从节点升级为新的主节点。

4.2.1 哨兵核心机制

  • 心跳检测:哨兵每秒向所有节点发送 PING,判断节点是否存活。
  • 主观下线:单个哨兵发现节点无响应,标记为主观下线(SDOWN)。
  • 客观下线:多个哨兵(通常配置 quorum=2)都认为主节点下线,标记为客观下线(ODOWN)。
  • 领导者选举:哨兵集群通过 Raft 算法选举一个领导者,负责执行故障转移。
  • 故障转移:领导者从从节点中选出优先级最高、数据最完整的节点,执行 SLAVEOF NO ONE 提升为主节点,并通知其他从节点切换复制目标。
生产建议:至少部署 3 个哨兵节点,quorum 设置为 2,避免哨兵自身单点故障导致误判。

4.2.2 哨兵模式架构图

哨兵模式架构 Master Slave 1 Slave 2 Slave 3 Sentinel 1 Sentinel 2 Sentinel 3 哨兵通过 Gossip 协议交换主节点状态,当 quorum 个哨兵判定主节点下线时,触发自动故障转移

4.3 Redis Cluster 分片集群

Redis Cluster 是 Redis 官方提供的分布式解决方案,通过数据分片实现水平扩展,同时内置高可用机制,无需额外部署哨兵。

4.3.1 核心特性

  • 无中心架构:所有节点通过 Gossip 协议通信,没有中心代理节点。
  • 自动分片:将数据划分为 16384 个哈希槽(Hash Slot),每个节点负责一部分槽位。
  • 高可用:每个主节点可以挂载从节点,主节点故障时自动提升从节点。
  • 线性扩展:增加节点时,槽位自动迁移,无需停机。

4.3.2 数据分片策略

Redis Cluster 采用哈希槽(Hash Slot)分片策略,核心流程如下:

  1. 客户端计算 key 的 CRC16 校验值。
  2. 对 16384 取模,得到哈希槽编号:slot = CRC16(key) % 16384。
  3. 根据槽位与节点的映射关系,将请求路由到对应节点。
为什么是 16384? 16384 是 2^14,Gossip 消息中携带槽位信息时,使用 2KB 的位图即可表示所有槽位,兼顾了精度与网络开销。

4.3.3 分片策略对比

策略 代表实现 优点 缺点
哈希槽 Redis Cluster 数据分布均匀,支持动态扩缩容 批量操作跨节点时性能下降
一致性哈希 Twemproxy、Codis 节点增减影响范围小 存在数据倾斜风险,需要虚拟节点优化
范围分片 自定义实现 范围查询友好 热点数据集中,扩缩容复杂

4.3.4 Redis Cluster 架构图

Redis Cluster 分片集群架构 Client Node A (Master) Slots: 0-5460 Slave A1 Node B (Master) Slots: 5461-10922 Slave B1 Node C (Master) Slots: 10923-16383 Slave C1 数据分片流程 Client 计算 key → CRC16(key) % 16384 → 定位哈希槽 → 路由到对应节点 每个节点只存储部分数据,支持动态扩缩容,槽位迁移对客户端透明 新增节点 D → 槽位迁移 → 集群重新平衡

4.4 数据分片策略深度解析

4.4.1 哈希槽 vs 一致性哈希

维度 哈希槽(Redis Cluster) 一致性哈希(Codis/Twemproxy)
数据分布 固定 16384 个槽,均匀分配 依赖哈希环,虚拟节点数量影响均匀度
扩缩容影响 仅迁移涉及槽位的数据 仅影响相邻节点数据
客户端复杂度 客户端需缓存槽位映射表 客户端需实现一致性哈希算法
批量操作 跨槽位操作需多次请求 跨节点操作同样需多次请求
运维成熟度 官方原生支持,工具链完善 依赖第三方代理,社区维护

4.4.2 分片策略选型建议

  • 数据量 < 50GB:单机 + 哨兵模式即可,运维简单。
  • 数据量 50GB ~ 500GB:优先选择 Redis Cluster,官方支持,扩缩容方便。
  • 需要跨数据中心部署:考虑一致性哈希 + 代理层,便于自定义路由策略。
  • 对批量操作要求高:使用哈希标签(Hash Tag)将相关 key 强制分配到同一槽位。
避坑提示:Redis Cluster 不支持多数据库(select 命令),默认仅使用 db0。同时,事务和 Lua 脚本涉及的所有 key 必须在同一节点上,否则会报 CROSSSLOT 错误。

4.5 本章小结

  • 主从复制:实现数据冗余与读写分离,但无法自动故障转移。
  • 哨兵模式:在主从基础上增加自动故障检测与转移,适合中小规模场景。
  • Redis Cluster:通过哈希槽分片实现水平扩展,内置高可用,适合大规模分布式场景。
  • 数据分片策略:哈希槽、一致性哈希、范围分片各有优劣,需根据业务场景选择。