侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

Redis集群扩容后数据迁移过程及故障处理

2025-12-7 / 0 评论 / 4 阅读

题目

Redis集群扩容后数据迁移过程及故障处理

信息

  • 类型:问答
  • 难度:⭐⭐

考点

Redis集群原理,数据迁移过程,故障转移机制

快速回答

Redis集群扩容后数据迁移的关键点:

  • 使用CLUSTER MEET加入新节点并分配空槽位
  • 通过CLUSTER SETSLOT迁移槽位数据(分批次迁移键值)
  • 迁移过程中客户端重定向机制(ASK/MOVED)
  • 故障处理:
    • 迁移中源节点故障:目标节点会继续服务已迁移槽位
    • 迁移中目标节点故障:源节点保留迁移记录,恢复后继续迁移
## 解析

一、Redis集群扩容数据迁移流程

Redis集群采用分片架构(16384个槽位),扩容时数据迁移步骤如下:

  1. 加入新节点
    redis-cli --cluster add-node new_host:port existing_host:port
  2. 分配空槽位:从现有节点转移部分槽位到新节点
    redis-cli --cluster reshard existing_host:port \
      --cluster-from <源节点ID> --cluster-to <新节点ID> --cluster-slots <槽位数>
  3. 数据迁移过程
    • 源节点对每个槽位执行CLUSTER GETKEYSINSLOT获取键列表
    • 对每个键执行MIGRATE命令原子迁移到目标节点
    • 迁移期间客户端访问:
      • 未迁移键:正常处理
      • 迁移中键:返回ASK重定向(临时重定向)
      • 已迁移键:返回MOVED重定向(永久重定向)

二、迁移过程中的故障处理

故障场景处理机制影响范围
源节点宕机目标节点继续服务已迁移槽位,未迁移数据不可用仅影响未完成迁移的槽位
目标节点宕机源节点保留迁移状态记录,节点恢复后自动继续迁移迁移暂停,已迁移数据仍在新节点
网络分区根据cluster-node-timeout触发故障转移可能产生脑裂,需人工介入

三、最佳实践与常见错误

最佳实践:

  • 迁移时设置--cluster-replace避免节点ID冲突
  • 分批迁移(每次100-1000个槽位)减少阻塞
  • 监控迁移状态:
    redis-cli --cluster check cluster_host:port

常见错误:

  • 错误1:迁移期间强制终止 → 导致数据不一致
    解决方案:使用--cluster fix修复槽位映射
  • 错误2:未更新客户端 → 频繁重定向降低性能
    解决方案:使用支持集群协议的客户端(如JedisCluster)
  • 错误3:未设置合理超时 → 迁移阻塞正常请求
    解决方案:
    config set cluster-node-timeout 5000  # 单位毫秒

四、扩展知识:迁移原理

Redis使用异步迁移+重定向机制保证可用性:

  • MIGRATE命令原理:
    1. 源节点序列化键值
    2. 与目标节点建立socket连接
    3. 目标节点反序列化并存入内存
    4. 源节点删除本地数据(成功后才删除)
  • ASK重定向流程:
    客户端 → 源节点(返回ASK) → 客户端发送ASKING → 目标节点处理请求