如何用校验和做数据一致性巡检?
简化版
校验和巡检要对两侧同一稳定范围、同一逻辑快照的数据规范化后分桶计算 count、聚合值和哈希。 桶不一致时逐级细分,最终定位到主键与字段。 校验和只能发现差异,不能决定哪边正确;修复仍依赖权威源、版本和审计。
详细版
全表单一哈希无法定位问题,也容易形成大扫描。 通常按主键或时间分桶,在共同快照/水位下排序并规范化字段。 哈希前统一 NULL、字符编码、时区、小数精度和字段顺序。 发现差异后递归拆桶或用 Merkle Tree,只修复经权威规则确认的行。
完整版教学
一、比较范围必须相同
源库在 T1、目标库在 T2,期间仍写入时结果自然不同。 需要固定快照、共同 CDC 位点或业务截止水位。 还要明确比较原始行、逻辑实体还是派生聚合。
没有共同范围与时间边界,哈希不同只说明采样时刻不同。
二、规范化序列化
同值可能因编码和格式不同产生不同字节。 固定字段顺序、UTF-8、NULL 标记、时区、小数 scale 和集合排序。
canonicalRow = id | status | amount(scale=2) | version
rowHash = SHA-256(canonicalRow)
忽略目标库自行生成的更新时间等噪声字段。
三、分桶定位
| 粒度 | 用途 |
|---|---|
| 全局 count/sum | 快速筛查 |
| 主键范围桶 | 缩小范围 |
| 子桶/Merkle | 递归定位 |
| 单行字段 | 生成修复证据 |
一亿行按一万行每桶约有一万桶,可增量并行。
四、聚合哈希
按主键稳定排序后流式计算强哈希。 直接拼字符串会有字段边界歧义,应使用长度前缀或规范编码。 Merkle Tree 允许只比较变化分支。 XOR 等弱聚合可能抵消,只适合快速筛查。
五、增量巡检
首次全量建立基线,后续按更新水位扫描变化分区。 记录每桶 source/target checkpoint,失败可桶级恢复。 热点桶等待 CDC 超过允许传播时间再比较。 定期低频全量巡检补增量链路漏标。
六、差异下钻
桶不同后比较 count、最小最大主键和业务 sum。 递归拆分直到得到差异主键。 标注缺失、多余、字段不同或版本落后。 差异规模异常时暂停自动修复,先验证规则。
七、安全修复
哈希不能说明哪侧正确。 按 ownership、业务版本和状态机选择权威值。 修复使用幂等脚本、条件更新、灰度批次和前后复验。 保留任务、桶、旧新摘要、操作者与回滚信息。
八、常见误区与追问
- 误区:全表 MD5 不同就重刷目标。 必须先定位并确认权威源。
- 误区:count 相同代表一致。 内容错换时行数仍相同。
- 误区:直接 JSON 序列化即可。 键序、NULL 和精度可能不同。
- 误区:两边各查一次就是同一快照。 持续写入会制造假差异。
- 追问:大表如何降开销? 分桶、限速、只读副本和增量水位。
- 追问:Merkle Tree 有何用? 只下钻差异分支。
- 追问:哈希碰撞怎么办? 用强哈希,最终做字段级确认。
九、加强记忆
- 固定可比较范围和水位。
- 规范化字段和排序。
- 分桶计算聚合与强哈希。
- 差异下钻到主键和字段。
- 哈希负责发现,权威规则负责修复。