0


数据库实时同步利器——CDC(变化数据捕获技术)

在进行数据ETL过程中,我们经常需要通过周期性的定时调度将业务数据按照T+1的方式同步到数据仓库中,进行数据分析处理,最终通过BI报表展示给最终用户。但这种方式实时性较差,用户往往只能看到昨天的数据,会影响用户决策的及时性;

而如果用户要近实时的查看报表,则需要将调度周期频率提高到小时或分钟,这对整个数据分析系统是个很大的考验;而上述过程也只适用于数据不断新增的情况,如果遇到业务数据修改、删除的过程,则只能每次全量同步覆盖;在面对上述数据同步过程中数据时效性要求高、历史数据会变更的问题,我们可以使用变化数据捕获技术进行数据的实时同步。

什么是变化数据捕获?

变化数据捕获 (Change Data Capture,缩写CDC) 是指识别和捕获对数据库中的数据所做的更改(包括数据或数据表的插入、更新、删除等),然后将这些更改按发生的顺序完整记录下来,并实时通过消息中间件传送到下游流程或系统的过程。通过这种方式,CDC能够向数据仓库提供高效、低延迟的数据传输,以便信息被及时转换并交付给专供分析的应用程序。

CDC具备哪些优点呢?

对于各种时间敏感类的数据很适合通过CDC的方式进行同步传输,其具备以下好处:

  • 通过增量加载或将数据更改实时流式传输,而无需周期性调度执行批量加载更新操作。
  • CDC实时同步传输数据,它利于不停机的数据库迁移,并支持实时分析,可以帮助用户根据最新的数据做出更快、更准确的决策。
  • CDC最大限度地减少了数据的传输网络流量,适合跨广域网传输数据。
  • 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)等字段,对其进行如下插入、更新、删除的数据记录事务操作:

  1. 在人员表中插入一条人员信息,ID为1,姓名为小明,18岁。

  2. 再向人员表中插入一条人员信息,ID为2,姓名为李华,32岁。

  3. 修改小明的年龄为20岁。

  4. 从人员表中将李华删除。

  5. 最后向人员表中插入一条人员信息,ID为3,姓名为丽丽,年龄为8岁。aa

上述人员表的CDC变更日志流如下:

最终的人员表数据如下:

除过上述示例中的变更日志流的表示方式外,还可以通过其他格式进行表示,只要准确描述上述4中更改消息语义即可。

CDC变更日志流可以记录整张表的数据变更记录,使得我们可以通过执行变更流,在任意位置停止,而将CDC表的数据恢复到任何时刻,这比定时备份更加可靠及节省空间。

在Tempo DF数据工厂中如何进行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数据工厂可以让您更快的应用它。


本文转载自: https://blog.csdn.net/qq_42963448/article/details/125638634
版权归原作者 美林数据Tempodata 所有, 如有侵权,请联系我们删除。

“数据库实时同步利器——CDC(变化数据捕获技术)”的评论:

还没有评论