阶段一:迁表阶段(双写读旧)
步骤一:
将所有写操作加上日志,打印出 所需迁表a的主键id,供之后补偿使用。
开发补偿功能,根据ID,将old 数据与new数据同步。注:在业务低峰期对表进行操作,减少风险及补偿的开销。
步骤二:
将 old表 数据同步到 new表 中。
注:建议dba进行同步,dba同步只能对空表进行同步,但速度快,数据量大,RD同步数据困难切慢,BI同步数据为前一天的数据,不可用。
步骤三:
双写操作,所有写操作同时写入 new表 与 old表 中。
注:开发之前需统计所有写入表操作,最好将写入操作收口,做不好会导致新旧表数据不同步,前功尽弃。
步骤四:
使用步骤一中开发的补偿功能,将上线这段时间的数据 同步的修复一下,保持 old表 与 new表中的数据一致性。
注:insert操作还好,new表不存在时可同步old表,update操作需要做补偿,尤其是当本次更新需要依赖上一次更新状态时,数据同步是个问题。
总结:
至此,数据同步完成,old表 与 new表 数据保持一致,已实现双写读旧操作,上线两次,分别为打印日志操作上线和双写操作上线,数据同步两次,分别是DBA同步新表数据及修复上线过程中更新的数据。
此时线上的读操作全为 读旧,需逐步整理出来,提供新的查询接口。
注意实现及风险:
步骤三中的双写使用同步双写,禁止使用异步双写。
对表进行写入操作的地方,加数据源,尽量不对逻辑做改动。
若表 写操作过多,打印日志需注意覆盖所有写操作及日志规范,尽量覆盖到所有写操作中。
可以开发新功能,对比new与old数据是否同步。
尽量选择业务低峰期,进行迁表操作。
阶段二:切表阶段(双写读新)
步骤一:
与迁表操作同步进行,各业务线统计协助统计 表 使用情况,包括调用接口,传入参数或sql。
步骤二:
(依赖第一阶段及第二阶段步骤1)将统计出现有的old表 接口中,分辨出有哪些接口是现在业务线正在使用的,在不影响线上功能的情况下,对不合理的接口进行重构,避免传入sql操作,做到接口功能明确,功能单一。
步骤三:
对业务线进行新表新接口切换,陆续开发并推进切换新接口,在所有业务线平滑的切换新接口完成后,下线双写操作,只保留写新读新。此时 表迁表完成。
欢迎关注订阅微信公众号,程序员的压哨绝杀,一起分享生活工作中的见闻趣事。