Redis 集群模式Redis Cluster

一、前言

Redis 集群模式(Redis Cluster) 是 Redis 提供的一种分布式数据库解决方案,用于实现数据的自动分片(sharding)、高可用性(HA) 和 横向扩展能力。它从 Redis 3.0 开始正式支持。

二、Redis Cluster核心特性

  1. 数据分片(Sharding)
    Redis 集群将整个键空间划分为 16384 个哈希槽(hash slots)。
    每个键通过 CRC16(key) % 16384 计算出所属的槽。
    每个节点负责一部分槽,从而实现数据分布。
  2. 高可用(High Availability)
    每个主节点(master)可以有多个从节点(replica/slave)。
    主节点故障时,集群会自动进行故障转移(failover),由从节点提升为主节点。
    使用 Gossip 协议(如 PING/PONG/MEET)进行节点间通信和状态同步。
  3. 去中心化
    没有中心协调节点,每个节点都保存集群的拓扑信息。
    客户端可连接任意节点,若请求的 key 不在该节点,会收到 MOVED 或 ASK 重定向。

三、Redis 集群有哪些限制或缺点?

  • 不支持多 key 跨槽操作(除非在同一槽)
    解决办法: 通过 .NET 客户端(如 StackExchange.Redis)模拟实现“伪多 key 操作”,虽然不保证原子性,但在很多业务场景下是可接受的。
  • 不支持数据库切换,不支持多DB(默认只有 DB 0)
    解决办法: 通过.Net客户端,用 key 前缀(Namespace)模拟逻辑数据库,为不同业务模块的 key 添加统一前缀
    如:
    session:user:123 → 模拟 “DB 0”(会话)
    cache:product:456 → 模拟 “DB 1”(商品缓存)
    job:task:789 → 模拟 “DB 2”(任务队列)
  • 事务/Lua 脚本受槽限制;
  • 集群模式下 不支持 SELECT 命令;
  • 客户端需支持集群协议(如 JedisCluster、StackExchange.Redis);
  • 最小部署需 3 主 3 从(6 节点)才能实现高可用 + 容错。

四、什么是哈希槽

Redis 哈希槽(Hash Slot)是 Redis Cluster 分布式集群的核心概念,用于实现数据分片和负载均衡

Redis Cluster 将整个键空间划分为 16384 个哈希槽(0-16383),每个键通过 CRC16 算法计算出一个 16 位的哈希值,然后对 16384 取模,确定该键属于哪个哈希槽。每个哈希槽都会被分配到集群中的某个主节点上。

主要作用

  • 数据分片
    通过哈希槽将数据均匀分布到多个节点,实现水平扩展,突破单机内存限制。

  • 负载均衡
    自动将哈希槽分配到不同节点,避免数据倾斜,确保各节点负载相对均衡。

  • 高可用性
    当节点故障时,集群会自动将故障节点的哈希槽重新分配到其他正常节点。

  • 动态伸缩
    支持在线添加或删除节点,集群会自动重新分配哈希槽,无需停机。

管理命令

  • CLUSTER SLOTS: 查看哈希槽分布
  • CLUSTER ADDSLOTS: 手动分配哈希槽
  • CLUSTER DELSLOTS: 删除哈希槽

五、为什么是16384个槽

Redis 作者 Salvatore Sanfilippo 解释过这个设计:

  • 通信开销考量: 集群节点间通过 Gossip 协议交换槽信息,使用 bitmap 表示槽分配状态。
    16384 个槽 ≈ 2KB 的 bitmap(16384 / 8 = 2048 字节)。
    如果槽太多(如 65536),bitmap 会变大,增加网络带宽消耗。
  • 实用性权衡: 实际生产中 Redis 集群节点通常不超过几百个,16384 个槽已足够实现均匀分布。

六、Gossip 消息

1、在 Redis Cluster 的 Gossip 协议(通过 PING/PONG 消息) 中:

  • 每个节点在 PING/PONG 消息中 不会发送整个 16384 位的槽位 bitmap。

  • 而是采用一种紧凑编码方式,只描述 “自己负责哪些槽” —— 具体来说,是以 槽范围(slot ranges) 的形式发送,例如:

    [start_slot, end_slot]
    

    如果一个节点负责多个不连续的槽段,就发送多个这样的区间。
    槽总数越多 → 描述“自己负责哪些槽”所需的元数据可能越大 , 这就是为什么说 65536 个槽会导致心跳包过大

    举例: 假设设计为65536个槽位,现在你有 100 个节点(100台主机)
    场景 1:集群节点数量多,槽分配碎片化
    平均每个节点负责约 650 个槽
    当槽分配不连续(比如由于频繁扩缩容、迁移失败等),一个节点可能负责 几十个甚至上百个不连续的小槽段。
    每个槽段需用[start, end]表示(通常 2×2=4 字节),那么 100 个槽段 ≈ 400 字节

    而在 16384 槽 + 同样 100 节点下,平均每个节点负责 ~160 个槽,碎片化程度更低,所需槽段描述更少

    场景 2:Gossip 消息中还包含其他节点的“疑似故障”信息(gossip section)
    1、PING/PONG 消息除了携带自身状态,还会附带 随机选取的 N 个其他节点的状态摘要(用于传播集群视图)
    2、这些摘要中也包含目标节点负责的槽信息(同样是槽范围列表)
    3、所以,即使 A 节点只发自己的槽,它也会在 gossip section 中捎带 B、C 节点的槽信息
    4、当槽总数很大时,每个被捎带的节点的槽描述也可能变长,整体消息膨胀

    总槽位数 16384 是一个经过精心权衡的数字,确保了在绝大多数实际场景下,网络效率和扩展性都不会成为问题。

在这里插入图片描述
在 Redis 集群架构中,从节点(Replica)的核心价值在于构建高可用、容灾 resilient 的数据服务体系。它通过异步复制机制,实时同步主节点(Master)的数据状态,形成“主-备”冗余单元。当主节点因故障、网络分区或维护等原因不可用时,集群能够基于多数派共识机制,自动触发故障转移(Failover),将一个健康的从节点无缝晋升为主节点,从而:

  • 保障服务连续性: 客户端请求几乎无感知地切换至新主节点,避免业务中断;
  • 守护数据可靠性: 最大限度减少因单点故障导致的数据丢失风险;
  • 提升系统韧性: 在面对硬件故障、网络抖动等异常场景时,系统具备自愈能力。

因此,从节点不仅是数据的“备份副本”,更是 Redis 集群实现高可用(High Availability)与故障自恢复能力的关键基石。
一般而言,Redis 单节点性能极高(10万+QPS)大部分应用场景不需要从节点分担读压力,主节点能轻松处理所有请求。
因此,在绝大多数业务场景中,主节点自身已足以承载全部访问压力,无需依赖从节点分担读负载。从节点的核心价值应聚焦于高可用保障与故障容灾,而非作为性能扩展的手段,从而确保系统在保持简洁性的同时,兼具稳定性与可靠性。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值