第 10 章 · Cluster 集群与数据分片

四个交互演示:① 16384 槽位分配 · ② CRC16 路由实验 · ③ MOVED / ASK 重定向 · ④ Gossip 八卦传播

16384 个 slot 在 master 节点上的分配

下面是一条「16384 槽位进度条」,按 6 个 master 节点分段着色。你可以加节点、删节点,看槽位如何重新分布—— Cluster 的精髓就在这里:16384 总数不变,只是「重新切配」

slot 0546110922slot 16383
注意:添加节点不是把现有 slot「再切一刀」,而是从已有 master「划走一部分 slot」转交给新节点。 实际生产中迁移过程中数据需要 MIGRATE 命令搬运,这一过程客户端可能收到 ASK 重定向(Tab ③ 演示)。

CRC16 路由实验

输入任意 key,实时显示:CRC16(key)% 16384 → 落到哪个 slot → 哪个节点。 右侧是 HashTag 对比演示。

📍 计算路径

输入 key: -
HashTag: -
参与 hash: -
CRC16: -
% 16384: -
归属节点: -

🆚 HashTag 对比演示

同样是「user 1001 相关」,加 / 不加 HashTag 路由结果完全不同:

结论:{user:1001} 的所有 key 落同一 slot 同一节点 → 可以 MGET / 事务 / Lua。 不带 HashTag 时各自飘散,多 key 操作会报 CROSSSLOT。

注:本页面用了 Redis 官方源码 crc16.c 中同款的 CRC16-CCITT (XMODEM) 算法, 所以这里算出的 slot 与真实 CLUSTER KEYSLOT 命令的结果完全一致。

MOVED / ASK 重定向动画

分两个场景演示客户端重定向:MOVED(路由表过时)和 ASK(slot 正在迁移中)。

📱 Client
slotMap[1903]=?
7000 (A)
slot 0~5460
7001 (B)
slot 5461~10922
MOVED:「这个 slot 永久归 7001 了,更新你的路由表」 — 客户端必须更新本地 slotMap。
ASK:「这个 key 临时去 7001 一下,路由表别动」 — 必须先发 ASKING「一次性通行证」,否则会被目标节点 MOVED 回来形成死循环。

Gossip 八卦传播动画

6 个节点圆形布局,每秒每节点随机选 5 个发 PING。点「让节点 X 下线」,观察 PFAIL 状态怎么逐步「八卦」到全集群、最终升级为 FAIL。

tick 0
未运行。点「启动 PING」开始。
颜色含义:绿圈= 健康节点; 黄圈闪烁= 该节点已被某些节点 PFAIL; 红圈= 该节点被自己确认下线 (FAIL); 节点上方的小数字「2/5」= 「认为该节点 PFAIL 的节点数 / 还活着的 master 数」。 当 PFAIL 比例 > 1/2 → 升级 FAIL,全集群广播。