当前位置: 首页 > news >正文

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

大家好,我是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

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

http://www.jsqmd.com/news/681017/

相关文章:

  • ArrayList遍历时移除元素
  • 338微机原理-基于8086多种花色花式跑马灯五种
  • 2026年北京骑行租车年度排名,北京团建骑行活动租车靠谱的品牌推荐 - mypinpai
  • 2026年全国口碑好的肉制品企业排名,跨区域农贸市场供货选哪家 - 工业推荐榜
  • 3步掌握FakeLocation:为Android应用设置独立虚拟定位的完整指南
  • 中兴光猫工厂模式开启神器:3步解锁隐藏管理权限,告别普通用户限制
  • 告别音乐枷锁:3分钟掌握ncmdump解锁网易云音乐NCM格式
  • 339微机原理-基于8086毫秒数码管计时器仿真设计
  • 2026年口碑好的做耐磨损斜圈弹簧触指的品牌,排名情况 - 工业品网
  • 从英文困惑到中文畅玩:Degrees of Lewdity中文版完整入门手册
  • 别再踩坑了!UniApp + Vue3 开发微信小程序,WebSocket真机调试的完整避坑指南
  • OBS多平台同时推流:如何通过开源插件实现高效直播分发?
  • TranslucentTB开机自启动破解指南:彻底告别手动启动的烦恼
  • 2026年全国口碑好的肉制品企业推荐,学校食堂食材配送合作之选 - myqiye
  • 如何高效配置OBS多平台直播:obs-multi-rtmp完全实战指南
  • 340微机原理-基于8086火炉温度控制系统电路设计
  • 实用三步轻松实现Mac微信防撤回:完整保护重要信息不消失
  • 【2026年版|建议收藏】大模型学习路线:小白/程序员零基础入门,避开坑直奔高薪
  • 2026年3月工业厂房搭建服务商推荐,工业厂房搭建/做工业厂房/拆除重建工业厂房/搭建工业厂房,工业厂房搭建服务商推荐 - 品牌推荐师
  • 30 秒开启!Brex 开源 CrabTrap,以大语言模型保障 HTTP 代理安全
  • 5个核心功能全面解析:第七史诗自动化助手终极使用指南
  • 探寻2026年适合学校食堂的能锁鲜的肉制品供应商 - mypinpai
  • 美团与中科院GENERAL365:常识推理测试揭示顶尖AI模型仅获62分
  • RimSort:终极免费RimWorld模组管理器,彻底告别模组冲突烦恼
  • Universal x86 Tuning Utility:终极免费工具,一键解锁Intel/AMD处理器隐藏性能
  • TranslucentTB透明任务栏美化工具:5分钟实现Windows桌面个性化定制
  • 从Rhino到Blender:3D设计工作流的无缝桥梁搭建指南
  • 2026年做家庭聚餐肉制品的供应商推荐,哪家更靠谱 - 工业品网
  • 20世纪60年代UNIVAC计算机运行Minecraft服务器等程序,如何突破性能极限?
  • 别再只会用delay()了!用Arduino定时器中断实现OLED、电机、蓝牙多任务并行(附完整巡线小车代码)