首页 > 基础资料 博客日记

架构师必备:如何做业务数据的平滑迁移

2026-04-22 09:00:04基础资料围观1

极客资料网推荐架构师必备:如何做业务数据的平滑迁移这篇文章给大家,欢迎收藏极客资料网享受知识的乐趣

大家好,我是Java烘焙师。本文结合笔者的经验和思考,对业务数据迁移做个总结。在业务系统迭代的过程中,难免会做数据迁移,可能是因为:

  • 业务模型变更:实体关系变了
  • 或者存储结构变更:字段从DB迁移到HBase等NoSQL存储、或做文本压缩、或修改数据聚合粒度等

业务数据迁移,需要改持久化层基础代码,还涉及到存量数据迁移,因此风险较高,容易出现新旧数据不一致。为了实现平滑迁移(不影响、不中断业务),各步骤都要做好灰度切换、数据/监控对比。注:本文讨论的是业务数据迁移,如果是分库分表迁移,可以借助类似Canel的中间件。
下面总结了一套标准流程SOP,步骤如下。

1. 增量双写

  • DB迁移场景:写旧表+写新表,放在同一个事务内,即可保证一致性
  • 跨DB、或从DB迁移到其它NoSQL存储场景:先写旧表,再写新表,在写失败时做好兜底重试
    image

2. 刷存量数据

在增量双写灰度开全后,能确保新写入的数据在新表、旧表一致,但还需要补刷历史存量数据。
离线导出全量数据的业务id,查旧表、并写新表,确保所有存量数据的新表字段都写入值。
image

3. 数据全量比对,确保新旧一致

有两种比对方式:

  • 复用上述刷数据任务,通过开关控制,仅做比对、不刷数据
  • 离线对账,参考之前写的文章:[架构师必备:实时对账与离线对账](https://www.cnblogs.com/toplist/p/19009976 =360x)

sql示例:

-- (1)比较两个表的条数是否一致
select count(1) from table_a; -- 查出左表的条数
select count(1) from table_b; -- 查出右表的条数

-- (2)比较数据内容是否一致
-- (2.1)只存在于左表的数据:左连接查询,左表记录都会保留,右表字段为空则说明右表缺少数据:
select * from
table_a left outer join table_b
on table_a.biz_field=table_b.biz_field
where table_b.biz_field is null;

-- (2.2)只存在于右表的数据:右连接查询,右表记录都会保留,左表字段为空则说明左表缺少数据:
select * from
table_a right outer join table_b
on table_a.biz_field=table_b.biz_field
where table_a.biz_field is null;

-- (2.3)两个表存在差异的数据,内连接查询,比对各个字段是否一致:
select * from
table_a inner join table_b
on table_a.biz_field=table_b.biz_field
where
(table_a.field_1 <> table_b.field_1
or table_a.field_2 <> table_b.field_2
or table_a.field_3 <> table_b.field_3);

4. 增量双读比对

上述全量比对,只代表存量数据的一致性,还要确保增量数据也是一致的。
在所有查询场景中,同时读旧表、新表,并做比对。为了避免遗漏,可做到公共查询逻辑里。
image

5. 切新读

  • 双读比对观察一致后,查询场景灰度切换到读新表
  • 同时确保所有的离线依赖,都迁到新表数据源
    image

6. 停旧写

  • 在停写旧表之前,检查旧表已无在线业务方查询、无离线依赖
  • 最终停写旧表
    image

通过以上步骤,可以确保业务数据平滑迁移,做到风险可控。


文章来源:https://www.cnblogs.com/toplist/p/19828393
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云