数据同步方案
概述
数据同步是数据中台的地基:从业务库到数仓、从数仓到湖、从 A 库到 B 库。核心决策是全量还是增量、离线还是实时、异构怎么映射、断点如何续传。本文给出完整方案与决策依据。
一、同步类型
| 类型 | 说明 |
|---|---|
| 全量同步 | 一次性搬全部数据 |
| 增量同步 | 持续同步变更 |
| 离线同步 | 定时批量 |
| 实时同步 | 持续低延迟 |
组合:
初始化:全量
持续:增量
批量:离线
低延迟:实时二、全量同步 vs 增量同步
2.1 全量同步
场景:初始化、小表、一次性迁移
方式:整表读取 → 覆盖目标| 优点 | 缺点 |
|---|---|
| 简单 | 数据量大耗时长 |
| 完整 | 频繁执行贵 |
| 适合小表 | 影响源库 |
触发:
首次建立
数据修正(全量覆盖)
小表定期2.2 增量同步
场景:持续变更
方式:CDC(binlog)/时间戳轮询| 优点 | 缺点 |
|---|---|
| 实时 | 依赖日志/列 |
| 量小 | 实现复杂 |
| 持续 | 删除难(轮询) |
2.3 选型
| 条件 | 方案 |
|---|---|
| 首次 | 全量 |
| 持续 | 增量 |
| 数据修正 | 全量覆盖 |
| 混合 | 全量+增量 |
全量+增量经典:
DataX 全量初始化
Canal/Debezium 增量续传三、离线同步 vs 实时同步
3.1 离线同步
定时批量:
天级/小时级任务
工具:DataX/SeaTunnel/Sqoop| 优点 | 缺点 |
|---|---|
| 稳定 | 延迟高 |
| 大吞吐 | 非实时 |
| 简单 | 需调度 |
3.2 实时同步
持续低延迟:
CDC → Kafka → 下游
工具:Canal/Debezium/Flink CDC| 优点 | 缺点 |
|---|---|
| 低延迟 | 复杂度高 |
| 持续 | 需运维 |
| 新鲜 | 成本 |
3.3 选型
| 场景 | 方案 |
|---|---|
| 日报表 | 离线 |
| 实时大屏 | 实时 |
| 数仓 T+1 | 离线 |
| 湖仓实时 | 实时 |
四、异构数据源映射
4.1 问题
源库 → 目标库:
类型不同(MySQL int → Oracle number)
结构不同(表/字段)
语义不同(编码/枚举)4.2 映射处理
| 映射 | 说明 |
|---|---|
| 类型映射 | 源类型 → 目标类型 |
| 字段映射 | 源列 → 目标列 |
| 转换 | 函数转换 |
| 过滤 | 条件过滤 |
| 默认值 | 缺失补值 |
映射配置(DataX/SeaTunnel):
reader(源)→ 字段定义
writer(目标)→ 字段定义
中间转换规则4.3 类型映射示例
| MySQL | Hive | 说明 |
|---|---|---|
| int | int | 直接 |
| bigint | bigint | 直接 |
| varchar | string | 兼容 |
| datetime | timestamp | 兼容 |
| decimal | decimal | 精度 |
映射原则:
兼容优先
显式转换(长类型)
值校验五、断点续传
5.1 问题
同步中断(网络/故障):
全量重来 → 浪费
增量重放 → 重复5.2 机制
记录同步位点(checkpoint):
已同步位置 → 重启从位点继续| 方式 | 说明 |
|---|---|
| 全量 | 分片 + 已同步片 |
| 增量 | binlog 位点 |
| 离线 | 时间戳/主键 |
全量断点:
数据按主键分片
每片完成记录
恢复 → 未完成片重试增量断点:
记录 binlog 位点
恢复 → 从位点续传
防重复(幂等)5.3 幂等保障
| 手段 | 说明 |
|---|---|
| 唯一键 | 目标去重 |
| 覆盖 | 主键覆盖写 |
| 事务 | 批量原子 |
六、同步链路设计
6.1 典型链路
业务库 → CDC → Kafka → 数仓/湖(实时)
↘ DataX 全量 → 数仓(初始化)
数据同步分层:
贴源层(原样)
清洗层(映射转换)
模型层(数仓模型)6.2 一致性
| 保障 | 说明 |
|---|---|
| 全量校验 | 行数/汇总比对 |
| 增量对账 | 条数/金额 |
| 延迟监控 | 位点差距 |
七、工具选型
| 场景 | 工具 |
|---|---|
| 全量离线 | DataX / SeaTunnel / Sqoop |
| 实时增量 | Canal / Debezium / Flink CDC |
| 全量+增量 | 组合 |
| 多源多目标 | SeaTunnel |
| 工具 | 定位 |
|---|---|
| DataX | 离线批量 |
| SeaTunnel | 离线+流式 |
| Flink CDC | 实时数仓 |
| Canal | MySQL 实时 |
| Debezium | 多库实时 |
八、最佳实践
| 实践 | 说明 |
|---|---|
| 全量+增量 | 初始化 + 续传 |
| 幂等设计 | 可重放 |
| 断点续传 | 分片/位点 |
| 类型映射 | 显式规则 |
| 监控对账 | 保障质量 |
| 增量优先 | 减少全量 |
常见问题速查
| 问题 | 要点 |
|---|---|
| 全量还是增量 | 场景(初始化 vs 持续) |
| 离线还是实时 | 延迟要求 |
| 异构怎么映射 | 显式转换规则 |
| 中断怎么办 | 位点续传 |
| 重复怎么办 | 幂等 |