【CM0071】异地超分
日期 版本 描述 作者
原始需求
详见《云手机异地超分需求说明书》
需求分析
业务场景
当用户移动到其它城市时,连接使用云手机时网络延时会加大。可通过异地超分切换到用当前城市最优机房,将用户RBD数据迁移到对应机房存储,提升云手机网络状态让用户体验更佳。
功能需求
云手机管理平台
1.配置存储节点信息
2.迁移过程审计
双子星客户端
1.客户端迁移测速
2.迁移记录
设计方案
数据库Cloud
1.修改 t_storage_info 表
ALTER TABLE `t_storage_info`
ADD COLUMN `node_num` int(4) NOT NULL DEFAULT 0 COMMENT '存储内网节点数' AFTER `nip`,
ADD COLUMN `parallel_num` int(4) NOT NULL DEFAULT 0 COMMENT 'RBD迁移并行数' AFTER `node_num`,
ADD COLUMN `transfer_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'RBD迁移开关:0.关闭 1.开启' AFTER `parallel_num`
2.更新 t_storage_info 表存储内网节点数量
-- 设置更新节点数量
update `t_storage_info` set node_num = (LENGTH(nip) - LENGTH(REPLACE (nip, ',', '')))
3.修改 t_partition_move_task 表
ALTER TABLE `t_partition_move_task`
MODIFY COLUMN `move_status` int(2) NOT NULL COMMENT '迁移状态(-1:等待中,0:迁移失败,1:迁移成功,2:迁移中,3:暂停中,4:取消)' AFTER `new_pname`,
ADD COLUMN `apply_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间' AFTER `move_describe`,
ADD COLUMN `start_time` timestamp NULL COMMENT '迁移开始时间' AFTER `apply_time`,
ADD COLUMN `finish_time` timestamp NULL COMMENT '迁移结束时间' AFTER `start_time`
业务流程
1.配置存储并发数
2.RBD迁移流程
3.RBD迁移通知回调
接口
云手机管理平台
注:
最大并发数 = t_storage_info【 node_num(节点数) * parallel_num(RBD迁移并行数) 】
当前节点并发数 = t_partition_move_task【 move_status=迁移中 AND storage_id 或 old_storage_id = 节点存储id) 】
1.【修改 -> 页面 -> 存储配置管理 -> 添加存储】参考:com.vcloud.storage.controller.storageController.StorageController#addStorage
添加存储获取集群节点数量时更新表 t_storage_info 里的 node_num 节点数量
2.【新增 -> 页面 -> 迁移策略管理】迁移策略配置
对存储 t_storage_info 配置迁移策略 开关和并行数量,修改并行数量后需要调用RBD接口设置该存储集群节点的并发数
3.【新增 -> 页面 -> 迁移管理】迁移管理
查询 t_partition_move_task 进行任务的管理,相应重试、取消 调用RBD接口,详情调用RBD接口获取迁移过程详情
4.【修改 -> 站点列表】
客户端获取站点列表时新增 ip 参数、以及站点任务情况,按照在线迁移任务比例占存储最大并发数的比例
空闲: < 25%,
一般:< 75% & > 25%,
繁忙:> 75%
5.【新增 -> 站点迁移查询】
查询排队数量(t_partition_move_task apply_time < 当前时间 AND storage_id 或 old_storage_id in (迁移中的两个存储节点)),预计迁移所需时间(查询上一条迁移记录,同 storage_id 到 old_storage_id 迁移成功记录,没有则默认迁移时间(4小时)|如有则计算其上一条成功迁移数据大小时间比例 t_partition_info (b_size,capacity_ratio),t_partition_move_task(start_time, end_time)再根据本次迁移大小计算时间)
6.【修改 -> 站点迁移】
a.排队迁移,写入 t_partition_move_task,任务状态为待迁移
b.不排队迁移,调用迁移RBD服务
获取redis分布式锁
查询 storage_id 和 old_storage_id 两个存储节点是否符合并发条件
符合则把当前任务置为迁移中、不符合则返回需要等待让用户选择
通知用户开始迁移数据
调用RBD接口进行迁移,将结果更新到 t_partition_move_task
解锁redis分布式锁
7.【新增 -> 客户端迁移记录】提供给双子星客户端迁移记录查询
查询 t_partition_move_task 任务
8.【新增 -> RBD迁移回调 】RBD迁移回调
a.RBD迁移回调结果更新到 t_partition_move_task 迁移任务表
b.启动RBD迁移分配线程
c.查询出 t_partiton_move_task 中 storage_id or old_storage_id in (回调迁移中的两个存储节点),按照 apply_time 升序排列,取 两个存储节点中 最大的并发数作为条数
d.循环处理数据调用迁移RBD服务