1. 同步策略概述:为什么需要数据同步?快照与增量的核心概念对比

1.1 我们为什么要聊数据同步?

说实话,我入行头两年,觉得数据同步这事儿特简单。

不就是把数据从 A 库搬到 B 库吗?写个定时任务,全量导一遍,完事。直到有一次,我在一家电商公司做数据平台重构。业务方要求每天凌晨 3 点前必须看到前一天的全量订单数据。我当时图省事,直接写了个 SELECT * FROM orders 然后全量覆盖目标表。

结果呢?

订单表 2 亿行,全量跑了 4 个多小时。凌晨 3 点的 SLA 从来没达成过。更惨的是,有一次跑了一半源库连接超时,目标表里数据不完整,第二天运营出的报表全是错的。老板拍桌子,我差点背了 P0 事故。

从那以后我明白了一个道理:数据同步不是“搬砖”,而是“绣花”。你选什么策略,直接决定了系统的稳定性、时效性和成本。

核心观点:数据同步的本质是在“数据一致性”和“同步效率”之间找平衡。没有银弹,只有最合适的策略。

1.2 快照同步:简单粗暴,但代价不小

快照同步,说白了就是“全量复制”。

每次同步时,把源端的数据全部读出来,然后覆盖或重建目标端的数据。就像给你的数据库拍一张“定妆照”,每次同步都重新拍一张。

它的工作流程大致是这样:

  1. 锁定源表(或开启事务快照),防止同步过程中数据被修改。
  2. 全量读取所有数据行。
  3. 清空目标表。
  4. 将全量数据写入目标表。
  5. 释放锁。

听起来很直接,对吧?但代价也很直接。

维度 快照同步
数据量 每次传输全部数据,数据量 = 表大小 × 同步次数
源库压力 全表扫描 + 锁表,对 OLTP 系统极不友好
同步耗时 与数据量线性增长,TB 级表基本不可用
一致性 强一致(快照点),但窗口期数据丢失
实现复杂度 低,几乎无状态管理

我曾经踩过的坑:有一次用快照同步同步一个 500GB 的日志表,每次跑 2 小时。结果源库是 MySQL 主库,全表扫描导致 CPU 飙到 90%,业务接口超时率暴增。从那以后,我定了个规矩:生产环境主库严禁全表扫描做同步。

1.3 增量同步:只取所需,轻装上阵

增量同步的思路完全不同——它只同步“发生变化”的数据。

你想想看,一个 10 亿行的用户表,每天可能只有 1 万行数据在变动。如果每次都全量同步,99.99% 的数据都是重复劳动。增量同步就是只抓那 0.01% 的变化。

常见的增量同步实现方式:

  • 基于时间戳:记录 updated_at 字段,只同步大于上次同步时间的数据。
  • 基于版本号:每行数据维护一个递增版本号,同步时拉取版本号大于上次记录的数据。
  • 基于日志解析(CDC):解析数据库的 binlog、redo log 等,实时捕获变更事件。
  • 基于触发器:在源表上创建触发器,将变更记录写入变更表,然后同步变更表。
维度 增量同步
数据量 只传输变更数据,通常远小于全量
源库压力 低(时间戳索引扫描)或极低(CDC 异步读取)
同步耗时 秒级到分钟级,与变更量相关
一致性 最终一致,需处理乱序和重复
实现复杂度 高,需要维护偏移量、去重、幂等

我个人习惯:在业务初期,数据量小于 1000 万行时,我倾向于先用快照同步,简单可靠。当数据量突破 1 亿行,或者同步频率要求小于 10 分钟时,我会果断切换到增量同步。这个阈值是我在多个项目中验证过的经验值。

1.4 快照 vs 增量:一张图看懂核心差异

下面这张图是我自己画的一个对比框架,帮你快速建立直觉。

快照同步 vs 增量同步:核心流程对比 快照同步流程 ① 锁定源表 / 开启快照 ② 全量读取所有数据行 ③ 清空目标表 ④ 写入全量数据到目标表 ⑤ 释放锁 / 完成 增量同步流程 ① 记录上次同步偏移量 ② 读取变更日志 / 变更表 ③ 过滤出新增/修改/删除行 ④ 逐行或批量写入目标表 ⑤ 更新偏移量 / 完成 快照同步:数据量大、耗时长、源库压力大,但实现简单、一致性高

1.5 什么时候该用哪种?我的经验法则

没有的“好”与“坏”,只有“适合”与“不适合”。我根据自己的项目经验,总结了一个决策矩阵:

场景 推荐策略 理由
首次同步 / 全量初始化 快照同步 目标表为空,增量无从谈起,必须全量
小表(< 1000 万行)低频同步 快照同步 实现简单,维护成本低,全量耗时可接受
大表(> 1 亿行)高频同步 增量同步 全量无法满足时效性,必须增量
源库为 OLTP 主库 增量同步(CDC 优先) 避免锁表和全表扫描影响业务
需要实时或准实时同步 增量同步(CDC) 快照同步无法做到秒级延迟
数据一致性要求极高 快照同步 + 校验 增量同步的乱序和重复问题更难处理

我的建议:不要在一开始就追求“纯增量”。我见过太多团队,上来就搞 CDC,结果 binlog 解析搞了两个月,业务早就等不及了。正确的做法是:先用快照同步跑起来,再逐步演进到增量同步。先解决“有没有”,再解决“好不好”。

1.6 一个常见的误区

很多人觉得增量同步一定比快照同步好。其实不一定。

我记得有一次,一个同事非要用增量同步同步一个配置表——总共 200 行数据,每天变更不超过 5 行。他花了两天时间搭了一套 Debezium + Kafka 的 CDC 管道。结果呢?维护成本比全量同步高了 10 倍,而且因为配置表变更频繁,偶尔还会出现乱序导致数据不一致。

我后来跟他说:“200 行的表,全量同步 0.1 秒就搞定了,你折腾 CDC 图啥?”

嗯,这里要注意:技术选型不要炫技,要务实。

1.7 本章小结

  • 快照同步:全量复制,简单可靠,但数据量大时效率低、源库压力大。
  • 增量同步:只传变更,高效轻量,但实现复杂,需要处理乱序和重复。
  • 选型原则:小表用快照,大表用增量;首次用快照,后续用增量;OLTP 主库优先用 CDC 增量。
  • 最佳实践:先跑通,再优化。不要为了“技术先进”而过度设计。