Home » 什么是变更数据捕获 (CDC)?初学者指南

什么是变更数据捕获 (CDC)?初学者指南

获 (CDC) 可仅捕获插入、更新和删除操作,而不是重新加载整个数据集,从而帮助保持数据管道的高效性。这可减少处理时间和系统负载。

CDC 在实时数据流中也至关重要,它与 Apache Kafka 等平台集成以支持事件驱动架构。

让我们深入了解 CDC 以及它如何改初学者指南善您的数据项目!

什么是变更数据捕获 (CDC)?

变更数据捕获是一种检测、捕获并将修改后的数据从源系统转发到下游系统(例如数据仓库、仪表板或流应用程序)的方法。

CDC 并不重新处理整个数据集,而是只关注增量变化,确保目标系统始终能够访问最新的可用数据。

在一个实时分析项目中,我因批量更新而面临严重的报告延迟。通过切换到基于日志的 CDC 解决方案,我大幅缩短了数据新鲜度延迟,从几小时缩短到几秒,使分析仪表板真正实现了实时性。

通过这个个人经历强调 CDC 的实用价值,现在让我们继续讨论用于实现 CDC 的不同方法。

实现变更数据捕获的方法

在深入研究具体技术之前,重要的是要认识到没有一种方法适合所有情况。以下是四种常见的 CDC 方法,每种方法都有自己的优点和缺点。

基于日志的 CDC
基于日志的 CDC 会读取数据库的事务日志(通常称为预写日志,即 WAL),以在发生更改时立即识别这些更改。此方法效率很高,因为它在较低级别运行,可以捕获更改,同时最大程度地减少对生产系统的干扰。

优点:低系统开销和近乎实时的性能使其成为大容量环境的理想选择。
缺点:它需要对事务日志的特权访问,并且依赖于适当的日志保留设置。
例如,在PostgreSQL中,您可以设置逻辑复制来捕获来自 WAL 的更改:

— Enable logical replication
ALTER SYSTEM SET wal_level = logical;

— Create a logical replication slot to capture changes
SELECT pg_create_logical_replication_slot(‘cdc_slot’, ‘pgoutput’);

— Fetch recent changes from the WAL
SELECT * FROM pg_logical_slot_get_changes(‘cdc_slot’, NULL, NULL);
供电
这种方法允许 CDC 工具(例如 D初学者指南ebezium 或 AWS DMS,我们稍后将探讨)将数据库更改持续流式传输到下游系统,而无需依赖于计划查询。

基于触发器的 CDC

基于触发器的 CDC 使用附加到源表事件(插入、更新或删除)的数据库触发器来自动记录发生的更改。此方法对于支持触发器并 WhatsApp 号码数据 提供即时更改捕获的数据库来说很简单;但是,如果不仔细管理,它可能会给数据库增加额外的负载并使架构更改变得复杂。

优点:在支持触发器的数据库上直接实现并确保立即捕获变化。
缺点:如果管理不善,它会给数据库增加额外的负载,并且可能会使模式更改变得复杂。
基于触发器的 CDC 提供了即时性,但可能会增加开销,因此最适合于交易量适中的环境。

在 PostgreSQL 中,您可以创建一个触发器,将customers表中的更改记录到单独的customers_audit表中:
供电
该触发器可确保表上的每个INSERT、UPDATE或 都实时登录。DELETEcustomerscustomers_audit

基于轮询的 CDC

基于轮询的 CDC 会定期查询源数据库,以根 DPO 即服务——它是什么,为什么要雇用它以及它有哪些好处? 据时间戳或版本列检查更改。虽然这种方法避免了直接访问事务日志或触发器的需要,但它可能会引入延迟,因为更改只能以固定的间隔检测到。

优点:当日志访问或触发器不可用时,易于实现。
缺点:如果轮询过于频繁,则可能会延迟捕获变化并增加负载。
这种方法在无法实时访问日志的情况下非常有效,但其缺点是检测变化会稍微延迟。

想象有一张products表,其中有一version_number列在每次更新时都会递增:供电
这里1050是上一个轮询周期中最后处理的版本号。这确保只获取新的更改而不依赖时间戳,从而在系统时钟不可靠时使其更加稳健。

基于时间戳的 CDC

基于时间戳的 CDC 依赖于专门的列来记录每条记录的最后修改时间。通过比较这些时间戳,系统可以识别自上次检查以来发生变化的记录。

此方法类似于基于轮询的 CDC,但更 WhatsApp 号码 加结构化,因为它需要明确的机制来跟踪变化:

基于轮询的 CDC 是一种更广泛的方法,它使用任何可识别的模式(时间戳、版本号或其他指标)定期查询更改。
基于时间戳的 CDC 依赖于源数据库中必须准确维护的时间戳列。
数据库自动更新时间戳虽然很容初学者指南易实现,但依赖于系统时钟的一致性和时间戳更新的可靠性。

优点:系统自动更新时间戳的简单方法。
缺点:准确性取决于一致的时钟同步和可靠的时间戳更新。
假设我们有一张orders表,其中有last_modified一列在插入或修改行时会更新。以下 SQL 查询获取自上次检查以来的所有更改:

供电
当数据库在修改时自动更新时间戳时,此方法效果很好,例如使用触发器或内置机制,如 PostgreSQLDEFAULT now()或 MySQL 的ON UPDATE CURRENT_TIMESTAMP。

CDC 方法比较表

下面是一个比较表,重点介绍了四种变更数据捕获 (CDC) 方法之间的主要区别:

读取数据库事务日志(WAL、binlog 等)以实时捕获变化。

使用数据库触发器记录审计表中的更改。

使用版本号或其他标准定期查询更改。

比较列中的时间戳来检测初学者指南变化。

延迟

接近实时(低延迟)。

立即(触发器立即执行)。

预定的间隔(可能会造成延迟)。

取决于轮询频率(低到中等延迟)。

系统开销

低(不需要查询表)。

高(每次改变时都会触发运行)。

中等(取决于轮询频率)。

低到中等(依赖时间戳)。

实施复杂性

高(需要访问事务日志并进行适当的保留)。

中高(需要创建触发器并维护审计表)。

低(依赖于简单的 SQL 查询)。

低(如果时间戳自动管理则很简单)。

访问要求

对交易日志的特权访问。

需要 DDL 访问权限才能创建触发器。

无需特殊访问权限(标准 SQ初学者指南L)。

无需特殊访问权限(标准 SQL)。

支持删除吗?

是的(从日志中捕获)。

是的(如果记录在审计表中)。

需要额外的跟踪(例如,单独的删除表)。

仅当使用软删除(deleted_at)时。

最佳用例

最小数据库负载至关重要的大容量实时复制。

需要即时捕获变化的小型到中型工作负载。

当基于日志的 CDC 和触发器不可用,但可以接受定期更新时。

当时间戳自动更新且频繁轮询可行时。

常用工具

Debezium、AWS DMS、StreamSets、Striim、HVR

数据库原生触发器(PostgreSQL、MySQL、SQL Server、Oracle)

Apache Airflow、ETL 脚本(Python、SQL)

ETL 作业、批量数据管道

SQL 助理数据工程师
获得数据工程的 ETL、SQL 和数据仓库方面的实践知识


变更数据捕获的用例

了解方法只是故事的一半;了解 CDC 如何初学者指南在现实场景中提供切实的价值也同样重要。

实时数据仓库
CDC 通过仅传播更改而不是重新加载完整数据集来实现对数据仓库的持续、增量更新。这种方法可确保商业智能工具和仪表板显示最新的数据。

例如,零售公司可以近乎实时地更新其销售仪表板,以快速揭示新兴趋势和见解。

数据复制
CDC 通过确保源系统中所做的任何更改立即镜像到目标数据库中来跨系统复制数据。这在数据迁移项目期间或在混合环境中维护备份和副本时特别有用。

例如,将数据从本地系统复制到 AWS RDS 或Snowflake等云数据库可确保跨平台的一致性。

数据同步
在分布式系统(例如涉及微服务或多个应用程序的系统)中,CDC 通过实时同步更改来确保每个组件都使用最新的数据进行操作。

例如,跨各个平台同步客户信息可保持全面一致的用户体验。

数据审计与监控
最后,CDC 提供了详细的变更日志,这对于审计目的至关重要。通过跟踪谁进行了变更以及这些变更发生的时间,团队可以满足监管要求、解决问题并进行深入的取证分析。

例如,金融机构依靠全面的 CDC 日志来审计客户数据修改并确保遵守严格的数据治理政策。

实现变更数据捕获的工具

在探索方法和用例之后,让我们研究一些有助于 CDC 实施的流行工具。正确的选择取决于您的用例——您是否需要实时流、云迁移或企业 ETL 解决方案。

AWS 数据库迁移服务 (DMS)
AWS DMS使用基于日志的 CDC 将数据从本地系统持续复制到 AWS 云,同时最大程度减少停机时间,使其成为迁移的绝佳选择。如果您的目标初学者指南是将数据迁移到云并保证可靠的正常运行时间,AWS DMS 是一个强大的解决方案。

最适合:云迁移和基于 AWS 的架构。

AWS DMS 架构。

AWS DMS 架构。图片来源:AWS

地贝西姆

Debezium是一个开源 CDC 平台,可捕获数据库更改并将其传输到Apache Kafka等系统中。

就我个人而言,我发现 Debezium 对于将数据库更改流式传输到 Kafka 非常有用,尤其是在多个服务依赖实时更新的分布式环境中。它的可扩展性和集成能力使其成为一个出色的选择。

最适合:实时数据流和事件驱动架构。

使用 Kafka Connect 和 Debezium 的数据流架构。

使用 Kafka Connect 和 Debezium 的数据流架构。图片来源:Debezium

阿帕奇·卡夫卡

Apache Kafka本身并不是 CDC 工具,但与 Debezium 等工具配合使用时可作为处理 CDC 事件的主干。Kafka支持可靠的事件驱动管道、实时分析和跨多个消费者的数据同步。

最适合:将 CDC 数据传输到事件驱动架构。

为了说明如何将 CDC 事件发送到 Kafka,请考虑以下 Python 代码片段。该代码初始化 Kafka 生产器并将 CDC 事件(表示对orders表的更新操作)发送到名为 的 Kafka 主题cdc-topic:
供电
Talend 和 Informatica
Talend和Informatica是综合性的 ETL 平台,提供内置 CDC 功能来捕获和处理数据变化,从而减少手动配置。它们在复杂的数据转换场景中尤其具有优势,在这些场景中,集成解决方案可以简化操作。

最适合:具有内置 CDC 的企业级 ETL 解决初学者指南方案。

数据库原生 CDC 解决方案

一些关系数据库提供了原生的 CDC 功能,从而减少了对外部工具的需求:

PostgreSQL 逻辑复制:捕获 WAL 中的更改并将其流式传输给订阅者。
SQL Server 更改数据捕获 (CDC):使用事务日志自动跟踪更改。
MySQL 二进制日志 (binlog) 复制:记录更改以用于复制目的。
最适合:最大限度地减少对外部 CDC 工具的依赖。

Google Datastream 和 Azure 数据工厂
云提供商还为其生态系统提供 CDC 解决方案:

Google Datastream:为 Google Cloud 用户提供完全托管的 CDC 和复制服务。
Azure 数据工厂CDC:为 Azure SQL、CosmosDB 和 Synapse Analytics 启用更改跟踪和复制。
最适合:Google Cloud 或 Microsoft Azure 环境内的 CDC。

CDC 的挑战和局限性

虽然 CDC 提供了显著的好处,但也带来了一些挑战,必须设法实现可靠的实施。

处理数据完整性问题
在处理网络中断、交易延迟或系统故障时,维护数据完整性可能具有挑战性。强大的错误处理协议和定期协调对于防止源系统和目标系统之间出现差异至关重要。尽早解决这些问题有助于维护可靠的数据管道。

性能开销
某些 CDC 方法(尤其是那些依赖于触发器或频繁轮询的方法)可能会给源数据库带来额外的负载。在近乎实时的更新需求与生产系统的性能限制之间取得平衡是顺利运行的关键。

管理复杂的数据转换
尽管 CDC 可以高效捕获原始更改,但可能需要额外的下游处理,例如数据清理或转换。集成转换逻辑而不延迟交付或引入错误会增加 CDC 实施的复杂性,因此需要仔细规划。

实施 CDC 的最佳实践

将理论付诸实践需要遵循最佳实践。以下是初学者指南我根据自己的经验总结出的可行建议,它们帮助我构建了强大的 CDC 管道。

选择正确的实施方法
选择与您的数据量、延迟要求和系统架构相符的 CDC 方法。基于日志的 CDC 通常最适合高交易环境,而基于触发器或轮询的方法可能更适合较小的应用程序。提前评估您的特定需求可以节省以后的时间和资源。

监视作业Monitor jobs
使用实时仪表板和自动警报实施全面监控。定期日志审查和健康检查对于确保准确捕获每个更改并及时解决任何问题至关重要。

一个项目中的基于日志的 CDC 配置错误在几天内都未被发现,导致下游分析中数据悄然丢失。实施 Grafana 警报有助于立即捕获缺失的更新,从而避免代价高昂的错误。

确保数据质量
在 CDC 管道内集成数据验证检查点,以确保仅传播准确且一致的更改。

根据我的经验,在 CDC 管道中设置自动验证检查让我免于花费数小时调试不正确的数据传播问题。dbt和Apache Airflow等工具在跨多个下游系统实施一致性方面发挥了重要作用。

部署前测试实施
在将 CDC 解决方案投入生产之前,请在临时环境中对其进行全面测试。模拟真实世界的工作负载和故障场景,并验证回滚和时间旅行等功能,以确保系统在所有条件下都能按预期运行。这种严格的测试对于顺利进行生产部署非常重要。

Scroll to Top