一、Redis分片模式架构原理
1.1 分片数据分布(一致性哈希)
graph LR
A[客户端] --> B{哈希环}
B -->|Key哈希| C(Node1: 0-8191)
B -->|Key哈希| D(Node2: 8192-16383)
style C fill:#90EE90
style D fill:#87CEEB
Redis Cluster采用虚拟槽分区(16384个槽),每个节点负责部分槽位。通过CRC16算法计算键的哈希值,映射到对应槽位。
二、增加节点操作流程
2.1 扩容步骤图解
sequenceDiagram
participant Admin as 管理员
participant NewNode as 新节点
participant Cluster as 集群
Admin->>NewNode: 1. 启动新Redis实例
Admin->>Cluster: 2. CLUSTER MEET添加节点
Admin->>Cluster: 3. 分配空槽位给新节点
Admin->>Cluster: 4. 迁移部分槽数据
Admin->>Cluster: 5. 更新集群配置
2.2 关键操作命令
# 添加新节点到集群
redis-cli --cluster add-node 新节点IP:端口 已有节点IP:端口
# 分配槽位(示例迁移1000个槽)
redis-cli --cluster reshard 已有节点IP:端口 \
--cluster-from 源节点ID \
--cluster-to 新节点ID \
--cluster-slots 1000 \
--cluster-yes
2.3 数据迁移过程
| 阶段 | 动作 | 影响 |
|---|---|---|
| 准备 | 新节点加入集群 | 无服务中断 |
| 迁移 | 槽数据分批转移 | 迁移中槽的请求短暂阻塞 |
| 切换 | 更新槽映射关系 | 客户端自动重定向 |
三、移除节点操作流程
3.1 缩容步骤图解
flowchart TB
A[确认节点无数据] --> B[迁移槽到其他节点]
B --> C[忘记节点]
C --> D[关闭实例]
3.2 关键操作命令
# 将待删节点槽迁移到目标节点
redis-cli --cluster reshard 待删节点IP:端口 \
--cluster-from 待删节点ID \
--cluster-to 目标节点ID \
--cluster-slots 全部槽数 \
--cluster-yes
# 从集群删除节点
redis-cli --cluster del-node 已有节点IP:端口 待删节点ID
3.3 槽迁移策略对比
| 策略 | 优点 | 缺点 |
|---|---|---|
| 手动迁移 | 精确控制迁移量 | 操作复杂 |
| 自动平衡 | 全自动完成 | 可能影响性能 |
| 分批次迁移 | 平衡控制与自动化 | 需要脚本辅助 |
四、数据迁移核心原理
4.1 迁移过程状态流转
stateDiagram
[*] --> 未迁移
未迁移 --> 迁移中: 开始迁移
迁移中 --> 已迁移: 完成数据复制
已迁移 --> 未迁移: 回滚操作
迁移中 --> 错误: 网络中断
4.2 迁移原子性保证
- 设置迁移状态:标记槽为
IMPORTING/MIGRATING - 批量转移键值:使用
CLUSTER GETKEYSINSLOT获取槽内键 - 原子切换:通过
SETSLOT命令完成所有权转移
五、客户端影响与应对措施
5.1 重定向机制
sequenceDiagram
客户端->>旧节点: 请求已迁移槽数据
旧节点-->>客户端: MOVED 新节点地址
客户端->>新节点: 重新发送请求
5.2 最佳实践建议
-
客户端配置:
// Jedis集群配置 JedisClusterConfig config = new JedisClusterConfig() .setMaxRedirects(5); // 设置最大重试次数 -
操作窗口选择:在业务低峰期执行扩缩容
-
监控指标:
- 迁移速度(keys/sec)
- 网络带宽使用率
- 客户端错误率
六、自动化工具推荐
6.1 Redis官方工具链
# 检查集群状态
redis-cli --cluster check 节点IP:端口
# 自动平衡槽分布
redis-cli --cluster rebalance 节点IP:端口 \
--cluster-weight 节点ID=权重
6.2 第三方方案对比
| 工具 | 特点 | 适用场景 |
|---|---|---|
| Redis Cluster | 原生方案,AP模型 | 中小规模集群 |
| Codis | Proxy架构,支持平滑迁移 | 大规模企业级 |
| Twemproxy | 简单静态分片 | 无需动态扩容场景 |
七、故障处理预案
7.1 常见问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 迁移卡住 | 大key阻塞 | 拆分大key分批迁移 |
| 客户端超时 | 重定向循环 | 检查客户端兼容性 |
| 数据丢失 | 迁移未完成强制下线节点 | 从备份恢复数据 |
7.2 紧急回滚步骤
- 停止迁移操作
- 使用
CLUSTER SETSLOT回退槽分配 - 验证数据一致性
- 检查客户端连接状态