Kafka 中的数据捕获

2025 年 5 月 15 日 | 阅读 11 分钟
Data Capture in Kafka

Kafka 中的变更数据捕获 (CDC) 是一种强大的数据集成用例,它允许在系统之间进行实时记录同步。CDC 捕获数据源(如数据库)中的更改,并使用 Kafka 作为中介将这些更改流式传输到不同的系统或应用程序。

变更数据捕获 (CDC) 简介

变更数据捕获 (CDC) 是一种检测和跟踪对源数据库所做的更改(插入、更新、删除)并将其传播到目标机器的方法。CDC 捕获更改过的数据,而不是整个数据集,通过减少数据量和处理时间来优化数据传输。

使用 Kafka 进行 CDC 的常见原因包括:

  • 实时数据仓库
  • 在不同环境中同步数据库
  • 构建事件驱动型架构
  • 数据迁移,停机时间最短

Kafka 如何促进 CDC

Data Capture in Kafka

Kafka 通过充当捕获、传输和分发实时数据更改的中间平台,实现了变更数据捕获 (CDC)。以下是 Kafka 完成此功能的详细说明:

1. Kafka 中的 CDC 连接器

Kafka 的生态系统包括 Kafka Connect,这是一个用于将外部系统与 Kafka 集成的分布式、容错框架。Kafka Connect 使用 CDC 连接器(例如 Debezium)从各种数据库捕获更改。

Debezium:一个流行的开源 CDC 工具,与 Kafka Connect 集成。它读取数据库的更改日志(例如 MySQL 二进制日志,PostgreSQL 预写日志),并生成代表每次更改的 Kafka 事件。

2. 更改事件作为 Kafka 消息

当数据库发生更改时,CDC 连接器会将这些更改作为事件发布到 Kafka 主题中。每个事件包含:

  • 操作类型:指定是插入、更新还是删除。
  • 前后数据:通常会捕获原始值和更新后的值。
  • 元数据:包括时间戳、表名、列模式等。

这些事件被组织在 Kafka 主题中,具有反映数据库和表名称的通用结构(例如,对于 stock 数据库中的 products 表,主题为 dbserver1.Stock,products)。

3. 主题分区和可伸缩性

Kafka 主题可以进行分区,从而允许并行处理 CDC 数据。这种分区对于大量更改同时发生的、高吞吐量的应用程序特别有用。通过将事件分发到多个分区,Kafka 允许水平扩展,确保 CDC 管道能够处理大量数据而不会出现瓶颈。

4. 容错和数据持久性

Kafka 在多个代理之间提供数据复制,确保即使代理发生故障,数据仍然可用。对于 CDC 管道,这意味着更改会可靠地存储在 Kafka 中,直到它们被处理。Kafka 的持久性确保 CDC 事件会根据可配置的保留策略进行保留,因此即使消费者暂时离线,它也可以从 Kafka 重放事件并赶上。

5. 使用 Kafka Streams 进行流处理和转换

借助 Kafka Streams(一个内置的流处理库),Kafka 允许对 CDC 事件进行实时数据处理和转换。

Kafka 中的 CDC 架构

Data Capture in Kafka

Kafka 中的 CDC(变更数据捕获)过程涉及从源数据库捕获数据更改,并通过 Kafka 将它们流式传输到目标系统进行消耗。以下是 Kafka 中 CDC 架构中所有涉及内容的详细分解:

1. 源数据库

源数据库是更改的起点。更改可能包括插入、更新和删除,这些操作会修改数据库中的数据。CDC 的典型源数据库包括关系型数据库(如 MySQL、PostgreSQL 和 Oracle)、文档存储(如 MongoDB)甚至大型机数据库。

这些数据库中的每一个都有一个跟踪更改的机制:

  • 关系型数据库(例如 MySQL、PostgreSQL):这些数据库维护事务日志,记录每次更改。例如,MySQL 具有二进制日志(binlog),PostgreSQL 具有预写日志(WAL),Oracle 具有重做日志。这些日志允许 CDC 工具捕获行级数据更改。
  • 文档存储(例如 MongoDB):MongoDB 维护一个操作日志(oplog),其中记录了所有数据库更改,允许 CDC 记录面向文档的数据。

CDC 的源数据库充当数据更改的初始入口点。然后,数据会被捕获并通过 Kafka 流式传输。

2. CDC 连接器

CDC 连接器是 Kafka CDC 方法中的关键组件。它负责持续监视源数据库的更改,并将这些更改作为事件发布到 Kafka 主题中。该连接器使用 Kafka 的 Kafka Connect 框架以可伸缩、容错的方式管理集成外部系统(在此示例中为数据库)与 Kafka 的过程。

Kafka 最广泛使用的 CDC 连接器之一是 Debezium:

  • Debezium:一个开源 CDC 工具,与 Kafka Connect 集成。它监视源数据库的事务日志以识别行级更改,提取更改,并将它们转换为 Kafka 事件。
  • 读取事务日志:CDC 连接器读取事务日志(例如 MySQL binlog 或 PostgreSQL WAL),而不是实际的数据库表。通过读取事务日志,连接器可以增量捕获更改,而无需扫描整个表。
  • 事件结构:数据库 中的每个更改(插入、更新、删除)都会被转换为一个事件。

Debezium CDC 连接器配置示例

该配置指定了数据库连接信息和要监视的表。以下是 MySQL 连接器的基本配置示例:

  • Connector.Class:指定连接器的类型,此处使用 MySQL 的 CDC 连接器。
  • Database.Include.List 和 table.Include.List:定义要监视的特定数据库和表。
  • Database.Records.Kafka.Subject:存储模式随时间变化的模式的主题,这允许 Kafka 处理模式演进。

3. Kafka 主题

一旦 CDC 连接器捕获了更改,它们就会将这些更改作为事件发布到 Kafka 主题中。Kafka 主题充当临时存储更改事件的通道,直到它们被使用者读取和处理。

  • 主题结构:主题通常根据它们表示的数据库和表命名,例如,dbserver1.Customer 表示 dbserver1 数据库中的客户表。这种结构化的命名约定允许组织数据流,并使使用者更容易仅订阅相关主题。
  • 事件格式:每个主题包含代表数据库更改的事件。例如,如果向客户表插入了一行,一个事件将被发布到 dbserver1.Consumer,其中包含新行。如果更新了一行,事件将显示该行的“之前”和“之后”状态。
  • 分区和排序:Kafka 主题可以进行分区,以处理大量更改事件。每个分区维护一个有序的事件集合,确保更改按适当的顺序应用。

Kafka 的复制和保留功能确保一旦事件发布到主题,它们就会被持久地存储并可供使用者使用,直到需要为止,从而实现容错和重新处理。

4. Kafka 消费者

Kafka 消费者订阅发布 CDC 事件的主题,读取并将这些更改应用于各种目标系统。目标系统可以是数据库、数据仓库、搜索引擎或需要与源数据库保持同步的微服务。

  • 目标系统:Kafka CDC 事件的常见目标系统包括:
  • 数据仓库:将实时数据更改流式传输到 BigQuery、SnowflakeRedshift 等分析系统。
  • 搜索索引:更新 Elasticsearch 等搜索索引,以使其与实时数据更改保持同步。
  • 微服务:向用户微服务提供数据,以使其了解最新的数据库状态。
  • 备份数据库:将更改镜像到备用数据库以进行灾难恢复或故障转移。
  • 事件处理:一些消费者可能会直接应用更改,而另一些消费者可能需要转换或增强数据。例如:
  • 实时分析:分析消费者在将 CDC 事件存储到数据仓库以进行 BI 报告之前,可能会对其进行聚合或过滤。
  • 微服务:微服务可能会应用商业逻辑到 CDC 事件,在更新自己的本地数据存储之前对其进行转换。
  • 处理框架:Kafka Streams 或 Apache Flink 可用于实时处理和转换 CDC 数据。例如,Kafka Streams 可以将 CDC 数据与其他流连接,过滤掉不必要的字段,或在发送到目标系统之前聚合数据。

消费者处理示例

考虑一个电子商务应用程序,其中需要将客户表的更改同步到搜索引擎以进行实时客户搜索。

  1. 客户表中的更改(例如,更新了客户地址)被发布到 dbserver1.Client 主题。
  2. 一个订阅了 dbserver1.The customer 主题的消费者应用程序读取此事件并进行处理。
  3. 该应用程序更新 Elasticsearch 中相应的客户记录,以便搜索结果反映最新的客户数据。

这种由消费者驱动的方法使得通过向现有 Kafka 主题添加更多消费者来轻松集成新的目标系统,而不会影响上游源数据库或 CDC 管道。

Kafka 中的 CDC 工作流

以下是对 Kafka 中 CDC(变更数据捕获)工作流中每个步骤的更深入的检查,解释了每个阶段如何为系统之间的高效数据同步做出贡献:

1. 捕获

在捕获阶段,像 Debezium 这样的 CDC 连接器会监视源数据库的事务日志以捕获数据更改。事务日志是记录数据库所做的每个事务和更改的专用日志,它提供了一种高效的方式来捕获行级更改,而无需直接查询数据库表。

  • 事务日志:这些日志是数据库特定的,每个日志都会记录插入、更新和删除操作。
  • MySQL:使用二进制日志(binlog)记录所有数据库更改。
  • PostgreSQL:使用预写日志(WAL)跟踪所有更改。
  • Oracle:使用重做日志记录事务。
  • CDC 连接器:CDC 连接器配置为定期读取这些日志,对源数据库的性能影响最小。

在此阶段,CDC 连接器将每次更改捕获为一个事件,并将其转发到 Kafka Connect,准备发布到 Kafka 主题。

2. 发布

在发布阶段,捕获的数据更改将作为事件发布到 Kafka 主题中。每次更改都基于一个 Kafka 消息,该消息包含:

  • 数据操作:指示操作的类型(插入、更新、删除)。
  • 模式信息:有关表结构和数据类型的信息。
  • 前后图像:这些通常包含数据的原始(之前)和更改(之后)版本,允许使用者准确地看到发生了什么变化。

Kafka 主题通常根据数据库和表命名和结构。例如,如果 stock 数据库的 inventory 表发生更改,它可能会发布到 dbserver1.Inventory.Merchandise 这样的主题。这种命名约定有助于有效组织和路由数据更改。通过这种结构,使用者可以订阅感兴趣的特定主题,减少不必要的处理。

  • 分区:主题可以分区以分散负载并提高吞吐量。
  • 保留:Kafka 的保留策略可以配置为将数据保留固定时间,允许重放。

3. 处理

在处理阶段,Kafka Stream 应用程序或其他消费者应用程序会从 Kafka 主题中消费更改事件,并可以在将其传递到目标系统之前根据需要转换、丰富或聚合数据。这个处理层允许使用者实时地塑造和组织数据,从而实现更有效的用例。

  • 丰富:根据现有数据字段,将额外信息添加到事件中,例如客户详细信息或地理信息。
  • 过滤:删除不必要的数据字段或过滤掉不符合特定标准的事件,以便处理最相关的数据。
  • 聚合:对数据进行求和、计数或平均以创建汇总数据。例如,按小时聚合销售数据以实时填充仪表板。

Kafka Streams 是直接在 Kafka 中处理这些差异的流行工具。它是一个轻量级、分布式处理库,允许对数据进行实时处理和转换。此处理还可以包括连接来自多个主题的数据,这对于需要组合数据源的复杂工作流非常有用。

4. 交付

在交付阶段,Kafka 消费者从 Kafka 主题读取处理过的数据,并将更改应用到目标系统。此阶段允许实时更新多个系统,确保它们与源数据库中的最新更改保持同步。

  • 目标系统:目标系统通常是数据库、数据仓库、搜索索引或实时仪表板。
  • 搜索索引:更新 Elasticsearch 等搜索引擎,以根据最新数据提供最新的搜索结果。

Kafka 的消费者组使这一阶段高度可伸缩。多个消费者可以从 Kafka 主题读取,每个消费者可以实现不同的转换、过滤器或目标。

  • 负载均衡:消费者组会自动在可用消费者之间均衡负载,这在处理高吞吐量场景时特别有用。
  • 容错:由于 Kafka 会保留数据一段时间(可配置),因此消费者可以在发生故障时重放消息,确保分布式系统之间的数据一致性和连续性。

每个消费者从当前偏移量读取,这是一个指向最后一个已处理消息的指针。这种方法使得新消费者可以轻松加入,或者失败的消费者可以重新启动并从最后一个成功偏移量赶上,从而确保无缝的数据同步。

使用 Kafka 进行 CDC 的优势

Data Capture in Kafka
  1. 实时数据同步:Kafka CDC 允许近乎实时的数据复制,最大限度地减少延迟并确保数据即时可用。
  2. 实现事件驱动架构:CDC 主要与事件驱动架构相关,因为每次数据更改都可以触发操作、增强应用程序或为分析系统提供数据。
  3. 数据一致性:CDC 与 Kafka 一起确保系统之间始终传播最新的数据状态。
  4. 可伸缩性和容错性:Kafka 的分布式特性确保数据复制可以轻松扩展,并且能够抵抗节点故障。

Kafka 中 CDC 的用例

  1. 数据仓库和分析:将实时数据更改从操作数据库流式传输到数据仓库或分析系统,在那里可以立即查询和分析。
  2. 微服务同步:通过使用 Kafka CDC 事件更新特定于微服务的数据,在微服务之间保持数据同步。
  3. 搜索索引:使用 CDC 填充和维护搜索索引(例如 ElasticSearch),允许搜索应用程序立即查询最新数据。
  4. 审计跟踪和日志记录:捕获发生的更改以创建审计跟踪或执行取证分析,这对于合规性很有用。
  5. 数据迁移:CDC 通过将增量更改从旧数据库流式传输到新数据库,帮助在数据迁移期间减少停机时间,确保数据一致性。

Kafka 中 CDC 的挑战和注意事项

  1. 模式演进:数据库模式会随着时间的推移而改变。Kafka CDC 需要处理模式演进,Debezium 通过监视模式版本来做到这一点。
  2. 数据延迟:虽然 Kafka 提供低延迟数据流,但延迟仍然可能存在,具体取决于网络延迟、数据量和处理时间。
  3. 错误处理和幂等性:CDC 可能会产生重复事件或错误。处理 CDC 数据的应用程序应该是幂等的,确保重复事件不会产生不一致的结果。
  4. 数据安全和隐私:通过 Kafka 流式传输的数据更改可能包含敏感数据,因此在传输中和静态时保护数据并实施访问控制至关重要。

结论

Kafka 结合 CDC 实现了跨系统的实时、可靠和可伸缩的数据复制。通过将更改捕获并作为事件流式传输,它支持诸如数据仓库、搜索索引、微服务同步、审计日志记录等应用程序。