全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-12 8 分钟 ✍️ juanwangdev

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,不支持多数据库

📝 发现内容有误?点击此处直接编辑

← 上一篇 Redis集群数据迁移与重新分片
下一篇 → Redis集群节点通信与Gossip协议
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库