新旧库切换流程

新旧切换标准流程

前言

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

数据库迁移流程

包含但不限于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、其他说明

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

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

在Elasticsearch中实现索引的切换,通常是指在创建新索引并完成数据迁移后,将应用的读写操作从旧索引迁移到新索引的过程。这个过程在Java中可以通过Elasticsearch的客户端来实现,例如使用Elasticsearch官方提供的Java High Level REST Client。以下是实现新旧索引切换的基本步骤: 1. 创建新索引:首先,在Elasticsearch中创建一个与旧索引结构相似的新索引,并配置好相应的映射和设置。 2. 数据迁移:将旧索引中的数据同步到新索引中,这可以通过Elasticsearch的Reindex API完成,或者通过Java客户端编写相应的数据迁移代码来实现。 3. 滚动更新(可选):在数据迁移过程中,为了保证服务的连续性,可以使用滚动更新的技术来确保数据的一致性。在这个过程中,应用会同时向旧索引和新索引发送读写请求。 4. 切换别名:一旦新索引中的数据完整并且与旧索引一致,可以通过修改索引的别名来完成切换。在Elasticsearch中,可以给索引分配别名,应用可以指向这个别名来执行读写操作。切换别名的过程通常是原子性的,可以通过Elasticsearch的Alias API来实现。 5. 删除旧索引:在确认新索引已经正常工作后,可以删除旧索引以释放资源。 具体到Java代码实现,可以使用类似下面的伪代码来完成: ```java // 创建客户端连接到Elasticsearch集群 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); // 创建新索引 CreateIndexRequest createIndexRequest = new CreateIndexRequest("new_index"); client.indices().create(createIndexRequest, RequestOptions.DEFAULT); // 执行数据迁移 // ... // 添加别名到新索引 AddAliasRequest addAliasRequest = new AddAliasRequest("new_index", "my_alias"); client.indices().addAlias(addAliasRequest, RequestOptions.DEFAULT); // 移除旧索引的别名 RemoveAliasRequest removeAliasRequest = new RemoveAliasRequest("old_index", "my_alias"); client.indices().removeAlias(removeAliasRequest, RequestOptions.DEFAULT); // 删除旧索引 DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("old_index"); client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT); // 关闭客户端连接 client.close(); ``` 在实现的过程中,要确保处理好异常情况,并且在切换前后做好数据的一致性校验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值