一,场景
订单系统中,不同订单来源对应了不同的订单表(字段差异不大),导致后期订单表维护成本非常高。需要将多张订单表合成一张表,并对旧数据进行同步。
二,技术难点
1,属于to C服务,需要不停机无缝切换;
2,业务还在迭代开发中,不能更改数据源的访问;
3,订单属于核心链路,如何保证数据安全,数据切换一致性;
三,解决方案
先将新数据双写进新旧数据表,再将旧表数据同步到新表,然后灰度切换读流量,对数据进行校验、异常告警,逐步将读流量切到新表,观察一段时间数据无异常后停止写入旧表,完成迁移。大概流程可以参考下图:
3.1,实现步骤
-
双写或订阅binlog:
需要注意:1,如果跨实例,可以采用订阅binlog方式,避免事务问题,不过需要处理数据延迟问题;2,多张表合成一张表,考虑id冲突问题。
-
历史数据同步:
可以采用阿里云DTS等工具进行数据迁移。
-
切读流量:
需要注意:1,灰度切换,风险控制;2,校验机制:读请求先读旧表,再读新表,校验新旧表数据一致才返回新表数据,否则还是走旧表,且发告警;3,新的读逻辑需要考虑更新延迟情况。
-
完成切流,观察一段时间正常后,停止写入旧表;
3.2,怎么保证新老表写入的一致性
首先将写入新老表放在同一个事务里;在数据同步过程中,update更新数据时,先更新旧表,发现新表没有数据,但下一刻旧表数据又同步过来,导致数据的不一致。这时还需要一个定时任务进行对账,发现问题进行告警。
评论区