变更数据捕获(Change Data Capture,简称CDC),是一种实时捕获业务数据库里「增、删、改」操作的技术。它会把数据库里每一行数据的每一次变更(新增客户、修改维修工单、删除无效记录),都实时生成一条变更日志,同步到Foundry中,最终还原出和源数据库完全一致的最新数据视图。
它是你之前学习的批量同步(Batch Sync) 的升级替代方案,专门解决批量同步的核心痛点:
CDC的核心是把数据库的每一次变更,变成一条可追溯的变更日志,再通过固定规则,把日志还原成源库的最新数据视图。文档里明确了CDC必须满足的3个核心元数据要求,以及标准的还原策略,这是所有CDC功能的基础。
每一条CDC变更日志,必须包含这三类字段,否则无法完成数据还原,完全对应你截图里的配置:
核心要素 | 定义与要求 | 对应你的实操截图 | 业务场景示例 |
|---|---|---|---|
主键列(Primary Key Columns) | 唯一标识一行数据的字段,必须是唯一、非空的。同一个主键的多条日志,代表对同一行数据的多次变更。 | 截图3里,你给dbo.Customers表选的主键CustomerId;截图5的Schema里,primaryKey配置的CustomerId | 维修工单的工单编号、配件的配件SKU编码、客户的客户ID |
排序列(Ordering Columns) | 数值型字段,用来判断同一主键的多条变更的先后顺序,最大值=最新的变更。绝大多数场景是长整型的时间戳(比如__timestamp),代表变更发生的时间。 | 截图5的Schema里,orderingColumn": "__timestamp",用变更发生的时间戳做排序 | 每一次工单变更的操作时间,用来判断哪一次修改是最新的 |
删除列(Deletion Column) | 布尔型字段,标记这条变更是不是「删除操作」。值为true=这行数据被删除了,false=新增/修改操作。 | 截图5的Schema里,deletionColumn": "__is_deleted" | 工单被取消、无效客户信息被删除,都会被这个字段标记 |
有了上面的三要素,Foundry就可以通过固定的3步,把零散的变更日志,折叠成和源数据库完全一致的最新数据视图,这个过程也叫「变更日志解析」:
true,就把这行数据从最终视图里移除;如果是false,就保留这条日志的内容,作为这行数据的最新状态。假设你的工单表,主键是工单编号,排序列是操作时间戳,删除列是是否删除,变更日志如下:
工单编号 | 工单状态 | 操作人 | 操作时间戳(排序列) | 是否删除(删除列) |
|---|---|---|---|---|
WO001 | 待分配 | 客户 | 1001 | false |
WO001 | 已分配 | 调度员 | 1002 | false |
WO001 | 工作中 | 技师 | 1003 | false |
WO001 | 已完成 | 技师 | 1004 | false |
按照还原策略:
WO001分组;如果新增一条日志:
工单编号 | 工单状态 | 操作人 | 操作时间戳 | 是否删除 |
|---|---|---|---|---|
WO001 | 已完成 | 管理员 | 1005 | true |
那最终视图里,WO001这行数据会被移除,和源数据库里删除这条数据的操作完全同步。
文档里明确了Foundry中使用CDC的完整流程,从源库配置到最终数据落地,每一步都和你的截图完全对应,下面逐环节拆解:
要捕获数据库的变更日志,首先要在源数据库里开启CDC功能,让数据库开始记录所有的增删改操作。 文档里给了SQL Server的标准启用脚本,分为两步:
USE 你的业务数据库名
GO
EXEC sys.sp_cdc_enable_db -- 给当前数据库开启CDC功能
GOEXEC sys.sp_cdc_enable_table
@source_schema = N'dbo', -- 表所属的Schema
@source_name = N'Customers', -- 要同步的表名
@role_name = NULL, -- 访问权限角色,NULL表示无限制
@supports_net_changes = 0,
@filegroup_name = N'PRIMARY';
GO其他数据库(PostgreSQL、MySQL、Oracle)也有对应的CDC开启方式,需要参考对应数据库的官方文档。
源库开启CDC后,需要在Foundry的「数据连接」应用里,创建一个指向源数据库的CDC源,截图1就是SQL Server CDC源的配置页面:
Username/Password(用户名+密码),也支持Active Directory等企业级认证方式;源连接创建完成后,就可以创建CDC同步任务,把源库的变更日志同步到Foundry中:
CDC syncs模块(截图2红框),点击Create CDC sync创建同步任务;dbo.Customers),Foundry会自动做两件事:__timestamp)、删除列(__is_deleted),无需手动配置;CDC同步任务启动后,变更日志会实时流入Foundry的流中,文档明确了CDC流有两个核心视图,对应截图4的下拉选项:
同时,在流的Details → Schema页面(截图5),可以看到完整的CDC变更日志元数据配置:
CustomerId;latestWins(按排序列取最新值);__timestamp;__is_deleted;
你可以在这里手动编辑、修改这些配置,适配自定义的变更日志格式。文档里明确了CDC数据可以在Foundry的所有核心组件中使用,和你之前学习的能力完全打通:
Pipeline Builder是处理CDC数据的核心工具,支持两种核心操作:
Key By算子,手动给数据配置CDC元数据:Key by columns:选主键列;Primary key ordering columns:选排序列;Primary key is deleted column:选删除列;
配置完成后,输出的流就会自带CDC元数据,和原生CDC同步的流完全一致。CDC是Ontology实现实时数据更新的最佳方式,文档明确了核心规则:
Workshop原生支持CDC数据的自动刷新:只要Ontology里的对象通过CDC实时更新了,Workshop里的表格、图表、详情页会自动刷新,展示最新的数据,无需用户手动刷新页面。
文档明确:CDC同步仅处理开启后的实时变更,不会自动回填历史数据。
如果反过来:先做批量同步,再启动 CDC 流,会出现一个致命问题:
批量同步需要时间(比如几小时、几天),在这段时间里,源库可能又产生了新的“增删改”操作;
等你批量同步完再开 CDC,这中间产生的新变更就完全漏掉了,Foundry 里的数据会比源库少一截。
而先开 CDC 流,相当于先给源库“装了个监控”,把批量同步期间产生的所有新变更先实时抓下来存着;等批量同步完历史 数据,再把这段时间存的新变更补进去,这样就100% 不会丢数据。
这里有两个关键原因:
(1)格式统一:下游只认“变更日志”
Foundry 下游的 Pipeline、Ontology 都是专门为 CDC 变更日志设计的,它们只认“创建、更新、删除”这种带元数据的变更 格式,不认普通的批量静态数据。 如果不把历史批量数据转成变更日志,下游就得写两套逻辑:一套处理批量历史数据,一套处理 CDC 实时变更,维护成本极高,还容易出错。
(2)逻辑统一:历史数据也是一种“变更”
从 CDC 的视角看,“历史全量数据”本质上就是**“在过去某个时间点,一次性创建了所有这些记录”**。把它转成“创建记录”的 变更日志,就能和后续的实时变更完美合并成一条完整的“时间线”,下游可以按统一的逻辑处理,不用区分“历史”和“实时”。
数据乱序是这个方案最容易出现的问题,原因很现实:
批量同步可能很慢(比如同步 1 年的历史数据要 10 小时),而在这 10 小时里,CDC 已经实时抓了很多新变更(比如“更新 了某条记录”“删除了某条记录”);
当你把历史批量数据转成“创建记录”的变更日志时,这些“创建”的时间戳是过去的时间(比如 1 年前),而 CDC 抓的新变更时间戳是现在的时间(比如 10 小时前到现在);
但在合并流的时候,可能因为处理速度、网络延迟等原因,出现**“现在的更新”先到,“过去的创建”后到**的情况——下游如果先执行了“更新”,再执行“创建”,就会导致数据完全错乱(比如“更新了一条不存在的记录”,或者“创建覆盖了更新后的状态”)。
所以必须手动重排序,把所有变更(历史创建 + 实时变更)严格按源库的真实时间顺序重新排一遍,保证下游按“先创建、再更新、最后删除”的顺序执行,这样最终的数据状态才和源库完全一致。
CDC同步过程中,可能出现网络中断、数据库停机、Foundry停机、代理停机等情况,文档给出了标准解决方案:
文档明确:不是只有数据库原生CDC同步的数据,才能用CDC能力。 任何流数据,只要你给它配置了主键、排序列、删除列这三要素,就可以当成CDC数据使用,比如:
如果不需要CDC解析能力,只想分析原始的变更日志,可以通过两种方式移除CDC元数据:
它不是你业务表里的字段(比如姓名、金额、时间),而是系统为了正确处理 CDC 变更流,额外带的一套 “说明书数据”,主要包括这几类:
哪一列是主键(用来定位哪一行)
哪一列是排序列(保证变更先后顺序)
哪一列是删除标记(识别是不是删除操作)
变更类型:insert /update/delete
变更时间、事务序号、源库位置等
这些信息合在一起,就叫 CDC 元数据。
CDC能力和你之前学习的所有Foundry核心能力,形成了完整的实时数据链路闭环:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。