前言

数据同步常见于搜索索引、缓存、报表、数据仓库、跨系统主数据分发。面试常问:

  • 数据同步怎么保证不丢。
  • 全量和增量怎么做。
  • 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 只知道数据变化,不一定知道业务意图,例如订单取消和退款可能都是状态字段变化。

同步失败怎么办?

重试、死信、补偿任务和对账校验。

全量同步期间增量变化怎么办?

通常先全量导入,再从记录的增量位点继续回放,最后做校验。

总结

数据同步的核心是全量初始化、增量捕获、失败补偿、一致性校验。企业里同步链路不能只看“能同步”,还要看能不能追踪、重试和修复差异。