Java面试要点:库表同步、Binlog、MQ同步、补偿与一致性校验
前言
数据同步常见于搜索索引、缓存、报表、数据仓库、跨系统主数据分发。面试常问:
- 数据同步怎么保证不丢。
- 全量和增量怎么做。
- MQ 同步和 binlog 同步怎么选。
- 同步失败怎么补偿。
同步方案
| 方案 | 优点 | 缺点 |
|---|---|---|
| 应用双写 | 实现直观 | 容易不一致 |
| MQ 事件同步 | 解耦、可重试 | 依赖消息可靠性 |
| Binlog 同步 | 不侵入业务 | 解析和运维复杂 |
| 定时全量同步 | 简单兜底 | 延迟高、成本大 |
全量与增量
全量同步:
- 初始化数据。
- 修复历史差异。
增量同步:
- 日常实时或准实时同步。
- 依赖更新时间、版本号、binlog 或业务事件。
flowchart TD
A[源库] --> B[全量同步]
A --> C[增量同步]
B --> D[目标库/ES/数仓]
C --> D
D --> E[一致性校验]
MQ 同步
业务服务在数据变更后发布事件。
优点:
- 事件语义清晰。
- 下游解耦。
风险:
- 本地事务和消息一致性。
- 消费重复。
- 消费延迟。
常用本地消息表或事务消息兜底。
Binlog 同步
通过监听数据库 binlog 捕获变更。
优点:
- 对业务代码侵入低。
- 能捕获所有数据库变更。
缺点:
- 业务语义弱。
- 需要处理 DDL、字段映射、延迟和位点。
补偿与校验
同步系统必须有:
- 失败重试。
- 死信记录。
- 定时补偿。
- 数据对账。
一致性校验方式:
- 按主键抽样。
- 按更新时间扫描。
- 按总数和 hash 校验。
- 按业务批次校验。
高频面试题
应用双写最大问题是什么?
两个写操作不在一个原子事务里,可能出现一个成功一个失败。
Binlog 同步为什么语义弱?
因为 binlog 只知道数据变化,不一定知道业务意图,例如订单取消和退款可能都是状态字段变化。
同步失败怎么办?
重试、死信、补偿任务和对账校验。
全量同步期间增量变化怎么办?
通常先全量导入,再从记录的增量位点继续回放,最后做校验。
总结
数据同步的核心是全量初始化、增量捕获、失败补偿、一致性校验。企业里同步链路不能只看“能同步”,还要看能不能追踪、重试和修复差异。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Junly博客!
评论


