Redis集群的键分布机制
Redis 集群的键分布机制基于哈希槽(Hash Slot),它是一种无中心的分布式哈希算法,用于确定键存储在哪个节点上。以下是 Redis 集群键分布机制的详细说明:
1、键分布基本原理
1.1 哈希槽的概念
- Redis 集群将所有的键分布在 16384 个哈希槽(编号从 0 到 16383)中。
- 每个节点负责一部分哈希槽。键通过哈希算法映射到某个哈希槽,再由负责该哈希槽的节点存储。
1.2 哈希算法
Redis 集群通过 CRC16 算法对键进行哈希,并对结果取模 16384 来计算哈希槽:
1.3 哈希槽与节点的映射
- 集群中,每个节点负责一组连续的或不连续的哈希槽。
- 例如:
- 节点 A 负责哈希槽
0-5460
。 - 节点 B 负责哈希槽
5461-10922
。 - 节点 C 负责哈希槽
10923-16383
。
- 节点 A 负责哈希槽
2、特殊键模式的处理
2.1 普通键
- 如果键是一个普通字符串,直接对整个字符串进行哈希。
- 例如,键 “user:1001” 映射到一个哈希槽。
2.2 使用{}
的键
- Redis 支持通过 {} 指定键的哈希部分,这样可以强制多个键映射到同一个哈希槽。
- 仅对 {} 中的部分进行哈希计算。
- 例如:
- 键
"user:{1001}:profile"
和"user:{1001}:settings"
都只对 {1001} 进行哈希,因此会映射到同一个哈希槽。
用例
- 键
- 这种机制用于键分组,保证一组相关的键分布在同一个节点上,适用于 MSET/MGET、事务、Lua 脚本等操作。
3、节点分布和迁移
3.1 初始分布
- 当创建集群时,哈希槽在节点之间平均分配。
- 可以使用 redis-cli --cluster create 命令自动完成初始分布。
3.2 数据迁移
- 当添加或移除节点时,Redis 集群会通过重新分片(resharding)将哈希槽重新分配。
- Redis 内置的数据迁移机制:
- 使用 CLUSTER SETSLOT 和 MIGRATE 命令在节点之间移动键。
- 例如,当哈希槽 5460 从节点 A 移动到节点 B 时,相关的键也会从节点 A 迁移到节点 B。
4. 数据一致性和多键操作
4.1 一致性保证
- 一个键只能存储在一个节点上。
- Redis 集群使用主从复制(Replication)保证数据的高可用性:
- 每个主节点有一个或多个从节点。
- 如果主节点宕机,从节点会被提升为主节点。
4.2 多键操作的限制
- 多键操作(如 MSET/MGET 或事务)要求所有涉及的键在同一个哈希槽中。
- 如果不在同一个哈希槽,Redis 会报错:
(error) CROSSSLOT Keys in request don't hash to the same slot
- 解决方法:使用 {} 将相关键分组到同一个哈希槽。
5. 键分布示例
假设我们有以下键:
user:1001:name
user:1002:name
order:5001
order:{5001}:status
- user:1001:name 的哈希槽:
CRC16("user:1001:name") % 16384 = 14239
例如,该键被分配到节点 C。
- order:{5001}:status 和 order:{5001}:details:
- 只对 {5001} 进行哈希计算,映射到同一个哈希槽。
6. 常用命令
6.1 查看键的哈希槽
redis-cli -c cluster keyslot <key>
示例:
redis-cli -c cluster keyslot "order:{5001}:status"
6.2 查看哈希槽分布
redis-cli -c cluster slots
6.3 迁移哈希槽
通过 redis-cli --cluster reshard 工具操作。
总结
- Redis 集群的键分布机制通过 16384 个哈希槽实现。
- 使用 {} 可以将相关键分配到同一个哈希槽,从而支持多键操作。
- 哈希槽的分布由集群自动管理,节点之间支持动态迁移以适应集群规模的变化。