【1】数据分片架构设计
Redis Cluster 采用数据分片(Sharding)而非一致性哈希的设计方案。这种设计通过引入哈希槽(Hash Slot)概念,实现了更好的可控性和可扩展性。
【2】统一的槽位映射空间
Redis Cluster 将整个数据空间划分为 16384 个固定槽位(0-16383),建立并维护 节点(Node) ↔ 槽位(Slot) ↔ 键值(Key-Value)之间的映射关系。
【3】键值到槽位的计算机制
# 键值到槽位的计算过程:
def key_to_slot(key):
# 1. 使用CRC16算法计算哈希值
hash_value = crc16(key)
# 2. 对16384取模得到槽位编号
slot = hash_value % 16384
return slot
# 示例
key = "user:1001"
slot = crc16("user:1001") % 16384 # 假设得到槽位5001
【4】槽位在节点间的分配策略
集群初始化时,16384个槽位会近似均匀地分配给所有主节点:
3节点集群:每个节点约5461个槽位
6节点集群:每个节点约2730个槽位
支持手动调整槽位分布以实现负载均衡
【5】强制槽位分配机制
通过键标签(Key Tag)可以强制指定键的槽位:
# 使用花括号定义标签
SET user:{1001} "John" # 槽位由"1001"计算决定
SET order:{1001} "12345" # 与user:{1001}分配到同一槽位
# 计算原理:只对花括号内的内容进行CRC16计算
slot = crc16("1001") % 16384 # 两个键分配到相同槽位
【6】客户端路由智能缓存
就是客户端会有一个缓存,记录每个槽对应的在哪个Ip节点上,只有首次才会去计算,根据节点返回的接口,来保存缓存内容。
具体请看:跳转
概念:MOVED重定向、ASK重定向
【7】高效的槽位管理数据结构
看下槽位的数据结构:跳转
通俗理解:节点如何快速判断"这个数据归我管吗?"
核心数据结构:位图(Bit Array)
位图的概念 - "16384个座位的签到表"
public class SlotBitMap {
// 用2048个字节(16384位)表示16384个槽位
// 每个bit代表一个槽位:1=我负责,0=不归我管
private byte[] bitmap = new byte[2048]; // 2048 × 8 = 16384位
// 示例:判断槽位5000是否归这个节点管
public boolean isSlotMine(int slotNumber) {
int byteIndex = slotNumber / 8; // 第几个字节? 5000/8 = 625
int bitIndex = slotNumber % 8; // 字节里的第几位? 5000%8 = 0
// 检查第625个字节的第0位是否为1
return (bitmap[byteIndex] & (1 << bitIndex)) != 0;
}
}
实际内存布局示例
槽位: 0 1 2 3 4 5 6 7 8 9 10 ... 16383
位图: [01010101] [10101010] [00000000] ... [11111111]
↑ ↑ ↑
字节1 字节2 字节3 ...
【8】动态重分片机制
槽位迁移过程:
标记迁移状态:设置迁移中的槽位为IMPORTING/MIGRATING
原子性迁移:逐个键迁移,保证数据一致性
更新路由表:迁移完成后广播新的槽位分配
客户端重定向:通过MOVED/ASK响应指导客户端
【9】集群配置持久化机制
每个节点将集群状态持久化到nodes.conf配置文件:
# nodes.conf 示例内容
98b6c7b7146f953dae28f9b9b7ba38b5f76f400e 127.0.0.1:6380 master - 0-5460
2a1b3c4d5e6f7890123456789abcdef012345678 127.0.0.1:6381 master - 5461-10922
# 格式: 节点ID IP:端口 角色 主节点ID 负责槽位范围
设计优势总结
1、可控的数据分布
# 手动调整槽位分布示例
redis-cli --cluster reshard 127.0.0.1:6380
# 交互式将部分槽位从节点A迁移到节点B
2、高效的键值查找
槽位计算:O(1)时间复杂度
节点定位:基于位图的O(1)查找
网络跳转:大多数操作只需1次节点访问
3、无缝的扩缩容
# 添加新节点
redis-cli --cluster add-node 127.0.0.1:6384 127.0.0.1:6380
# 重新分配槽位
redis-cli --cluster rebalance --cluster-threshold 1 127.0.0.1:6380
4、客户端智能路由
967

被折叠的 条评论
为什么被折叠?



