新旧库切换流程

新旧切换标准流程

前言

随着业务壮大,我们系统涉及数据库迁移、接口切换迁移等等相关的工作越来越多。但在实际落地的操作过程中也发现了很多各种各样的问题,给系统稳定性造成了重大威胁。因此,根据之前的经验教训,总结出一个标准化的流程,后续大家按照标准流程操作执行。最大程度保障系统稳定性。

数据库迁移流程

包含但不限于MySQL、HBASE、MongoDB、Redis等。

1. 双写读旧

新库刚初始化还没有数据,所以要读取旧库,同时将增量数据写入新库。

2. 双写读旧,旧数据迁移到新。

双写读旧的同时,需要将旧库数据全量同步到新库。

3. 双写读旧,脚本校验新旧数据是否一致。

同步和双写阶段可以同时开启校验程序,查看新库旧库数据是否一致,方便及早发现同步或者双写的问题。

4. 双写,新旧共读,灰度读新(要能通过中台控制比例,由于发版周期太长,不能依赖使用配置文件去控制比例,不能直接全切,循序渐进慢慢放量)。

双写,灰度读阶段,可以通过配置文件或者中台配置,控制灰度进度,缓慢灰度,实现业务平稳过渡。

此处以订单为例,通过订单id,订单id后缀,用户id,用户id后缀实现不同维度的灰度。

开关配置:

# 开关配置
switchConfig:
  readNewSwitch:
    # 读新库开关,true:全量读写新从库,false:按照白名单读写新从库
    allSwitch: false
    # 订单白名单(属于白名单的数据读写新从库)
    orderIdWhite:
      - 1234
    # 订单后缀白名单(属于白名单的数据读写新从库)
    orderIdSuffixWhite:
      - 1
    # 用户白名单(属于白名单的数据读写新从库)
    userIdWhite:
      - 1234
    # 用户后缀白名单(属于白名单的数据读写新从库)
    userIdSuffixWhite:
      - 1

5. 双写,全量读新。

通过灰度读新,缓慢过度到全量读新

开关配置:

# 开关配置
switchConfig:
  readNewSwitch:
    # 读新库开关,true:全量读写新从库,false:按照白名单读写新从库
    allSwitch: false
    # 订单白名单(属于白名单的数据读写新从库)
    orderIdWhite:
      - 1234
    # 订单后缀白名单(属于白名单的数据读写新从库)
    orderIdSuffixWhite:
      - 1
    # 用户白名单(属于白名单的数据读写新从库)
    userIdWhite:
      - 1234
    # 用户后缀白名单(属于白名单的数据读写新从库)
    userIdSuffixWhite:
      - 1

#旧库写入,true开启,false关闭

writeOldSwitch:true

6. 关闭旧写,写新读新,旧库/旧接口下线。

全量读新,观察一段时间,数据正常后需要取消旧库的写。

开关配置:

# 开关配置
switchConfig:
  readNewSwitch:
    # 读新库开关,true:全量读写新从库,false:按照白名单读写新从库
    allSwitch: true
    # 订单白名单(属于白名单的数据读写新从库)
    orderIdWhite:
      - 1234
    # 订单后缀白名单(属于白名单的数据读写新从库)
    orderIdSuffixWhite:
      - 1
    # 用户白名单(属于白名单的数据读写新从库)
    userIdWhite:
      - 1234
    # 用户后缀白名单(属于白名单的数据读写新从库)
    userIdSuffixWhite:
      - 1

#旧库写入,true开启,false关闭

writeOldSwitch:false

接口迁移流程

接口迁移是指新建接口,将旧接口的调用迁移到新接口。

1. 流量重放,校验保障新接口跟旧接口100%一致。

2. 新旧同时调用,灰度调用新接口

开关配置:

# 开关配置
switchConfig:
  newSwitch:
    # 读新库开关,true:全量读写新从库,false:按照白名单读写新从库
    allSwitch: false
    # 用户白名单(假设参数里面带有userId,或者driverId等比较有区分度的字段,可以使用此字段的白名单)
    userIdWhite:
      - 1234
    # 用户后缀白名单(可以根据后缀实现不同的灰度)
    userIdSuffixWhite:
      - 1

    # 百分比(也可以设置比例控制访问新接口的比例,此处也可以设置万分之几,这样灰度粒度更小)

    percentage:1

也可以使用下面的配置

@Data
public static class newSwitch{
    //是否开启灰度,true是,false否
    Boolean enable;
    //灰度基数,-1的时候默认为全部开启灰度
    Integer divisor;
    //灰度比例 参数对divisor取余小于等于mod命中灰度
    Integer mod;
    //白名单,优先判断白名单
    List<String> whiteList;
}

3. 全量调用新接口

4. 删除旧接口

4、其他说明

原则上,在公司内部服务的接口里,不应该存在接口迁移的工作。接口发生重构或者接口逻辑发生重大变更,应该由接口实现方内部闭环。接口内部自行灰度路由到新旧版本实现。对于调用方来说,是透明的。

对于第三方提供的接口,确实需要迁移接口的,才做接口迁移。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值