大规模数据迁移如何巡检:分片校验、限流与幂等修复
大规模迁移的难点是证明源端和目标端在同一水位可比。按稳定键切片,先比行数、范围和规范化哈希,再对异常切片下钻。
先定义校验口径
在开始前确定:哪个时间点或水位表示“可比”、删除记录如何表达、时区和精度如何统一、字段转换如何处理空值。双写或 CDC 期间还要把延迟纳入判断,不能把尚未追平的数据当作差异。
哈希是筛选器,不是证明
对每个切片同时比较行数、主键范围和规范化后的聚合哈希。哈希不一致时再查具体行;哈希一致也要定期抽样验证校验 SQL 自身没有遗漏字段。表名和字段名不能由外部输入直接拼接,动态对象应先经过白名单校验。
| 方法 | 适用位置 | 代价与限制 |
|---|---|---|
| 行数与范围 | 快速巡检 | 发现不了内容差异 |
| 切片汇总哈希 | 主体校验 | 需要统一排序、类型和空值规则 |
| 逐行比对 | 异常切片 | 成本高,应按需执行 |
| 抽样 | 持续观察 | 不能替代主体校验 |
限流与修复分开
校验任务必须能根据源端和目标端负载降速或暂停。修复任务不要与发现任务自动绑定:先记录差异、确认产生原因,再执行幂等修复,并对修复后的切片重新校验。
def should_pause(cpu_percent: float, replication_lag_s: float) -> bool: return cpu_percent > 75 or replication_lag_s > 30阈值应从服务容量和 SLO 反推,并在配置中注明来源。巡检输出只保留切片编号、汇总结果和必要的脱敏摘要,避免把业务行数据写入日志。