前言
先问个扎心的问题。你上一次为了搬数据定凌晨的闹钟,是几点?
我猜是两三点。跑一个T+1抽取,把A库的数据导成文件灌进B库,第二天业务方来问"昨天的数对不上",你翻了半天日志才发现:抽取那会儿源库还在写,快照根本没打准。这种事干一次两次能忍,干一年,谁受得了。
所以这篇认真聊聊数据集成软件这个话题。主角是电科金仓的Kingbase FlySync,圈内一般叫它KFS。干嘛用的?一句话,专门负责让数据在不同数据库之间自己流动。金仓数据库生态里,管存储的是KingbaseES,管数据流转的就是它。
不抄手册,按"痛点、原理、动手、踩坑"的顺序掰开说。
定时ETL到底差在哪
数据孤岛这个词你肯定听腻了,但真到要打通的时候,麻烦一个接一个。
Oracle是十年前上的,SQL Server是并购带进来的,MySQL是互联网团队自己搞的,这两年信创又添了几套国产库。想把数据归到一处?光类型映射就够喝一壶。
批量抽取还特别招人恨。跑批那几个小时源库CPU被打满,业务方投诉报表卡,你解释"这是在做数据同步",人家不听。
至于增量识别,用时间戳字段吧,漏更新是家常便饭;上触发器吧,每次DML都多一跳,业务开发第一个跳出来反对。两头堵。
传统ETL和实时同步的差别,真不是"快一点慢一点",是干活方式完全两码事。我拉了个表,你对着自己的场景看:
| 对比维度 | 定时ETL / T+1脚本 | KFS实时同步 |
|---|---|---|
| 数据可见延迟 | 小时级,慢的天级 | 亚秒级,平均0.1秒上下 |
| 一致性怎么保证 | 任务重跑,对账靠人 | 事务保序,自带校验修复 |
| 源库压力 | 全表扫,高峰抢资源 | 读日志文件,占用很低 |
| 表结构变更 | 任务动不动报错 | DDL能同步加翻译 |
| 中断之后 | 从头再来 | 断点续传 |
说白了,ETL是定期搬家,实时同步是装根水管。水管铺好之后,容灾也好、分发也好、往数仓灌数也好,全指着这根管子吃饭。
KFS是个啥,能连哪些库
KFS是电科金仓的异构数据同步产品,说法直白点:对标OGG那一类国外数据集成软件,做国产化替代用的。场景覆盖同城异地容灾、数据库平滑迁移、数据集中共享分发、应用上云这些。一路迭代到现在,规模化交付了5000多套,在国产同步软件里算头部了。
选型第一关永远是"能连什么",连不上一切白搭。我把文档里的支持列表揉了揉,拣常见的给你:
| 数据源类别 | 源端 | 目标端 |
|---|---|---|
| 国外交易型库 | Oracle、SQL Server、MySQL/MariaDB、DB2、Informix | 同左 |
| 国产交易型库 | KingbaseES、达梦、GBase 8s、OceanBase、PolarDB、openGauss、Vastbase、AntDB、TDSQL | 同左 |
| 分析型/MPP库 | --- | Greenplum、ClickHouse、GBase 8a、华为DWS、KingbaseAnalyticsDB |
| 消息队列 | Kafka、RabbitMQ、RocketMQ | 同左,另有华为ROMA、东方通TongHTP |
| 大数据和NoSQL | --- | Hive、Hadoop、MongoDB、ES、FlinkCDC、StreamSets |
加起来30多种。做信创项目的朋友应该有体会:国外那些同步工具,好多压根不认国产库的日志格式,这一关就先出局了。
硬件和系统也都不挑。x86、AMD之外,鲲鹏、海光、龙芯、飞腾、申威、兆芯全适配;操作系统从麒麟、统信、欧拉到Windows、Linux、AIX。拓扑想怎么搭怎么搭,一对一、一对多、多对一、级联、双向都行,甚至跨网络隔离装置、跨单向光闸都能同步。听着夸张?政务和军工行业,这种网络环境多了去了。
它是怎么干活的:读日志,不查表
整个产品最核心的一个设计决定就一句话:直接解析数据库的物理事务日志,不碰业务表。
链路拆成三块看。
采集这步,KFS在源端装个Agent盯着REDO日志,Insert、Update、Delete一个都逃不掉。有个细节我觉得挺聪明:只解析已提交的事务,没提交的中间状态、回滚,直接跳过。好处两头都占------省了无效解析的算力,还顺带保证了源端没有的东西绝不会出现在目标端,不存在脏数据被带过去的可能。
中间那截叫KUFL(Kingbase Unified Format Log),统一格式的加密中间文件。你可以把它理解成蓄水池:不管源头是Oracle还是MySQL,进来全变成一个格式,异构转换那点麻烦事全被这层吃掉了。断点能力也靠它。两边随便哪边宕机,KUFL里存着中断前的最新数据,恢复后接着传,不丢也不重。
最后是加载。目标端从KUFL读出来,翻译成目标库的原生SQL,严格按源端的提交顺序执行。别小看"顺序"俩字。转账场景里先扣款还是先入账,账务上是两回事,顺序乱了就是事故。
这套设计的红利就是低侵入。老办法要么用LogMiner这类数据库自带接口,高负载下解析慢得想砸键盘;要么上触发器,写侵入,拖慢每一次DML。KFS把解析计算挪到自己进程里做,生产库就出点"日志被读走"的IO开销。有多轻?某三甲医院的现场数据:同步程序单核CPU占用不到70%,内存1.8GB上下,扛的是每天几百GB的增量。
动手前,先把源端检查做了
部署本身没什么技术含量,但坑全在这一步。拿Oracle举例,基于日志解析的同步有两个硬前提:归档模式、附加日志。少一个,链路起不来;或者更吓人,起来了但丢数据。
sql
-- 1. 确认归档模式,结果必须是 ARCHIVELOG
SELECT log_mode FROM v$database;
-- 2. 查库级最小附加日志开没开
SELECT supplemental_log_data_min FROM v$database;
-- 3. 没开就补上
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
-- 4. 要同步的表,把主键列加进附加日志
ALTER TABLE scott.emp ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
然后我强烈建议你多做一件事:把无主键表揪出来。
sql
-- 找出没有主键的表,心里先有个数
SELECT t.owner, t.table_name
FROM all_tables t
WHERE t.owner = 'SCOTT'
AND NOT EXISTS (
SELECT 1 FROM all_constraints c
WHERE c.owner = t.owner
AND c.table_name = t.table_name
AND c.constraint_type = 'P');
KFS支持无主键表同步,这点比不少同类厚道。但没主键,Update和Delete就得全列匹配去定位行,效率掉一截。成熟点的做法是分流:带大对象的、日变更十万行以上的无主键表,拆出去走每天一次的定时同步,其余照常实时。之前有个金融客户就这么干的,5000多张表里1200多张没主键,最后只挑出55张走T+1,剩下的全走实时,延迟稳稳压在1秒以内。
目标端要是金仓数据库(KingbaseES),准备就轻松多了:
sql
-- 建用户建库,权限最小化
CREATE USER syncuser WITH PASSWORD 'Kfs@2026#Secure';
CREATE DATABASE reportdb OWNER syncuser;
GRANT CONNECT ON DATABASE reportdb TO syncuser;
链路配置在KFSMC管理平台上点点选选就完事。Web界面的,安装部署、任务启停、监控告警全在上面。它还开放RESTful、Thrift、JMX、Shell几套接口,喜欢脚本化运维的团队直接调接口,更舒服。
不是所有数据都值得搬
全量搬运是最偷懒的方案,真实项目里没人这么干。KFS给了好几层过滤手段。
对象级:同步哪几个模式、哪几张表、哪几列,正则都支持。
行级:按操作类型筛、按字段值筛。订单表只同步华东的、只同步已支付的,随你。
分发级这个有点意思。同一份源数据,按字段值拆给不同目标:总部一张总表,北京分部只收region=北京的行,上海收上海的,互不打扰。
双向同步里还有个绕不开的麻烦------两端同时改一行数据,听谁的?KFS给的是规则:粗暴点的,遇冲突暂停等人来,或者自动忽略接着跑;讲究点的,按值大小、按最后修改时间自动裁决。再加上防回环机制(A同步到B的数据,不会被B原样再弹回A),多中心互备的架子才立得住。
DDL也在同步范围内。加列、改类型能捕获,能在目标端翻译执行,跨库种类的语法改写也做在管道里。这在跑了好几年的老系统里是刚需。业务改表结构从来不会提前跟你打招呼,信我。
性能这笔账,白天和凌晨分开算
日常增量的数字先摆出来:平均延迟0.1秒这个量级;测试环境下Oracle源端解析118MB/s左右,目标端加载240MB/s往上,端到端40毫秒;TPCC模型一天600GB+。数字冷冰冰,放场景里才有感觉------省级平台往16个地市做一对多分发,地市侧照样亚秒级。
真考验同步软件的,是凌晨的跑批。
很多系统夜里集中批处理一小时,一个事务塞几十万上百万行,落到日志里就是一个巨型事务。老实的做法是整个还原、整个加载,内存当场爆炸。
KFS的路子叫大事务分片:把一个SCN下面的大事务切成一堆碎片并行处理,源端多线程解析,入库走基于分区索引的多通道并发,吞吐翻着倍涨。实际效果嘛,有个客户每天早上6点到7点固定产生350GB的跑批量,7点跑批结束,7点05分之前数据全部追平。350GB,5分钟,你品品。
广域网这边还有俩数字值得记:传输压缩4倍以上,2M带宽就能撑起异地实时容灾;低质量网络下传输优化能让速率提约4倍。省内专线就给2M的政务场景,这两个数字直接决定方案成不成。
数据搬过去了,然后呢
"应该是对的"------这话在数据治理场景里一文不值,你得拿得出证据。
KFS把一致性校验做成了内置功能,不单独收钱。对,某国外产品的校验组件是要另付费的,这里就不点名了。思路是快照加摘要比对。
源端目标端各拍一个数据快照,免得"比着比着数据还在变",最后对不上都不知道赖谁。然后MD5摘要比对加多线程并行,官方口径是100GB分钟级搞定,在线校验速率100MB/s上下。
增量校验的设计我觉得是全文最妙的一笔:变化数据直接从KUFL文件里拿,压根不查源库。也就是说,校验这件事对生产系统零压力,业务高峰期照跑不误。
原理层面,校验说白了就是两端各算一遍摘要再对数,你拿SQL也能撸个丐版出来:
sql
-- 两端各跑一遍,对行数和内容摘要
SELECT count(*) AS row_cnt,
sum(md5(id || '|' || cust_name || '|' || balance)) AS chk_sum
FROM cust_balance
WHERE update_time >= date_trunc('day', current_date);
丐版的问题在哪?两边执行有先后,期间数据在变,结果天然对不齐。KFS用快照机制解决的就是这个。人家还支持定时周期比对、抽样比对、过滤比对,数据量大的话成本能压下来。真查出差异,可以人工挑记录修,也可以开全自动修复,配上邮件、短信、钉钉告警,基本不用人盯着。有个存量4TB的金融系统,全表校验原来要6个小时往上,换成增量校验,10分钟以内收工。
坏事总会来:断点续传和热备
链路跑久了你就懂,故障不是会不会来的问题,是啥时候来的问题。
服务器宕机、数据库挂了、同步进程崩了、网络断了,KFS把常见故障挨个给了兜底。断点续传,恢复后从断的地方接着来,不重传。自动重连加故障重启,外部环境好了,同步服务自己爬起来,不至于半夜把你叫醒。再往上是KFS-HA管的多实例热备,主同步节点出事,备节点自动顶上,实测切换10秒以内。
热备有两种搭法:HA跟同步实例一对一合并部署;或者监听一整条链路,源端目标端一起切。跨网段检测也支持,两地三中心那种架构用得上。
国产化替换,怎么切才不心慌
这两年做替换项目,最拧巴的就是"怎么切"这一步。一刀切过去,出问题没退路;不敢切,项目永远悬着。KFS为此备了两套打法。
一套叫平滑迁移。流程四步:KDMS做结构迁移评估;KDTS基于SCN/LSN快照搬全量;全量期间KFS在源端不停解析增量、缓存在本地;全量完了增量加载追平,最后把应用的JDBC连接一指,指向新库,重启收工。业务全程基本无感,TB级数据的停机时间能压到小时级,现在的3.0方案连临时节点都省了。真实数字感受一下:12.3TB存量,三天迁完;60TB的基金TA系统全程照常营业,双轨切换不到30分钟。
另一套叫双轨并行,更稳。老库照常扛业务,KFS把数据实时灌进新库,新库先接点查询的活儿;跑稳一阵,主备对调,新库扛业务、老库变备胎。新库真出了幺蛾子,业务随时无感回退。等于给自己留了颗后悔药,晚上睡得着觉。
两套方案底下,是同一根实时同步链路。所以我一直觉得,数据集成软件是国产化替代的地基工程。库选得再好,数据过不去、回不来,切换就是开盲盒。
收尾:三个问题问自己
选型这事,别急着看参数,先问自己三个问题。
数据从哪来、到哪去?源端目标端列张单子,对着前面那张数据源表做排除法,第一轮就能刷掉一批候选人。
实时性到底要多少?小时级够用,ETL接着凑合;秒级是刚需,那就没什么好犹豫的。
出了事怎么兜底?断点续传、校验修复、热备切换,三样都齐了,觉才睡得安稳。
KFS这类产品的价值,不在单点跑分多高,而在于把"搬数据"这件琐碎又高危的活儿给工程化了:事务不丢,顺序不乱,对得上账,断了还能接上。数据孤岛的墙不是一天砌起来的,拆墙的家伙什,也得趁手才行。