Redis集群架构与数据分片
Redis集群采用去中心化架构,通过数据分片实现水平扩展,每个节点负责一部分数据。
集群架构设计
架构特点
- 去中心化:无中心代理节点,所有节点对等
- 数据分片:16384个槽位分散到多个节点
- 高可用:主从复制+自动故障转移
- 线性扩展:节点增加,容量和性能线性增长
节点角色
Bash
主节点(Master):负责读写,持有槽位
从节点(Replica):负责复制,可分担读请求
最小集群配置
Bash
最少节点:6个(3主3从)
主节点数:建议奇数(3/5/7)
从节点数:每个主节点至少1个从节点
槽位机制
槽位分配
Bash
总槽位数:16384(0-16383)
分配规则:每个主节点负责一部分槽位
计算公式:slot = CRC16(key) % 16384
槽位分布示例
Bash
节点M1:槽位 0-5460
节点M2:槽位 5461-10922
节点M3:槽位 10923-16383
槭位查看命令
Bash
# 查看key所在槽位
CLUSTER KEYSLOT mykey
# 查看槽位所属节点
CLUSTER SLOTS
# 查看节点信息
CLUSTER NODES
数据分片策略
基于哈希的分片
Bash
CRC16(key) mod 16384 → 槽位 → 节点
哈希标签(Hash Tags)
基本语法
text
{tag}部分参与哈希计算
key{tag}:field → 只计算tag的哈希值
使用场景
text
user:1000:profile → 槽位A
user:1000:orders → 槽位B(可能不同节点)
user{1000}:profile → 槽位C
user{1000}:orders → 槽位C(相同节点)
使用哈希标签可将相关数据分配到同一节点,支持多键操作。
代码示例
text
# 设置哈希标签
SET user{1000}:name "Alice"
SET user{1000}:email "alice@example.com"
# 多键操作
MGET user{1000}:name user{1000}:email
集群配置
节点配置文件
text
# redis.conf
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.100
cluster-announce-port 7000
cluster-announce-bus-port 17000
集群创建命令
text
# 创建集群(Redis 5.0+)
redis-cli --cluster create \
192.168.1.101:7000 192.168.1.102:7000 192.168.1.103:7000 \
192.168.1.101:7001 192.168.1.102:7001 192.168.1.103:7001 \
--cluster-replicas 1
集群管理命令
text
# 查看集群信息
CLUSTER INFO
# 查看节点信息
CLUSTER NODES
# 查看从节点
CLUSTER REPLICAS <node-id>
# 故障转移
CLUSTER FAILOVER
数据分布优化
数据倾斜问题
- 某节点槽位数据量过大
- 热点key集中在少数槽位
- 大key导致单个节点压力
解决方案
text
# 查看各节点key数量
redis-cli -c -h <ip> -p <port> CLUSTER NODES
# 使用哈希标签分散热点
hot{1}:data, hot{2}:data, hot{3}:data
# 大key拆分
bigkey:field1, bigkey:field2 →
bigkey:1:field1, bigkey:2:field2
集群限制
| 限制项 | 说明 |
|---|---|
| 多键操作 | 必须在同一槽位 |
| 事务 | 只能在同一槽位执行 |
| Lua脚本 | 涉及key必须同槽位 |
| 数据库 | 只支持DB0 |
| 集合运算 | key必须在同槽位 |
集合运算(SUNION、SINTER、SDIFF)要求所有key在同一节点。
要点总结
- 集群使用16384个槽位分散数据,CRC16(key)%16384计算槽位
- 哈希标签{tag}保证相关数据分配到同一节点
- 最小配置3主3从,主节点数建议奇数
- 多键操作、事务、Lua脚本需要key在同槽位
- 注意数据倾斜问题,合理使用哈希标签分散热点
- 集群只支持DB0,不支持多数据库
📝 发现内容有误?点击此处直接编辑