问题描述
- 服务不允许停止
- DB实例每个1E数据,总共8个实例,8E数据
- 写入速度1k/s,更新速度1.5k/s,查询速度5k/s
- 经过分析8E数据迁移大概需要10h
- DB实例需要从8个扩展到15个
思路
- 不停服,至少需要两组Java服务
- 10h中间会有大量不一致状态的数据,那么DB集群也需要两套
- 必须双写追数据,需要用到解析binlog,可选工具canal
- 导数据的过程中,尽量保障数据是静态的,可通过关闭主从同步来做到
方案图
执行步骤
第一阶段:导入静态8E数据
- 断开主从同步
- 导入数据
第二阶段:追10h + 追binlog过程的增量数据
- 开启主从同步
- 增加canal server和client同步binlog信息
- 增量写入
第三阶段:切换服务集群
- 起新服务集群,建立与新DB群的connection
- 切换nginx流量
- 切换过程中造成的差异数据,提供增强程序写入
秒级的异常数据处理
- insert 重复主键,记录旧ID与新ID的映射关系,以便于更新接下来的binlog ID
- 删除时,对比binlogTime and updateTime
- 更新时对比binlogTime and updateTime