拆一台数据集成产品:KFS 的骨架、肌肉和神经

数据集成产品这个东西,从外面看都长得差不多:数据从 A 库进,从 B 库出,中间画个箭头,完事。选型的时候各家 PPT 也都差不多,低侵入、高可用、秒级延迟,词儿都一样。

但真把它拆开看,零件和零件之间的差别大得很。这几天我把 KFS(Kingbase FlySync,金仓做的异构数据同步软件)的官方资料按技术链路捋了一遍,从它怎么抓日志,到中间怎么搬,到两边数据怎么对账。值得记的不少,写下来。

一、骨架:三段式,老老实实分三截

KFS 的结构图我在官网看过一版总览:左边一列源端------交易型数据库、分布式数仓、消息队列、NoSQL,右边一列目标端------同样一堆,中间是日志解析、过滤、转换,底下标着支持的的各种网络环境,防火墙、正反向隔离设备、单向光闸都算在内。

图 1:KFS 官网产品原理图(来源:kingbase.com.cn),左侧各类数据源经日志解析、过滤、实时同步与转换,逻辑同步到右侧目标端;下方列出支持的隔离网络环境与断点续传能力

拆到组件层,整条链路是标准的三段式:采集模块守在源端读日志,中间一个统一格式文件做接力,加载模块在目标端把变更落库。三段各自独立,各自记进度,互相不绑死。

这个分法不新鲜,但分得干净。后面能看到,它的几个关键能力------断点续传、低侵入、多拓扑------全是从这个分段里长出来的。

二、神经:KUFL 文件,全链路最值得看的设计

三段式里最有意思的是中间那段。KFS 发明了个格式叫 KUFL(Kingbase Unified Format Log),把从不同数据库里抽出来的操作信息,统一成一种格式存进去。

它的用法有点反直觉:采集模块读到数据后,读一次就把它挪到外部的 KUFL 文件里,之后一路到目标端加载完成为止,中间不再回源端碰第二次。

为什么这么设计?答案在故障场景里。源系统或者目标系统断掉的时候,KUFL 文件里躺着截至中断那一刻的最新数据。恢复之后,加载模块从最新的 KUFL 文件接着读,断在哪儿续哪儿,不用重头再来。

我第一次看到这段的时候想,这不就是个消息队列吗?细想又不太一样。消息队列管的是"不丢",KUFL 多管了一层"格式"------Oracle 的日志、MySQL 的 binlog、各种 NoSQL 的操作流,进来全部摊平成同一种统一表示,加载端拿到的东西是归一过的。异构同步的复杂度有一大半在格式差异上,KFS 把这个复杂度摁在中间层消化掉了。

图 2:KFS 三段式链路与 KUFL 文件:读一次即外移,中断后从断点位标续传

三、肌肉:不碰业务库,性能从哪来

做数据同步有两条路。老派做法在业务库装触发器、建中间表,业务每写一笔就多一笔额外开销------侵入性大,业务方见一次烦一次。另一条路是解析数据库自己的日志,业务库只多了一个读日志的进程。

KFS 走的是后一条,官方管这叫低侵入。落到数字上,FAQ 里给过一个参考:每天 50GB 的同步量级,对生产库的资源侵入极小。无主键表能同步,DDL、DCL 能复制,大对象(BLOB、CLOB 这些)也在支持列表里,多线程并行加载。这几条对老系统很关键------恰恰是那种十几年前建的系统,最容易有一堆没主键的老表。

性能这块,胶片里有组实测数据我一直记着。标准 TPCC 场景、基础 100 仓:

  • KFS 每天 600GB 出头
  • OGG(Oracle 家的 GoldenGate)每天 460GB 出头

600 仓的场景是 570 对 450。彩页里概括成一句话:局域网 TPCC 模型数据同步性能高于业界同类产品 30%。

拆开看环节:Oracle 源端日志解析速率 118MB/s,KES 源端解析 101MB/s,目标端加载 240MB/s 以上,数据同步延时 40 毫秒。解析和加载的速度差是刻意留的余量------加载永远快于解析,管道里不会积水。

广域网是另一套打法。传输层做了压缩,压缩比 4 倍,官方的直接结论是:2M 带宽就能做实时容灾。这个数字对跨地域的场景很实用------省下的专线钱比软件钱多得多。

图 3:KFS 实测性能数字摘录(TPCC 对比、解析/加载速率、同步延时)

四、对账:同步过去的数据,凭什么信

数据同步产品最怕的不是慢,是错------两边看着都成功了,一比账对不上。KFS 在这条上花的心思不比同步本身少。

它的一致性校验是全周期的:全量校验对存量,增量校验对新增,两边可以并行跑。关键卖点是不停机------校验的时候业务照常跑,大表连着大对象一起校,速率能到 98MB/s,100GB 的数据量平均校验时间在分钟级。发现差异还能自动修复,不用人工捞数据。

校验走的数据通道就是 KUFL 本身(校验程序从 KUFL 拿指定数据),所以增量校验的开销不会额外压到业务库上。这个复用设计我觉得挺聪明。

有个真实案例把校验的价值讲得很透。中汇亿达的项目,每天早上 6 点到 7 点有一小时跑批,要灌进去超过 350G 的数据,业务要求 7 点跑批结束、8 点之前数据必须追平。实际结果是 7 点跑批完成,7 点 05 分之前数据追平,同步延迟压在 5 分钟内,源端解析速率 90MB/s 以上。350G 的改动量,五分钟对平,这活儿靠人工是别想了。

五、长法:一台产品怎么长成一堆部署形态

同步需求千奇百怪,KFS 靠同一套三段式拼出好几种拓扑。

一对一,最基础的数据搬迁和容灾。级联同步,A 到 B、B 再到 C,适合总部分发到省、省再发到市的层级结构。数据汇聚,多个源端往一个目标端灌,做汇总库或者数仓前置。双向同步,两端各搭一套 KFS、互为目标,这是最难的一种------两个库同时改同一条数据怎么办?

KFS 的答案是自动冲突处理:对双向同步、数据汇聚场景里的冲突数据做无人工介入的自动处置。多源异构环境里所有数据源都支持 DML 加 DDL 同步,DDL 变更过来的时候同步程序不用停,连续作业。

图 4:KFS 四种典型部署拓扑:一对一、级联、汇聚、双向

六、也别光听好的

几个值得写在采购风险栏里的点。

双向同步的自动冲突处理听着省心,但冲突策略是产品按规则定的,什么算"对"最终是业务说了算,上线前得把自己的业务规则想清楚,别指望产品替你做业务决定。复杂的数据清洗、多表关联加工这类活,KFS 的定位是搬运用,重转换的场景官方另有 KFS Ultra,选型时得把边界问清楚。

无主键表虽然能同步,但这类表天生难定位单行,同步和校验的效率天然不如有主键的表,老系统迁移前能补主键还是先补。另外广域网 2M 带宽容灾的前提是开了压缩、链路质量达标,网络丢包严重的环境得先测,别直接拿彩页数字当承诺。

还有一条经验之谈:校验再快也只是兜底。同步链路的告警、延迟监控得配好,等校验发现不对,问题已经发生一会儿了。

相关推荐
4SAPI1 小时前
搭建 AI 数据分析工具大模型 API 选型指南
数据库·人工智能·架构·php·1024程序员节
码士集团小青3 小时前
面霸篇:高频 Java 基础问题(核心卷一)
linux·服务器·数据库·redis·缓存·1024程序员节
LMT流氓兔4 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
cuijiecheng20184 小时前
WeFlow 无法使用怎么办?一次数据库组件到期问题的排查与修复
数据库·oracle
一条泥憨鱼4 小时前
【Redis | 黑马点评】附近商铺功能源码解读
数据库·redis·缓存
念何架构之路5 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang
EnCi Zheng6 小时前
PostgreSQL 实战指南:安装配置、数据类型、索引选型、MVCC 事务与高可用备份全解析
数据库·sql·postgresql·索引·1024程序员节
泡海椒6 小时前
JQuick-SQL REST API 数据接入:应用层调用接口后注册分析表
数据库·sql·1024程序员节