在前面的文章中我们给大家介绍了什么是变化数据捕获?(点此阅读),接下来为给大家带来更多关于CDC的介绍与如何做变化数据捕获。
CDC的使用场景有哪些呢?
CDC技术的应用场景非常广泛,包括:
→数据分发:将一个数据源的数据分发给多个下游业务系统,常用于业务解耦、微服务系统。
→数据采集:面向数据仓库、数据湖的ETL数据集成,消除数据孤岛,便于后续的分析。
→数据同步:常用于数据备份、容灾等。
常见的变化数据捕获方法
→基于查询的CDC
这种方法中,需要不断的查询源数据库表中的数据,以获取更改的数据记录;查询过程中需要通过某些列来判断那些数据是变更的;常见的有时间戳列、自增序列列,可以通过保存创建时间列、修改时间列来表示插入、变更的记录,自增列也很容易识别出新插入的记录。
→基于触发器的CDC
在这个方法中,当业务系统执行插入、更新、删除这些SQL时,以激活数据库的触发器,使其对数据记录进行变更捕获,并将数据保存在一个临时表中,最后在将变更数据从临时表中抽取到数据仓库中。
→基于快照的CDC
如果上述的触发器以及增加列查询的方式都不被允许的情况下,就可以使用快照表等方式进行变更数据的捕获;其实现思路就是通过比较源表和快照表的方式,获取数据的变更信息,通过快照的方式可以检测到插入、更新以及删除的数据记录。
→基于日志的CDC
当数据库表完成一个的新的DML(insert,update,delete)操作后,数据库都会将它实时记录到日志文件中;通过解析数据库操作日志的方式,可以将插入、更新、删除的数据更改操作都可以捕获,发送下游系统。
上述4种CDC的实现方式中,基于日志方式的CDC是最优的实现方式,其实时性高、无侵入性,并且能将所有的更改捕获;如果无法获取并解析数据库日志文件,则可以选择其他三种方式进行CDC;基于快照的方式虽然可以捕获所有的变更记录,但是其有个明显的缺点就是需要大量的存储空间来保存快照数据,且实时性低;基于触发器的方式因为要增加触发器,则对变更数据进行多次写入操作,有一定的侵入性;基于查询的方式则需要在数据表上进行时间列、自增列的添加,侵入性强,且无法获取删除操作,因此很少使用。
CDC变更日志流
前边我们已经对CDC有了初步的了解,CDC的核心思想是进行数据更改的捕获和识别,并将其发送下游系统,那数据的变更过程是以什么样的形式发送下游系统的呢,那就是CDC变更日志流。
CDC程序将包括插入、更新、删除的数据操作通过进行解析处理转换,形成统一规范的变更消息传递给下游的系统,这些消息流包括INSERT(+I),UPDATE_BEFORE(-U),UPDATE_AFTER(+U),DELETE(-D)四种消息状态语义:
→INSERT(+I):新插入的数据记录行
→UPDATE_BEFORE(-U):数据记录行被更新前的数据
→UPDATE_AFTER(+U):数据记录行被更新后的数据
→DELETE(-D):删除的数据记录行
下面我们以一张人员信息表的业务数据变化过程为例,进行CDC变更日志流的解释。人员表有人员ID(id),姓名(name),年龄(age)等字段,对其进行如下插入、更新、删除的数据记录事务操作:
→在人员表中插入一条人员信息,ID为1,姓名为小明,18岁。
→再向人员表中插入一条人员信息,ID为2,姓名为李华,32岁。
→修改小明的年龄为20岁。
→从人员表中将李华删除。
→最后向人员表中插入一条人员信息,ID为3,姓名为丽丽,年龄为8岁。
上述人员表的CDC变更日志流如下:
+I{id: 1, name: '小明', age: 18}
+I{id: 2, name: '李华', age: 32}
-U{id: 1, name: '小明', age: 18}
+U{id: 1, name: '小明', age: 20}
-D{id: 2, name: '李华', age: 32}
+I{id: 3, name: '丽丽', age: 8}
最终的人员表数据如下:
User(人员信息表) |
id(人员ID) |
name(姓名) |
age(年龄) |
1 |
小明 |
20 |
3 |
丽丽 |
8 |
除过上述示例中的变更日志流的表示方式外,还可以通过其他格式进行表示,只要准确描述上述4中更改消息语义即可。
CDC变更日志流可以记录整张表的数据变更记录,使得我们可以通过执行变更流,在任意位置停止,而将CDC表的数据恢复到任何时刻,这比定时备份更加可靠及节省空间。
在Tempo数据工厂中如何进行CDC
Tempo数据工厂是集海量数据集成、实时数据加工、离线数据处理、自定义组件扩展、一体化监控运维五大核心功能的大数据开发平台,为企业用户降低了多源异构数据的融合成本,赋能全链路数据开发,让数据更好发挥价值。在Tempo数据工厂平台中,用户可以通过拖拉拽的方式快速配置完成一个实时自助流程进行业务数据的CDC,并且可以进行后续的计算处理,最终将数据写入目标源中,一个完整的CDC业务数据流,如下图:
我们可以将左侧输入节点中的MySQL CDC拖入右侧画布中,双击打开节点配置面板,通过选择已经配置好的MySQL数据源,选择需要进行CDC的库表,节点自动读取表的列信息展示,最后点击右上角的应用按钮,这样一个MySQL数据源表的CDC输入节点就配置完成了,配置如下图:
目前Tempo数据工厂支持的可进行CDC的数据库列表如下:
Oracle |
版本: 12c, 19c, 21c |
MySQL |
版本: 5.7, 8.0.x |
PostgreSQL |
版本: 10, 11, 12, 13, 14
插件: decoderbufs, pgoutput |
SQL Server(孵化中) |
版本: 2017, 2019 |
Db2(孵化中) |
版本: 11.5 |
如果大家在实际的业务数据分析过程中,想要提高数据的时效性,降低处理数据变更的难度,可以尝试使用CDC进行实时数据同步,而Tempo数据工厂可以让您更快的应用它。