新旧库切换流程

新旧切换标准流程

前言

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

数据库迁移流程

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

1. 双写读旧

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

新旧库切换流程_第1张图片

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

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

新旧库切换流程_第2张图片

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

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

新旧库切换流程_第3张图片

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

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

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

开关配置:

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

新旧库切换流程_第4张图片

5. 双写,全量读新。

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

开关配置:

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

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

writeOldSwitch:true

新旧库切换流程_第5张图片

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

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

开关配置:

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

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

writeOldSwitch:false

新旧库切换流程_第6张图片

接口迁移流程

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

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

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

开关配置:

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

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

    percentage:1

新旧库切换流程_第7张图片

3. 全量调用新接口

新旧库切换流程_第8张图片

4. 删除旧接口

新旧库切换流程_第9张图片

4、其他说明

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

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

你可能感兴趣的:(java)