redis的槽
# Redis 槽(Slot)详解
Redis Cluster 使用 哈希槽(Hash Slot) 机制来分片(Sharding)数据,这是其实现分布式数据存储的核心设计。以下是关键概念解析:
# 1. 什么是槽(Slot)?
- 定义:Redis Cluster 将整个数据集划分为 16384 个槽(编号
0-16383
),每个键通过哈希计算映射到其中一个槽。 - 作用:
- 数据分片:不同槽的数据存储在不同的主节点上。
- 负载均衡:槽均匀分布,避免单节点压力过大。
- 动态扩缩容:通过迁移槽实现节点增减。
# 2. 槽如何分配?
默认规则:
- 集群初始化时,16384 个槽会 均匀分配 给所有主节点。
- 例如:3 个主节点,每个节点大约负责
5461
个槽:- 节点A:
0-5460
- 节点B:
5461-10922
- 节点C:
10923-16383
- 节点A:
查看槽分配:
redis-cli -h 10.143.143.101 -p 7000 CLUSTER SLOTS
1输出示例:
1) 1) (integer) 0 # 起始槽 2) (integer) 5460 # 结束槽 3) 1) "10.143.143.101" # 主节点IP 2) (integer) 7000 # 主节点端口 4) 1) "10.143.143.102" # 从节点IP 2) (integer) 7003 # 从节点端口
1
2
3
4
5
6
# 3. 键如何映射到槽?
计算公式:
slot = CRC16(key) % 16384
1CRC16
是 Redis 使用的哈希算法。- 例如:键
user:100
的哈希值模16384
决定它属于哪个槽。
手动计算槽:
redis-cli -h 10.143.143.101 -p 7000 CLUSTER KEYSLOT "user:100"
1输出:
(integer) 14982 # 该键属于槽 14982
1
# 4. 槽的迁移与平衡
# (1)为什么需要迁移槽?
- 扩容:新增主节点时,需从其他节点转移部分槽给它。
- 缩容:删除主节点前,需将其负责的槽迁移到其他节点。
- 负载均衡:某些节点负载过高时,手动调整槽分布。
# (2)手动迁移槽
redis-cli --cluster reshard 10.143.143.101:7000
1
交互流程:
- 输入要迁移的槽数量(如
1000
)。 - 输入目标节点ID(接收槽的节点)。
- 输入源节点ID(
all
表示从所有节点抽取,或指定单个节点)。 - 确认迁移。
# 5. 槽 vs. 一致性哈希
特性 | Redis 槽 | 一致性哈希(如 Twemproxy) |
---|---|---|
分片粒度 | 固定 16384 槽 | 虚拟节点(通常更多) |
动态扩缩容 | 需手动迁移槽 | 自动重新哈希,但数据可能丢失 |
数据均衡 | 槽均匀分配,强制均衡 | 依赖哈希函数,可能不均匀 |
复杂度 | 高(需管理槽分配) | 低(客户端透明) |
# 6. 关键注意事项
槽覆盖所有数据:
- 集群必须分配完所有
16384
个槽,否则部分数据无法读写。 - 检查未分配槽:
redis-cli --cluster check 10.143.143.101:7000 | grep "\[ERR\]"
1
- 集群必须分配完所有
避免单点故障:
- 每个主节点应有至少一个从节点(复制其槽数据)。
客户端重定向:
- 如果客户端访问错误的节点,会收到
MOVED
或ASK
响应,需支持自动跳转。
- 如果客户端访问错误的节点,会收到
# 7. 示例:3主3从集群的槽分配
主节点 | 从节点 | 槽范围 |
---|---|---|
10.143.143.101:7000 | 10.143.143.102:7003 | 0-5460 |
10.143.143.102:7002 | 10.143.143.103:7005 | 5461-10922 |
10.143.143.103:7004 | 10.143.143.101:7001 | 10923-16383 |
# 总结
- 槽是 Redis Cluster 分片的基本单位,共
16384
个。 - 键通过哈希映射到槽,槽再绑定到具体节点。
- 扩缩容需手动迁移槽,但可通过工具(如
redis-cli --cluster rebalance
)辅助。 - 设计目标:在数据分片和负载均衡之间取得平衡,同时支持动态调整。
编辑 (opens new window)
上次更新: 2025/06/24, 00:41:57