很多企业的数据同步,刚开始其实都不复杂。
一个MySQL订单库,同步到数仓,写个任务就能解决。
但系统一多,事情很快就变了。
ERP、CRM、MES、WMS、财务系统分散在不同数据库里,旁边还可能有API、Excel、CSV和各种国产数据库;有的数据一天更新一次,有的数据每秒都在变化。
这时候你会发现,真正难的已经不是:
“能不能把数据同步过去?”
而是:
这么多来源怎么统一接?
全量、增量、实时到底怎么选?
几亿历史数据怎么平滑切到实时?
任务跑成功了,怎么确认数据真的没漏?
很多数据同步项目最后越来越复杂,并不是某一个功能做不了,而是接入、同步、切换、监控、恢复被拆散在不同脚本、不同任务和不同系统里,维护成本越滚越高。
如果你最近正在做数据集成、数据同步或者数仓建设,可以参考这套《数字化全链路落地资料》。里面把数据源接入、同步开发、任务管理等内容放在一套完整的数据集成框架里,配合实际项目来看,更容易把整条链路梳理清楚。
需要自取:https://s.fanruan.com/tyac0(复制到浏览器)
接下来就从最容易被忽略的第一步开始:
数据源越来越多以后,为什么“能连接”还远远不够?
一、数据源越多,越要先把“连接方式”统一起来
很多企业的数据同步体系,都是一点点堆出来的。
最开始只有一个MySQL订单库。
写个脚本,数据就能进数仓。
后来Oracle里的财务数据也要接进来,再开发一个任务。
接着SQL Server、PostgreSQL、接口、文件、国产数据库陆续出现。
几年以后,很容易变成:
订单同步是一套程序;
财务数据是一套脚本;
接口单独维护;
文件还需要人工上传。
表面上看,所有数据都“接进来了”。
实际上,底层已经变成很多套互不相同的连接方式。
这时候真正麻烦的,不是第一次开发。
而是后面的维护。
某张表突然没数据,不知道应该查哪个任务;
源系统改了字段,不确定会影响哪些下游;
新系统一上线,又要重新搭一条链路。
所以数据源接入真正需要解决的,不只是“支持多少数据库”,而是能不能把不同来源放到同一个体系里管理。
数据库、接口、文件等来源先统一接入,后面的同步、加工、调度、输出才能继续统一。
原来散落在MySQL脚本、Oracle任务、接口程序里的连接关系,放进FineDataLink 5.0后可以集中到同一套数据集成环境中,再根据具体业务配置后续同步链路。以后增加新的系统,也不用每次都从“怎么把数据取出来”重新开始。
真正省下来的,往往不是第一次开发的几个小时。
而是半年、一年以后,企业依然能够回答两个问题:
这份数据从哪里来?
现在又流向了哪里?
数据源多并不可怕。
真正危险的是:
每增加一个数据源,就增加一套新的技术孤岛。
二、全量、增量、实时,本来就不应该三选一
很多企业做同步方案时,经常先问一句:
到底应该用全量、增量,还是实时?
其实正常情况下,这三种方式一定会同时存在。
假设一张地区编码表只有5000条,一个月才调整几次。
每天凌晨全量覆盖一次,几秒钟就结束。
这种数据专门做CDC,反而增加开发和维护成本。
但换成一张已经有20亿条记录的交易表,情况完全不同。
假设每天真正变化的只有500万条。
如果为了得到这500万条变化,每天重新读取20亿条数据,很快就会遇到三个瓶颈。
第一,源库压力越来越大。
大表反复全扫描,会持续消耗数据库CPU、IO和网络资源。
如果同步任务反过来影响生产系统,再快都没有意义。
第二,大量无效数据被重复搬运。
20亿条数据里,真正变化的可能只有很小一部分。
其余数据每天重复读取、重复传输、重复写入,纯粹是在浪费资源。
第三,同步窗口越来越长。
一开始凌晨1点跑到3点。
数据不断增长以后,可能拖到早上七八点。
业务已经上班,昨天的数据还没同步完。
这时候才真正需要增量同步。
再往前一步,如果同步的是支付状态、库存扣减、设备告警、实时风控,小时级增量可能依然不够。
这类数据才需要CDC或者实时同步。
所以更合理的判断方式其实很简单:
数据量小、变化少、时效要求低——全量。
数据量大、有稳定变化标识——增量。
变化频繁、业务需要快速感知——CDC或实时。
这里最重要的一个问题是:
业务到底允许数据晚多久?
5秒、5分钟、5小时,背后对应的是完全不同的技术复杂度、资源成本和运维方式。
因此,成熟的数据架构不会为了“实时”两个字,把所有数据都改造成实时任务。
真正应该追求的是:
同步频率和业务价值匹配。
三、大表真正难的,是“全量切增量”这一刻
很多人第一次做CDC时,会觉得:
监听数据库日志,后面的变化实时同步,不就行了吗?
问题是,如果订单表里已经有5亿条历史数据呢?
从今天开始的变化可以监听。
前面5亿条还是得先搬过去。
所以大表上线通常会经历两个阶段:
历史全量 → 持续增量。
真正容易出问题的,是中间的切换点。
假设凌晨1点开始跑历史全量,到凌晨5点才结束。
这4个小时里,生产库并不会停。
订单仍然在新增,状态仍然在更新,数据还可能被删除。
如果凌晨5点才开始读取增量,那么1点到5点之间发生的变化,就可能出现缺口。
但如果增量读取位置放得太早,同一批数据又可能被全量和增量同时写进去。
所以大表同步真正要设计的是:
全量从哪个状态开始?
增量从哪个位置读取?
两条链路重叠的数据怎么处理?
切换以后怎么确认没有重复和遗漏?
MySQL里可能涉及Binlog位点、GTID,Oracle可能涉及SCN。
技术实现不同,本质上都在解决同一个问题:
历史状态和后续变化必须连续。
到了这种场景,再把历史迁移和实时同步做成两套完全割裂的程序,后期很容易出现边界对不上。
在FineDataLink 5.0的数据管道里,可以把已有存量数据和后续持续变化衔接在一条同步链路中处理。项目真正需要盯紧的重点,也就能从“维护两套程序”转到切换边界、同步进度以及最终对账这些更关键的问题上。
这里还有一个动作经常被忽略:
切换完成以后,一定要重新对账。
至少检查三类内容:
总行数有没有明显差异;
切换时间附近有没有数据断层;
主键、金额、状态等关键字段有没有异常。
因为实时任务已经启动,只能证明:
后续变化正在被捕获。
它不能证明:
前面的5亿条历史数据一定完整。
四、增量同步最危险的,不是慢,而是悄悄漏数据
很多团队自己做增量任务时,会写一个非常常见的条件:
update_time > 上次同步时间
看上去很合理。
但真正跑起来,时间边界特别容易出问题。
假设任务在10:00开始读取,到10:03才真正完成。
期间某条事务因为提交延迟,或者不同系统之间时间精度不一致,就有可能掉进两次同步之间的缝隙。
所以更稳妥的做法,通常会设置一个重叠窗口。
上一批同步到10:00。
下一批可以从9:58重新读取,再利用主键或者唯一键去重。
宁可多读一小段,也尽量不要留下同步空洞。
第二个坑,是只识别“新增”。
真实业务里的数据变化至少有三种:
INSERT:新增订单。
UPDATE:订单从待支付变成已支付。
DELETE:源系统删除记录。
如果增量逻辑只会识别新增数据,目标库和源系统一定会越来越不一致。
还有一个更容易被低估的问题:
Schema Change。
业务表不会永远保持上线第一天的结构。
今天增加优惠金额字段;
明天增加会员等级;
后天把INT改成BIGINT;
过段时间又调整字段长度。
这时候最危险的状态甚至不是任务直接报错。
而是:
任务每天都是绿色的,新字段却一直没有进入下游。
所以实时链路真正面对的,从来不只是“数据变了”。
还包括:
表结构也会变。
到了长期运行阶段,FineDataLink 5.0的实时管道面对的同样是源端持续发生的增、删、改变化,以及业务表结构调整后链路怎么继续运行的问题。同步任务不能只记住上线第一天的表结构,而要尽量跟得上源系统本身的变化。
所以判断一条同步链路是否成熟,不能只问:
“今天有没有跑成功?”
还要继续问:
“半年以后源表已经改了很多次,它还能不能继续跑?”
数据同步真正难的地方,就在这里。
不是把变化捕获一次。
而是长期、持续地捕获变化。
五、任务显示“成功”,只能证明它跑完了
这是数据同步里最容易产生错觉的一件事。
很多企业每天看同步任务,只看一个东西:
是不是绿色。
如果任务成功,就默认数据正常。
但实际项目里完全可能出现这样的情况:
任务正常运行;
数据一直在写入;
日志没有明显报错;
目标库却已经少了几十万条数据。
所以同步监控不能只看任务有没有成功。
至少应该分成三个层次。
第一层:技术层
看任务状态、运行时间、连接情况、读取速度、写入速度、数据积压。
它回答的是:
链路有没有正常运行?
第二层:数据层
比较源端和目标端的记录数、主键数、关键字段和某个时间区间里的增量数量。
它回答的是:
数据有没有少、有没有重复?
第三层:业务层
继续比较订单金额、库存余额、客户数量、销售额等关键业务指标。
它回答的是:
数据传过来了,业务结果到底对不对?
100万条订单同步成99万条,很容易发现。
但100万条订单全部都在,其中1万条金额字段发生异常,只看行数根本看不出来。
这也是为什么真正的数据一致性校验,最好至少做到三层:
技术对账、数据对账、业务对账。
任务只有十几条的时候,工程师还能逐个翻日志。
但同步链路扩展到几百甚至上千条以后,再靠人一条一条检查,基本不现实。
这时候,FineDataLink 5.0里的任务状态、执行记录和同步链路都集中在同一套环境中,排查问题时至少可以顺着任务继续往下找,而不是重新去问“这张表到底是哪台服务器上的哪个脚本传过来的”。
任务越多,这种差异越明显。
因为真正成熟的数据同步体系,追求的并不是永远不出故障。
更重要的是:
异常能发现。
位置能定位。
任务能恢复。
结果能验证。
稳定并不意味着系统永远不会失败。
而是:
失败以后,系统知道发生了什么,团队也知道接下来怎么处理。
六、选数据同步工具,真正应该问这6个问题
如果你最近正在做数据同步选型,与其一上来数功能,不如直接拿下面六个问题去问。
数据源接进来以后,能不能统一管理?
不要只看支持多少种数据库。
真正要看的是数据库、接口、文件等来源接进来以后,会不会继续形成几套彼此割裂的技术体系。
不同数据能不能使用不同同步策略?
全量、增量、CDC、实时,本来就应该同时存在。
同步方式应该根据数据规模、变化频率和业务时效决定。
大表第一次上线怎么处理?
几亿甚至几十亿历史数据怎么初始化?
初始化过程中发生的新变化怎么接?
全量和增量之间如何平滑切换?
很多时候,这比“支不支持CDC”更考验方案成熟度。
增删改和表结构变化怎么办?
如果只能处理新增数据,真正能够覆盖的业务场景其实非常有限。
企业长期运行以后,更新、删除、增加字段、修改字段类型都会出现。
任务中断以后怎么恢复?
数据库重启、网络闪断、目标端异常都很正常。
真正要问的是:
恢复以后,是继续从断点跑,还是几亿条数据重新来一遍?
两者的运维成本完全不同。
最后怎么证明数据真的同步对了?
任务成功,只能证明任务执行完。
真正可信的数据链路,还要继续做技术、数据、业务三个层面的校验。
你会发现,一套真正能长期运行的数据同步体系,其实可以浓缩成四句话:
数据接得进来。
变化识别得准。
同步持续跟得上。
出了问题还能管得住。
很多企业前期只解决了第一句。
等数据量增长、系统变多、实时需求越来越高以后,后面三个问题才会慢慢变成真正的成本。
结语
数据同步看起来只是数据建设里很基础的一环,但它实际上决定了后面所有数据应用的可信度。
订单少同步10万条,销售分析就会偏。
库存晚半小时,业务看到的就是旧状态。
客户数据重复,画像和指标都会受到影响。
源表已经增加了字段,下游却毫无感知,再漂亮的经营看板也可能建立在错误的数据上。
所以做数据同步时,真正应该问的早就不只是:
“数据能不能从A搬到B?”
还应该继续追问:
数据越来越大以后还能不能稳定跑?
系统越来越多以后还能不能统一管理?
业务系统持续变化以后,链路还能不能跟上?
出了问题以后,能不能快速发现、恢复和验证?
这些问题都解决以后,数据同步才真正从一次性的“搬数据”,变成能够长期支撑数仓、BI以及后续数据应用的一层基础设施。