连载中 15/20

数据迁移(下):校验、切流与回滚预案

2026-07-25 · 2988 阅读 · 0 评论 · 0 赞

证明一致,而不是相信一致

上一篇的双写把新库追到了「延迟趋近于零」,但迁移工程到这里只能算半程——双写成功不代表数据一致:同步程序漏一条变更、转换逻辑错一个字段、双写重试丢一笔,都会造成两边数据的静默分叉。这种分叉平时看不出来,切流之后变成线上资损。所以校验阶段的目标只有一句话:用证据证明两边一致,而不是相信它一致

三道校验关

第一道:行数核对——最粗也最快,按表、按天、按分片分别 count 对比,五分钟找出大方向的窟窿;第二道:分块 checksum——按主键区间把数据切块,两边各算每块的字段拼接哈希(或直接用 MySQL 的 CRC32),块哈希不等就再二分缩小范围,最终定位到不一致的行。全程用主键区间分批,不锁表、可断点重跑;第三道:抽样比对——随机抽十万行做全字段逐项比对,checksum 查不出的语义差异(类型转换、精度、默认值)靠它兜底。三道关的产出是一份差异清单,差异要逐条归因:双写窗口内的正常延迟可忽略,转换 bug 要修程序,同步丢的要补数据——差异清零才准进入切流

灰度切流:先读后写,逐步放大

切流的精髓是每次只切一小步,每一步都观察、可回退。标准节奏四步:影子读——线上仍读老库,但同一请求并行读新库比对结果,只记日志不返回,跑一周统计差异率;白名单读——内部账号与灰度用户的读切到新库,坐监控看错误率与耗时;全量读——读流量全切新库,写仍双写、以老库为准;切写——写入口切到新库,老库降级为反向同步的从属(binlog 反向追,保持老库仍可用)。每一步之间留观察期,指标异常立即回退上一步。切流开关要做成配置中心热生效,秒级切换、秒级回退——回滚预案不是文档里的一段话,是一个真实的开关。

回滚的门要一直开着

切写之后最危险的操作是急着下线老库。老库必须保留到新库经受过完整业务周期的考验——大促流量、月度对账、批量任务全都跑过一遍,反向同步把新库的变更追回老库,保持老库随时可接管。这个观察期以周为单位计,期间任何回滚都是「把开关拨回去」的事。直到某一天,团队确认不再需要保险,才依次:停反向同步、老库转只读备份、归档下线。迁移项目的里程碑不是切流成功,是老库安全下线——前者只是把风险换了个位置,后者才算真正交割完成。

迁移讲完,工程主线还剩两块:分片环境下的表结构变更(几百张物理表怎么改)与日常治理(归档、监控、倾斜)。下一篇先解一个高频刚需——在线 DDL。

503

10 年全栈工程师 · 503咖啡馆主理人

#数据校验#checksum#灰度切流#回滚预案#影子读

评论 (0)

相关推荐

连载中 12/20

排查四件套:jstack、jmap、jstat、jcmd 的实战分工

jstack 看线程在干什么,jmap 看堆里装了什么,jstat 看运行时在变什么,jcmd 是统一入口。四把刀各管一段,配合着用没有查不动的现场。

#jstack#jmap#jstat#jcmd#排查工具
2026-09-16 · 5 阅读 · 0 评论 · 0 赞
连载中 11/20

GC 日志:把回收过程翻译成人话

一行 GC 日志里塞着七种信息:谁触发的、收了哪、停了多久、活了哪些。加上 -Xlog 配置,再加上日志分析工具,GC 不再是只能盯监控曲线的黑盒。

#GC日志#Xlog#日志分析#GC监控#Full GC排查
2026-09-16 · 13 阅读 · 0 评论 · 0 赞
连载中 10/20

ZGC:亚毫秒停顿是怎么炼成的

百 G 大堆停顿不到一毫秒,靠的是把搬家全部挪到并发阶段——着色指针让引用自带状态,读屏障让搬运中的对象依然可访问。代价是吞吐与内存,收益是停顿与堆大小解耦。

#ZGC#着色指针#读屏障#亚毫秒停顿#分代ZGC
2026-09-15 · 8 阅读 · 0 评论 · 0 赞