新旧切换标准流程
前言
随着业务壮大,我们系统涉及数据库迁移、接口切换迁移等等相关的工作越来越多。但在实际落地的操作过程中也发现了很多各种各样的问题,给系统稳定性造成了重大威胁。因此,根据之前的经验教训,总结出一个标准化的流程,后续大家按照标准流程操作执行。最大程度保障系统稳定性。 |
数据库迁移流程
包含但不限于MySQL、HBASE、MongoDB、Redis等。
1. 双写读旧
新库刚初始化还没有数据,所以要读取旧库,同时将增量数据写入新库。
2. 双写读旧,旧数据迁移到新。
双写读旧的同时,需要将旧库数据全量同步到新库。
3. 双写读旧,脚本校验新旧数据是否一致。
同步和双写阶段可以同时开启校验程序,查看新库旧库数据是否一致,方便及早发现同步或者双写的问题。
4. 双写,新旧共读,灰度读新(要能通过中台控制比例,由于发版周期太长,不能依赖使用配置文件去控制比例,不能直接全切,循序渐进慢慢放量)。
双写,灰度读阶段,可以通过配置文件或者中台配置,控制灰度进度,缓慢灰度,实现业务平稳过渡。
此处以订单为例,通过订单id,订单id后缀,用户id,用户id后缀实现不同维度的灰度。
开关配置:
# 开关配置 |
5. 双写,全量读新。
通过灰度读新,缓慢过度到全量读新
开关配置:
# 开关配置 #旧库写入,true开启,false关闭 writeOldSwitch:true |
6. 关闭旧写,写新读新,旧库/旧接口下线。
全量读新,观察一段时间,数据正常后需要取消旧库的写。
开关配置:
# 开关配置 #旧库写入,true开启,false关闭 writeOldSwitch:false |
接口迁移流程
接口迁移是指新建接口,将旧接口的调用迁移到新接口。
1. 流量重放,校验保障新接口跟旧接口100%一致。
2. 新旧同时调用,灰度调用新接口
开关配置:
# 开关配置 # 百分比(也可以设置比例控制访问新接口的比例,此处也可以设置万分之几,这样灰度粒度更小) percentage:1 |
也可以使用下面的配置
@Data public static class newSwitch{ //是否开启灰度,true是,false否 Boolean enable; //灰度基数,-1的时候默认为全部开启灰度 Integer divisor; //灰度比例 参数对divisor取余小于等于mod命中灰度 Integer mod; //白名单,优先判断白名单 List<String> whiteList; }
3. 全量调用新接口
4. 删除旧接口
4、其他说明
原则上,在公司内部服务的接口里,不应该存在接口迁移的工作。接口发生重构或者接口逻辑发生重大变更,应该由接口实现方内部闭环。接口内部自行灰度路由到新旧版本实现。对于调用方来说,是透明的。
对于第三方提供的接口,确实需要迁移接口的,才做接口迁移。