数据结构论坛

注册

 

发新话题 回复该主题

CDC是个啥,它是如何工作的 [复制链接]

1#
全国治白癜风最好医院 https://wapjbk.39.net/yiyuanzaixian/bjzkbdfyy/

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

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

什么是变更数据捕获?

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

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

CDC通过仅发送增量的变更,来降低通过网络传输数据的成本。

CDC可以帮助用户根据最新的数据做出更快、更准确的决策。例如,CDC会将事务直接传输到专供分析的应用上。

CDC最大限度地减少了对于生产环境网络流量的干扰。

变更数据捕获的方法

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

时间戳或版本号跟踪

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

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

优点:

简单易懂。

数据库设计者可以自定义应用程序的逻辑构建。

不需要任何外部的工具。

缺点:

给数据库增加了额外的开销。

需要额外的CPU资源,来扫描表中的数据变更,并需要预留资源,以确保LAST_UPDATE列能够可靠地追踪所有资源表。

被删除的行不会存在于LAST_UPDATE中。如果没有其他脚本来跟踪此类删除的话,DML语句(例如“DELETE”)将不会被传递到目标数据库处。

容易出错,并可能导致数据出现一致性问题。

表的差异与增量

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

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

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

优点:

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

缺点:

由于此方法会用到数据源的三个副本:原始数据、先前快照和当前快照,因此整体存储需求会有所增加。

在那些具有繁重事务负载的应用程序中,无法得到很好的扩展。

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

基于触发器的CDC

我们需要为参与数据复制的每个表,创建三个触发器,当数据记录发生如下特定事件时,则会触发相应的操作:

将新的记录插入数据表时,触发的是INSERT触发器。

数据记录发生变更时,触发的是UPDATE触发器。

数据记录被删除时,触发的是DELETE触发器。

“事件历史”的影子表被存储在数据库本身,并由各种状态改变事件的序列所组成。

每当对象的状态发生变化时,新的事件都会被附加到该序列中。据此,有关变更记录的信息,也会被转移到“事件历史”的影子表中。

最后,根据历史表中的各个事件,变更会被传输到目标数据库中。

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

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

优点:

非常可靠且详尽。

影子表可以提供所有事务的不可变详细日志。

缺点:

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

DBA和数据工程师应当持续

分享 转发
TOP
发新话题 回复该主题