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)强制多个键映射到同一槽。
  • 批量操作限制MSETMGET 等命令仅支持同一槽内的键。

5. 槽的设计优势

  • 灵活性
    • 相比一致性哈希,槽允许手动调整分配比例(如高性能节点分配更多槽)。
    • 解耦数据与节点的直接关系,简化扩缩容流程。
  • 高效性
    • 迁移时以槽为单位,而非单个键,减少网络开销。
    • 16384 槽数在心跳包大小(2KB)和扩展性(支持千级节点)间取得平衡。

6. 槽的状态与故障恢复

  • 槽的三种状态
    • 未指派:未被任何节点管理。
    • 已指派:由某节点负责。
    • 导入中:正在迁移数据到新节点。
  • 故障转移
    主节点故障时,从节点通过 Raft 算法选举晋升为主节点,并接管原主节点的槽位,更新配置纪元(Epoch)以优先新配置。

总结

Redis 槽机制通过固定数量的逻辑分片(16384 槽)实现了高效的数据分布、动态扩缩容和故障恢复,是 Redis Cluster 高可用与高性能的核心设计。