变更数据捕获(CDC)

news2024/9/23 13:16:41

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

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

什么是变更数据捕获?

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

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

  • CDC通过仅发送增量的变更,来降低通过网络传输数据的成本。
  • CDC可以帮助用户根据最新的数据做出更快、更准确的决策。例如,CDC会将事务直接传输到专供分析的应用上。
  • CDC最大限度地减少了对于生产环境网络流量的干扰。

变更数据捕获的方法

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

时间戳或版本号跟踪(Delete 操作不友好)

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

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

优点:

  • 简单易懂。
  • 数据库设计者可以自定义应用程序的逻辑构建。
  • 不需要任何外部的工具。

缺点:

  • 给数据库增加了额外的开销。
  • 需要额外的CPU资源,来扫描表中的数据变更,并需要预留资源,以确保 LAST_UPDATE列能够可靠地追踪所有资源表。
  • 被删除的行不会存在于LAST_UPDATE中。如果没有其他脚本来跟踪此类删除的话,DML语句(例如“DELETE”)将不会被传递到目标数据库处。
  • 容易出错,并可能导致数据出现一致性问题。

表的差异与增量(大数据量不友好)

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

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

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

优点:

  • 可使用各种原生的SQL脚本,来获取变更数据的准确视图。

缺点:

  • 由于此方法会用到数据源的三个副本:原始数据、先前快照和当前快照,因此整体存储需求会有所增加。
  • 在那些具有繁重事务负载的应用程序中,无法得到很好的扩展。

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


基于触发器的CDC(增加了触发器的开销)

  •  我们需要为参与数据复制的每个表,创建三个触发器,当数据记录发生如下特定事件时,则会触发相应的操作:
  1. 将新的记录插入数据表时,触发的是INSERT触发器。
  2. 数据记录发生变更时,触发的是UPDATE触发器。
  3. 数据记录被删除时,触发的是DELETE触发器。
  • “事件历史”的影子表被存储在数据库本身,并由各种状态改变事件的序列所组成。
  • 每当对象的状态发生变化时,新的事件都会被附加到该序列中。据此,有关变更记录的信息,也会被转移到“事件历史”的影子表中。
  • 最后,根据历史表中的各个事件,变更会被传输到目标数据库中。

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

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

优点:

  • 非常可靠且详尽。
  • 影子表可以提供所有事务的不可变详细日志。

缺点:

  • 每次插入、更新或删除数据行时,都需要对数据库进行多次写入,此举降低了数据库的性能。

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

事务日志CDC (日志文件读取不友好)

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

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

优点:

  • 由于每个事务都不需要额外的查询,因此它对生产环境中的数据库系统的影响最小。
  • 无需变更生产环境中数据库系统的架构,或添加额外的数据表。

缺点:

  • 由于大多数数据库并不记录它们的事务日志格式,也不会在新的版本中公布对其实施的变更,因此DBA解析数据库的内部日志格式会较为困难。DBA有时需要在数据库的每个新版本中,去解析变更数据库的日志逻辑。
  • 由于日志文件通常会被数据库引擎予以归档,因此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的广泛使用。

参考:

CDC是个啥,它是如何工作的?-51CTO.COM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

design\project\学习 OAuth 读书笔记(二)

OAuth(二) 原文链接:OAuth 2.0 tutorial | OAuth flows 本文假设您已经看过 OAuth(一) 目录OAuth(二)OpenId ConnectOAuth2:令牌自检(Token Introspection)…

Qt std :: bad_alloc

文章目录摘要问题出现原因第一种 请求内存多余系统可提供内存第二种 地址空间过于分散,无法满足大块连续内存的请求第三种 堆管理数据结构损坏稍微总结下没想到还能更新参考关键字: std、 bad、 alloc、 OOM、 异常退出摘要 今天又是被BUG统治的一天&a…

fengMap 自定义dom 偏离实际位置;缩放时飘出地图所在区域

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.前人写了一份代码,很奇怪。使用 new fengmap.FMCompositeMarker添加的复合覆盖物位置是正常的,缩放的时候也是正常的,仍然处于地图内部;但是new fengmap.FMDomMarker添加…

Nginx 负载均衡服务失败场景

nginx可以配置负载均衡,我们可以通过配置实现nginx负载均衡。这里部署了两个服务producter-one和producter-one2。 upstream proxyproducter-one {server producter-one:8080 weight1;server producter-one2:8080 weight1;}# 访问其他服务server {listen 9090…

Netty学习(三):Netty线程模型

〇、前言网络编程的基本线程模型,详见:Netty学习(二):线程模型一、工作原理简图Netty主要基于主从 Reactors 多线程模型(如下图) 做了一定的改进,其中主从Reactor 多线程模型有多个R…

ServerSocket的构造方法

在开发TCP程序时,首先需要创建服务器端程序。JDK的java.net包中提供了一个ServerSocket娄,该类的实例对象可以实现一个服务器端的程序。通过查阅API文档可知,ServerSocket类提供了多个构造方法,接下来就对ServerSocket的构造方法进…

Pycharm配置QGIS环境

版本信息:QGIS: 3.22.16Pycharm:2022.3.2 (Community Edition)在QGIS官网下载安装包,下载稳定版本即可。配置步骤:安装完成后,使用Pycharm新建工程Python编译器选择之前配置好的编译器环境选择左侧第一个Vi…

YOLOv8训练自定义数据集(超详细)

借鉴 https://blog.csdn.net/qq_40716944/article/details/128648001一、准备训练环境安装 requirements.txt下载:https://raw.githubusercontent.com/ultralytics/ultralytics/main/requirements.txt然后在你 目录下执行pip install -r requirements.txt它的 requi…

【字符串】leetcode28. 实现 strStr()(C/C++/Java/Python/Js)

leetcode28. 实现 strStr() 1 题目2 KMP2.1 什么是KMP?2.2 KMP有什么用?2.3 什么是前缀表?2.4 最长公共前后缀2.5 为什么一定要用前缀表?2.6 如何计算前缀表2.7 前缀表与next数组2.8 使用next数组来匹配2.9…

2022 年度_职业项目总结_Java技术点归纳

Java技术点归纳目录概述需求:设计思路实现思路分析1.Structs 元工程改造2.个贷子系统开发3.架构的迭代开发,升级,部署,参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,fu…

学编程的 4 大阶段,你到哪了?

大家好,我是阅黑马学生无数的播妞……通过观察黑马学生的学习状态,播妞总结了他们来黑马后的四个学习状态,可以说,只要跨过这四个阶段,走向辉煌的编程人生就是必然的事情。阶段一:一窍不通这个阶段的学生&a…

2023初级会计详细学习计划打卡表!自律逆袭,一次上岸!

2023年初级会计职称考试报名时间:2月7日-28日考试时间:5月13日—17日给大家整理了《经济法基础》和《初级会计实务》两科超实用的学习打卡表重要程度、难易度、易错点、要求掌握内容、章节估分等都全部总结在一起,一目了然!为什么…

rk3288-android8-IR-mouse

IR问题: mouse按键使用不了 然后排查: 1.排查上报 ir_key6{ rockchip,usercode <0xbf00>;rockchip,key_table <0xff KEY_POWER>,<0xfe KEY_MUTE>, <0xfd KEY_1>, <0xfc KEY_2>, <0xfb KEY_3>, <0xfa KEY_4>, <0xf9 KEY_5>…

JavaEE进阶第六课:SpringBoot ⽇志⽂件

上篇文章介绍了SpringBoot配置文件&#xff0c;这篇文章我们将会介绍SpringBoot ⽇志⽂件 荔枝1.日志有什么用2.自定义日志输出2.1获取程序日志对象2.2使用相关方法输出日志2.3日志级别2.3.1日志级别的作用2.3.2日志级别如何设置2.4日志格式3.持久化日志4.更简单的日志输出4.1使…

【移动端表格组件】uniapp简单实现H5,小程序,APP多端兼容表格功能,复制即用,简单易懂【详细注释版本】

前言&#xff1a; 由于最近需要做移动端的项目 有个pc端的后台系统里面需要移一部分页面过来 而里面就有很多的表格&#xff0c;我就开始惯例网上先找前人栽的树&#xff0c;我好乘凉 然后找了一圈发现&#xff0c;不管是主流的移动端ui库或者网上自己写的帖子&#xff0c;或者…

224. 基本计算器

224. 基本计算器给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数&#xff0c;比如 eval() 。 示例 1&#xff1a;输入&#xff1a;s "1 1"输出&#xff1a;2示例 2&#…

【Pygame实战】变异狗大战:据说是最近还不错的小游戏,这一个个玩到表情崩坏,点开即玩,赶紧来~(Python代码搞笑版本)

前言 只有你想不到&#xff0c;没有我找不到写不了的好游戏&#xff01; 哈喽。我是你们的栗子同学啦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 今天小编去了我朋友家里玩儿&#xff0c…

ExSwin-Unet 论文研读

ExSwin-Unet摘要1 引言2 方法2.1 基于窗口的注意力块2.2 外部注意力块2.3 不平衡的 Unet 架构2.4 自适应加权调整2.5 双重损失函数3 实验结果3.1 数据集3.2 实现细节3.3 与 SOTA 方法的比较3.4 消融研究4 讨论和限制5 结论数据集来源&#xff1a; https://feta.grand-challenge…

图扑 Web SCADA 智慧制硅厂,打造新时代制硅工业

前言 我国目前是全球最大的工业硅生产国、消费国和贸易国&#xff0c;且未来该产业的主要增量也将来源于我国。绿色低碳发展已成为全球大趋势和国际社会的共识&#xff0c;随着我国“双碳”目标的推进&#xff0c;光伏产业链快速发展&#xff0c;在光伏装机需求的带动下&#…

武汉凯迪正大KD305系列智能数字绝缘电阻测试仪

一、概述 KD305系列智能数字绝缘电阻测试仪采用嵌入式工业单片机实时操作系统&#xff0c;数字模拟指针与数字段码显示结合&#xff0c;该系列表具有多种电压输出等级&#xff08;500V、1000V、2500V、5000V、10000V&#xff09;、容量大、抗干扰强、模拟指针与数字同步显示、交…