题目
Redis集群扩容后数据迁移过程及故障处理
信息
- 类型:问答
- 难度:⭐⭐
考点
Redis集群原理,数据迁移过程,故障转移机制
快速回答
Redis集群扩容后数据迁移的关键点:
- 使用
CLUSTER MEET加入新节点并分配空槽位 - 通过
CLUSTER SETSLOT迁移槽位数据(分批次迁移键值) - 迁移过程中客户端重定向机制(ASK/MOVED)
- 故障处理:
- 迁移中源节点故障:目标节点会继续服务已迁移槽位
- 迁移中目标节点故障:源节点保留迁移记录,恢复后继续迁移
一、Redis集群扩容数据迁移流程
Redis集群采用分片架构(16384个槽位),扩容时数据迁移步骤如下:
- 加入新节点:
redis-cli --cluster add-node new_host:port existing_host:port - 分配空槽位:从现有节点转移部分槽位到新节点
redis-cli --cluster reshard existing_host:port \ --cluster-from <源节点ID> --cluster-to <新节点ID> --cluster-slots <槽位数> - 数据迁移过程:
- 源节点对每个槽位执行
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命令原理:- 源节点序列化键值
- 与目标节点建立socket连接
- 目标节点反序列化并存入内存
- 源节点删除本地数据(成功后才删除)
- ASK重定向流程:
客户端 → 源节点(返回ASK) → 客户端发送ASKING → 目标节点处理请求