时间点介绍:
- A:启动数据迁移
- B:全部迁移完成
- C:新服务启动成功(切换数据源)
A~C之间可能遇到的情况枚举如下:
新增数据 | 修改数据 | 删除数据 | |
---|---|---|---|
场景1 | × | x | x |
场景2 | ✅ | × | x |
场景3 | × | ✅ | x |
场景4 | × | × | ✅ |
场景5 | ✅ | ✅ | x |
场景6 | × | ✅ | ✅ |
场景7 | ✅ | × | ✅ |
场景8 | ✅ | ✅ | ✅ |
场景分析:
- 场景1(无任何变化):皆大欢喜,新服务启动后,即可正常运行
- 场景2\5\7\8(新增数据):时间点C之后,对增量数据(创建时间 > A)再次迁移
- 场景3\5\6\8(修改数据):时间点C之后,在旧库定位到修改数据(修改时间 > A),获取到PK后在新库删除,然后进行增量迁移
- 注意:这部分在旧库中被修改的数据,在新库中可能被再次修改(修改时间 > C),需要人为解决冲突
场景4\6\7\8(删除数据):时间点C之后,在旧库定位到删除数据(分析
binlog
),获取到PK后在新库删除上诉修改/删除数据的场景中:不管是分析还是操作都会花费一段时间,这段时间内可能反复出现新的冲突。
- 场景5\8(新增+修改场景中):如果微服务设计中采用了序列号表来记录自增Key种子,那么当A~C之间有新增数据(同时自增Key种子++)的话,新服务启动后会通过旧的种子生产重复的Key,从而导致业务阻塞等严重后果。解决方案:修改相关种子到最新值