不停服的DB实例扩容方案

1,294 阅读1分钟

问题描述

  1. 服务不允许停止
  2. DB实例每个1E数据,总共8个实例,8E数据
  3. 写入速度1k/s,更新速度1.5k/s,查询速度5k/s
  4. 经过分析8E数据迁移大概需要10h
  5. DB实例需要从8个扩展到15个

思路

  1. 不停服,至少需要两组Java服务
  2. 10h中间会有大量不一致状态的数据,那么DB集群也需要两套
  3. 必须双写追数据,需要用到解析binlog,可选工具canal
  4. 导数据的过程中,尽量保障数据是静态的,可通过关闭主从同步来做到

方案图

执行步骤

第一阶段:导入静态8E数据

  1. 断开主从同步
  2. 导入数据

第二阶段:追10h + 追binlog过程的增量数据

  1. 开启主从同步
  2. 增加canal server和client同步binlog信息
  3. 增量写入

第三阶段:切换服务集群

  1. 起新服务集群,建立与新DB群的connection
  2. 切换nginx流量
  3. 切换过程中造成的差异数据,提供增强程序写入

秒级的异常数据处理

  1. insert 重复主键,记录旧ID与新ID的映射关系,以便于更新接下来的binlog ID
  2. 删除时,对比binlogTime and updateTime
  3. 更新时对比binlogTime and updateTime