文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

CDC是个啥,它是如何工作的?

2024-12-14 01:06

关注

【51CTO.com快译】从广泛意义上说,全球许多企业每天都需要通过频繁的数据批量处理与加载,来定期将数据从一个数据库迁移到另一个数据库(或数据仓库)。这类定期批量加载的工作,往往既耗费时间,又会消耗原始系统的大量处理能力。因此,管理员只能在业务运行的间歇期间运行数据的批量传输与复制作业,否则会产生严重的效率影响。而显然,这与24x7的不间断业务需求是背道而驰的。

近年来,变更数据捕获(Change Data Capture,CDC)已成为了在高速数据流通环境中,各种关系型数据库、云端数据库、以及数据仓库之间,进行低延迟、高可靠性且可扩展式数据复制的理想化解决方案。

什么是变更数据捕获?

CDC是指从源数据库捕获到数据和数据结构(也称为模式)的增量变更,近乎实时地将这些变更,传播到其他数据库或应用程序之处。通过这种方式,CDC能够向数据仓库提供高效、低延迟的数据传输,以便信息被及时转换并交付给专供分析的应用程序。

在数据不断变化,且无法中断与在线数据库连接的情况下,对于各种时间敏感(time-sensitive)类信息的复制,往往也是云端迁移的重要组成部分。与批量复制相比,变更数据的捕获通常具有如下三项基本优势:

变更数据捕获的方法

目前,业界有多种CDC方法,可用于跟踪和传输变更的数据,您可以根据应用程序的实际要求,及其对于性能下降的容忍度,从中进行选取。下面,我将向您介绍四种不同的CDC方法所涉及到的技术、工作原理、以及它们各自的优缺点。

时间戳或版本号跟踪

数据库设计者可以在需要跟踪的数据表中,设定某一列来代表最后被修改的时间戳或版本号。例如,我们通常可以将这些列命名为:LAST_UPDATE、DATE_MODIFIED、以及VERSION_NUMBER等。那些在上一次数据捕获之后,增加了时间戳的任何行,都将被视为发生了修改。而在基于版本号的跟踪方法中,变更一旦发生,所有具有最新版本号的数据,都被视为发生了修改。

在实际应用中,您可以结合版本和时间戳两个维度,来跟踪数据库表中的数据。例如,您可以设定一条逻辑--“捕获自2021年6月22日以来,相对于3.4版发生了变更的所有数据”。

优点:

缺点:

表的差异与增量

这种CDC方法使用诸如:表增量(table delta)之类的实用程序,或tablediff,去比较两个表中的数据,以发现不匹配的行。据此,您可以使用其他的脚本,将源表的差异同步到目标表上。

虽然该方法在管理已删除行的方面,比时间戳CDC的效果更好,但是它在发现差异时,所需要的CPU资源较为显著。而且此类开销会随着数据数量的增加,而呈线性增加。此外,针对源数据库或生产环境的分析查询,也可能会降低应用本身的性能。对此,您可以定期将数据库导出至暂存环境中进行比较。不过,随着数据量的增加,此类传输的成本也会呈指数级增长。

表差异的另一个问题是,它无法捕获数据的临时性变更。例如,假设有人更新了某个字段,但随后又将其变更回了原始值。那么,如果您只是运行一个简单比较的话,将无法捕获到这个变更事件。而由于diff方法本身存在着延迟,因此也无法实时执行。

优点:

缺点:

注意:表差异和时间戳CDC方法,都不适用于真实的生产环境。因此对于大型数据集,我建议您使用如下两种CDC方法。其实,基于触发器和事务日志的变更数据跟踪方法,只是出于相同目的的两种不同的服务方式。

基于触发器的CDC

  1. 将新的记录插入数据表时,触发的是INSERT触发器。
  2. 数据记录发生变更时,触发的是UPDATE触发器。
  3. 数据记录被删除时,触发的是DELETE触发器。

下面展示了一个简单的历史表:

由于源数据库中的每个表都需要一个触发器,因此在有变更发生时,在操作表上运行触发器的开销也会随之增加。不过,由于基于触发器的CDC是工作在SQL级别上的,因此许多用户会趋向于使用该方法。

优点:

缺点:

DBA和数据工程师应当持续关注并测试,那些被添加到生产环境中的各种触发器的性能,进而决定是否可以容忍此类额外产生的开销。

事务日志CDC

众所周知,数据库虽然主要会将事务日志用于备份和恢复目的,但它们也可被用于将变更复制到目标数据库或数据湖中。而在基于事务日志的CDC系统中,数据流不会被持久性存储。它们会使用Kafka去捕获变更,并将变更推送到目标数据库中。

可见,基于事务日志的CDC和基于触发器的CDC之间的主要区别在于,每个变更都将进入由数据库引擎所生成的事务日志中。也就是说,数据库引擎会使用本机事务日志(也称为重做日志),来存储所有数据库的事件,以便在发生故障时,可以恢复数据库。它们无需执行任何应用程序级别的变更,或扫描影子表。因此,与基于触发器的CDC相比,从事务日志中恢复数据虽然更为复杂,但是会更加可行。

优点:

缺点:

基于触发器与事务日志的比较

总的说来,基于触发器的CDC和事务日志CDC,都是可用于构建反应式分布式系统的数据库设计模型。其中,基于触发器的CDC使用自己的事件日志,作为真实的数据来源,而事务日志CDC则依赖底层数据库的事务日志作为真实来源。

触发器可作为每个数据库事务的一部分,以捕获实时发生的事件。对于每次插入、更新或删除,都会由某个触发器去触发记录的变更。另一方面,事务日志CDC则可以独立于事务运行。它使用重做日志文件来记录的变更。由于CDC操作在发生时不会直接与数据库中的每个事务相关联,因此其性能会有所提升。

在实际应用中,各种常见的DBSync产品和DBConvert Studio都会使用基于触发器的数据库同步CDC方法。不过,对于集群数据库而言,基于触发器的方法可能会比使用MySQL的二进制日志、或PostgreSQL的事务日志,要相差许多。毕竟,MySQL在其官网上已声称:“在启用二进制日志的情况下,服务器的运行性能可能会被略微拖慢。但是,二进制日志在方便复制与恢复操作等方面的好处,通常超过性能上的微降。”(https://dev.mysql.com/doc/refman/8.0/en/binary-log.html)

小结

综上所述,CDC是现代数据架构的重要组成部分,可被用于将事务数据从源系统,传输到数据流中。我们需要它支持实时的事务数据,且不会对源系统造成重大的负载。它既不需要改变源应用程序,又要保证仅传输最少量的数据。因此,CDC更适合大体量的数据集。将来,我们会在那些强调数据分析和历史数据比较的企业级数据仓库中,看到CDC的广泛使用。

原文Change Data Capture (CDC): What Is It and How Does It Work?,作者: Dmitry Narizhnykh

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

来源:51CTO内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯