Redis Slot

Redis 集群中的槽(Slot)是一种核心的数据分片机制,用于将数据均匀分布到多个节点,实现负载均衡和高可用性。以下是槽的详细解释:
1. 槽的基本概念
-
定义与数量
Redis 集群将整个数据集划分为 16384 个固定槽位(编号 0-16383),每个键通过CRC16(key) % 16384
计算其归属的槽。槽位的数量固定,便于数据迁移和节点管理。 -
作用
- 数据分片:每个节点负责管理一部分槽位,例如 3 节点集群中每个节点可能管理约 5461 个槽。
- 负载均衡:槽位分布决定了数据在不同节点的存储位置,避免单节点压力过大。
- 动态扩展:通过槽的迁移实现集群在线扩容或缩容。
2. 槽的分配与动态迁移
-
初始分配
槽位可通过CLUSTER ADDSLOTS
命令手动分配给节点,例如节点 A 负责槽 0-4095,节点 B 负责 4096-8191 等。- 集群上线条件:所有 16384 个槽必须被分配,否则集群处于下线状态。
-
动态迁移
当新增或删除节点时,槽位可重新分配:- 扩容:从现有节点各转移部分槽到新节点(如 4 节点集群每个节点分配约 4096 个槽)。
- 缩容:移除节点前需将其槽位迁移至其他节点。
- 迁移方式:直接迁移整个槽的数据,而非单个键,提升效率。
3. 槽的管理与通信
-
节点元数据
每个节点维护完整的集群元数据,包括槽位分配、节点状态等,通过 Gossip 协议(PING/PONG 消息)与其他节点交换信息。 -
故障检测:节点间心跳超时标记为疑似下线(PFAIL),超过半数主节点确认后标记为下线(FAIL),触发故障转移。
-
客户端路由
- Smart 客户端:客户端缓存槽位与节点的映射关系,直接定位目标节点,避免多次重定向。
- MOVED 重定向:若客户端请求错误节点,返回 MOVED 响应并指引正确节点。
4. 槽与操作限制
- 跨槽操作限制
事务、Lua 脚本等需确保所有操作的键位于同一槽。可通过 哈希标签(如user:{123}.name
)强制多个键映射到同一槽。 - 批量操作限制:
MSET
、MGET
等命令仅支持同一槽内的键。
5. 槽的设计优势
- 灵活性
- 相比一致性哈希,槽允许手动调整分配比例(如高性能节点分配更多槽)。
- 解耦数据与节点的直接关系,简化扩缩容流程。
- 高效性
- 迁移时以槽为单位,而非单个键,减少网络开销。
- 16384 槽数在心跳包大小(2KB)和扩展性(支持千级节点)间取得平衡。
6. 槽的状态与故障恢复
- 槽的三种状态
- 未指派:未被任何节点管理。
- 已指派:由某节点负责。
- 导入中:正在迁移数据到新节点。
- 故障转移
主节点故障时,从节点通过 Raft 算法选举晋升为主节点,并接管原主节点的槽位,更新配置纪元(Epoch)以优先新配置。
总结
Redis 槽机制通过固定数量的逻辑分片(16384 槽)实现了高效的数据分布、动态扩缩容和故障恢复,是 Redis Cluster 高可用与高性能的核心设计。