Debezium 用户指南
前言 复制链接链接已复制到粘贴板!
Debezium 是一组分布式服务,用于捕获数据库中的行级更改,以便您的应用程序可以查看并响应这些更改。Debezium 记录提交到每个数据库表的所有行级别更改。每个应用程序都会读取感兴趣的事务日志,以便按照它们发生的顺序查看所有操作。
本指南详细介绍了使用以下 Debezium 主题:
- 第 1 章 Debezium 的高级别概述
- 第 2 章 所需的自定义资源升级
- 第 3 章 Db2 的 Debezium 连接器
- 第 4 章 MongoDB 的 Debezium 连接器
- 第 5 章 MySQL 的 Debezium 连接器
- 第 6 章 Oracle 的 Debezium Connector
- 第 7 章 PostgreSQL 的 Debezium 连接器
- 第 8 章 SQL Server 的 Debezium 连接器
- 第 9 章 监控 Debezium
- 第 10 章 Debezium 日志记录
- 第 11 章 为应用程序配置 Debezium 连接器
- 第 12 章 应用转换以修改使用 Apache Kafka 交换的消息
- 第 13 章 开发 Debezium 自定义数据类型转换器
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
第 1 章 Debezium 的高级别概述 复制链接链接已复制到粘贴板!
Debezium 是一组分布式服务,用于捕获数据库中的更改。您的应用程序可以消耗并响应这些更改。Debezium 在更改事件记录中捕获每个数据库表中的每行级别更改,并将这些记录流传输到 Kafka 主题。应用程序读取这些流,其按生成顺序提供更改事件记录。
在以下部分中提供了更多详细信息:
1.1. Debezium 功能 复制链接链接已复制到粘贴板!
Debezium 是 Apache Kafka Connect 的一组源连接器。每个连接器都使用该数据库的功能更改数据捕获(CDC),从不同数据库更改更改。与其他方法不同,如轮询或双写,基于日志的 CDC (如 Debezium 实施):
- 确保 捕获所有数据更改。
- 生成具有 非常低延迟的 更改事件,同时避免增加频繁轮询所需的 CPU 用量。例如,对于 MySQL 或 PostgreSQL,延迟位于毫秒范围内。
- 不需要更改数据模型,如"Last Updated"列。
- 可以捕获 删除。
- 可以捕获旧的记录状态和其他元数据,如事务 ID,并导致查询,具体取决于数据库的功能和配置。
基于 Log-Based Change Data Capture 的五个 Advantages 是一个博客文章,它提供更多详细信息。
Debezium 连接器使用各种相关功能和选项捕获数据更改:
- 快照: 如果连接器启动且并非所有日志仍然存在,则可以生成数据库当前状态的初始快照。通常,当数据库一段时间运行时,这是这种情况,并丢弃了事务恢复或复制不再需要的事务日志。执行快照的方式有不同的模式,包括对 增量 快照的支持,这些快照可以在连接器运行时触发。如需了解更多详细信息,请参阅您使用的连接器文档。
- 过滤器: 您可以使用 include/exclude 列表过滤器配置捕获的模式、表和列的集合。
- 屏蔽: 特定列中的值可以屏蔽,例如当它们包含敏感数据时。
- 监控 : 大多数连接器可以使用 JMX 监控。
- 随时使用的单个消息 转换(SMT) 用于消息路由、过滤、事件扁平化等。有关 Debezium 提供的 SMT 的更多信息,请参阅 应用转换来修改与 Apache Kafka 交换的消息。
每个连接器的文档提供了有关连接器功能和配置选项的详细信息。
1.2. Debezium 架构描述 复制链接链接已复制到粘贴板!
您可以使用 Apache Kafka Connect 部署 Debezium。Kafka Connect 是一个用于实施和操作的框架和运行时:
- 源连接器,如将记录发送到 Kafka 的 Debezium
- 将记录从 Kafka 主题传播到其他系统的接收器连接器
下图显示了基于 Debezium 的更改数据捕获管道的架构:
如镜像所示,为 MySQL 和 PostgresSQL 部署 Debezium 连接器,以捕获对这两种类型的数据库的更改。每个 Debezium 连接器建立与源数据库的连接:
-
MySQL 连接器使用客户端库来访问
binlog
。 - PostgreSQL 连接器从逻辑复制流读取。
除了 Kafka 代理外,Kafka Connect 作为单独的服务运行。
默认情况下,从一个数据库表中的更改被写入 Kafka 主题,其名称与表名称对应。如果需要,您可以通过配置 Debezium 的主题 路由转换来调整目标主题名称。例如,您可以:
- 将记录路由到名称与表名称不同的主题
- 在一个主题中,多个表的流更改事件记录
在 Apache Kafka 中更改了事件记录后,Kafka Connect eco-system 中的不同连接器可以将记录流传输到其他系统和数据库,如 Elasticsearch、数据科学家和分析系统或 Infinispan 等缓存。根据所选的接收器连接器,您可能需要配置 Debezium 的新记录状态提取 转换。此 Kafka Connect SMT 将 after
结构从 Debezium 的更改事件传播到接收器连接器。这是默认传播的详细更改事件记录。
第 2 章 所需的自定义资源升级 复制链接链接已复制到粘贴板!
Debezium 是一个 Kafka 连接器插件,它部署到在 OpenShift 上的 AMQ Streams 上运行的 Apache Kafka 集群。要准备 OpenShift CRD v1
,在 AMQ Streams 的当前版本中,自定义资源定义(CRD) API 所需的版本现在设置为 v1beta2
。API 的 v1beta2
版本替换了之前支持的 v1beta1
和 v1alpha1
API 版本。对 v1alpha1
和 v1beta1
API 版本的支持现在在 AMQ Streams 中已弃用。这些早期版本现已从大多数 AMQ Streams 自定义资源中删除,包括用来配置 Debezium 连接器的 KafkaConnect 和 KafkaConnector 资源。
基于 v1beta2
API 版本的 CRD 使用 OpenAPI structural 模式。基于被取代的 v1alpha1 或 v1beta1 API 的自定义资源不支持结构模式,并与 AMQ Streams 的当前版本不兼容。在升级到 AMQ Streams2.3 之前,您必须升级现有的自定义资源以使用 API 版本 kafka.strimzi.io/v1beta2
。在升级到 AMQ Streams 1.7 后,您可以随时升级自定义资源。在升级到 AMQ Streams2.3 或更新版本前,您必须完成 v1beta2 API 的升级。
为了便于对 CRD 和自定义资源进行升级,AMQ Streams 提供了一个 API 转换工具,可自动将它们升级到与 v1beta2
兼容的格式。有关该工具以及如何升级 AMQ Streams 的完整说明,请参阅在 OpenShift 中部署和升级 AMQ Streams。
更新自定义资源的要求只适用于在 OpenShift 上的 AMQ Streams 上运行的 Debezium 部署。要求不适用于 Red Hat Enterprise Linux 上的 Debezium
第 3 章 Db2 的 Debezium 连接器 复制链接链接已复制到粘贴板!
Debezium 的 Db2 连接器可以捕获 Db2 数据库表中的行级更改。有关与此连接器兼容的 Db2 数据库版本的详情,请参考 Debezium 支持的配置页面。
这个连接器主要由 SQL Server 的 Debezium 实施而利用,它使用基于 SQL 的轮询模型将表置于"捕获模式"。当表处于捕获模式时,Debebe Db2 连接器会为该表的每一行级更新生成并流传输更改事件。
处于捕获模式的表具有一个关联的 change-data 表,Db2 创建它。对于处于捕获模式的表的每个更改,Db2 都会向表的相关 change-data 表添加有关该更改的数据。change-data 表包含一行状态的条目。它还具有用于删除的特殊条目。Debezium Db2 连接器从 change-data 表中读取更改事件,并将事件发送到 Kafka 主题。
当 Debezium Db2 连接器连接到 Db2 数据库时,连接器会读取连接器配置为捕获更改的表的一致性快照。默认情况下,这是所有非系统表。有连接器配置属性,允许您指定要放入捕获模式的表,或者从捕获模式中排除哪些表。
快照完成后,连接器开始向处于捕获模式的表发出提交更新的更改事件。默认情况下,更改特定表的事件进入一个 Kafka 主题,其名称与表相同。应用程序和服务消耗从这些主题更改事件。
连接器需要使用抽象语法表示法(ASN)库,该库作为 Linux 的 Db2 的标准部分提供。要使用 ASN 库,您必须有 IBM InfoSphere Data Replication (IIDR)的许可证。您不必安装 IIDR 来使用 ASN 库。
使用 Debezium Db2 连接器的信息和流程进行组织如下:
3.1. Debezium Db2 连接器概述 复制链接链接已复制到粘贴板!
Debezium Db2 连接器基于 ASN Capture/Apply 代理,用于在 Db2 中启用 SQL 复制。捕获代理:
- 为处于捕获模式的表生成 change-data 表。
- 以捕获模式监控表,并将更改事件存储在对应的 change-data 表中。
Debezium 连接器使用 SQL 接口来查询 change-data 表以更改事件。
数据库管理员必须将要捕获更改的表置于捕获模式。为方便起见,在 C 中有 Debezium 管理用户定义的功能(UDF),您可以编译,然后使用 进行以下管理任务:
- 启动、停止和重新初始化 ASN 代理
- 将表置于捕获模式
- 创建复制(ASN)模式和 change-data 表
- 从捕获模式中删除表
或者,您可以使用 Db2 控制命令来完成这些任务。
在感兴趣的表处于捕获模式后,连接器会读取对应的 change-data 表,以获取表更新的更改事件。连接器会为每行级别的插入、更新和删除操作发出一个更改事件到与更改表相同的 Kafka 主题。这是您可以修改的默认行为。客户端应用程序读取与感兴趣的数据库表对应的 Kafka 主题,并可响应每行级别的更改事件。
通常,数据库管理员在表生命周期中将表置于捕获模式。这意味着连接器没有对表所做的任何更改的完整历史记录。因此,当 Db2 连接器第一次连接到特定的 Db2 数据库时,它首先对处于捕获模式的每个表执行 一致的快照。连接器完成快照后,连接器流会从进行快照的点更改事件。这样,连接器从处于捕获模式的表的统一视图开始,且不会丢弃执行快照时所做的任何更改。
Debezium 连接器可以容错失败。当连接器读取并生成更改事件时,它会记录 change-data 表条目的日志序列号(LSN)。LSN 是更改事件在数据库日志中的位置。如果连接器因任何原因而停止,包括通信失败、网络问题或崩溃,则继续读取它离开的 change-data 表。这包括快照。也就是说,如果连接器在重启连接器开始新快照时没有完成快照。
3.2. Debezium Db2 连接器如何工作 复制链接链接已复制到粘贴板!
为了最佳配置和运行 Debezium Db2 连接器,了解连接器如何执行快照、流更改事件、决定 Kafka 主题名称以及处理架构更改会很有帮助。
详情包括在以下主题中:
3.2.1. Debezium Db2 连接器如何执行数据库快照 复制链接链接已复制到粘贴板!
Db2 的复制功能不是存储数据库更改的完整历史记录。因此,当 Debezium Db2 连接器第一次连接到数据库时,它会生成处于捕获模式的表快照,并将这个状态流传输到 Kafka。这会为表内容建立基准。
默认情况下,当 Db2 连接器执行快照时,它会执行以下操作:
-
确定哪些表处于捕获模式,因此必须包含在快照中。默认情况下,所有非系统表都处于捕获模式。连接器配置属性,如
table.exclude.list
和table.include.list
,允许您指定哪些表应处于捕获模式。 -
以捕获模式获取每个表的锁定。这样可确保在快照期间不会在这些表中发生架构更改。锁定的级别由
snapshot.isolation.mode
连接器配置属性决定。 - 在服务器的事务日志中读取最高(最新)LSN 位置。
- 捕获处于捕获模式的所有表的模式。连接器在其内部数据库模式历史记录主题中保留此信息。
- 可选,释放在第 2 步中获取的锁定。通常,这些锁定只会在短时间内保留。
在第 3 步中读取的 LSN 位置中,连接器会扫描捕获模式表及其模式。在扫描过程中,连接器:
- 确认在快照开始前创建了表。如果没有,则快照将跳过该表。快照完成后,连接器开始发出更改事件,连接器会为快照期间创建的任何表生成更改事件。
- 为处于捕获模式的每个行生成 读取 事件。所有 读取 事件都包含相同的 LSN 位置,这是在第 3 步中获取的 LSN 位置。
- 将每个 读取 事件发送到与表同名的 Kafka 主题。
- 在连接器偏移中记录成功完成快照。
3.2.1.1. 临时快照 复制链接链接已复制到粘贴板!
默认情况下,连接器仅在首次启动后运行初始快照操作。在正常情况下,遵循这个初始快照,连接器不会重复快照过程。连接器捕获的任何将来更改事件数据都仅通过流传输过程。
然而,在某些情况下,连接器在初始快照期间获取的数据可能会变得过时、丢失或不完整。为了提供总结表数据的机制,Debezium 包含一个执行临时快照的选项。数据库中的以下更改可能是执行临时快照:
- 连接器配置会被修改为捕获不同的表集合。
- Kafka 主题已删除,必须重建。
- 由于配置错误或某些其他问题导致数据损坏。
您可以通过启动所谓的 临时命令快照,为之前捕获的快照重新运行快照。临时快照需要使用 信号表。您可以通过向 Debezium 信号表发送信号请求来启动临时快照。
当您启动现有表的临时快照时,连接器会将内容附加到表已存在的主题中。如果删除了之前存在的主题,如果启用自动主题创建,Debezium 可以自动创建主题。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#customization-of-kafka-connect-automatic-topic-creation
临时快照信号指定要包含在快照中的表。快照可以捕获数据库的整个内容,或者只捕获数据库中表的子集。另外,快照也可以捕获数据库中表内容的子集。
您可以通过向信号表发送 execute-snapshot
消息来指定要捕获的表。将 execute-snapshot
信号的类型设置为增量
,并提供快照中包含的表名称,如下表所述:
字段 | 默认 | 值 |
---|---|---|
|
|
指定您要运行的快照类型。 |
| 不适用 |
包含与要快照的表的完全限定域名匹配的正则表达式的数组。 |
| 不适用 | 可选字符串,它根据表的列指定条件,用于捕获表内容的子集。 |
触发临时快照
您可以通过在信号表中添加带有 execute-snapshot
信号类型的条目来启动临时快照。连接器处理消息后,它会开始快照操作。快照过程读取第一个和最后一个主密钥值,并使用这些值作为每个表的开头和端点。根据表中的条目数量以及配置的块大小,Debezium 将表分成块,并一次为每个块进行快照。
3.2.1.2. 增量快照 复制链接链接已复制到粘贴板!
为了提供管理快照的灵活性,Debezium 包括一个补充的快照机制,称为 增量快照。增量快照依赖于 Debezium 机制 向 Debezium 连接器发送信号。
在增量快照中,而不是一次性捕获数据库的完整状态,如初始快照,Debezium 以一系列可配置的块的形式捕获每个表。您可以指定您希望快照捕获的表,以及每个块的大小。块大小决定了快照在数据库的每个获取操作期间收集的行数。增量快照的默认块大小为 1 KB。
当增量快照进行时,Debezium 使用水位线来跟踪其进度,维护它捕获的每一个表行的记录。这个阶段捕获数据的方法比标准初始快照过程提供以下优点:
- 您可以使用流化数据捕获并行运行增量快照,而不是经过发布流,直到快照完成为止。连接器会继续在整个快照过程中从更改日志捕获接近实时事件,且操作都不会阻断其他事件。
- 如果增量快照的进度中断,您可以在不丢失任何数据的情况下恢复它。在进程恢复后,快照从停止的时间开始,而不是从开始重新定义表。
-
您可以随时根据需要运行增量快照,并根据需要重复这个过程以适应数据库更新。例如,您可以在修改连接器配置后重新运行快照,以将表添加到其
table.include.list
属性中。
增量快照过程
当您运行增量快照时,Debezium 按主密钥对表进行排序,然后根据 配置的块大小 将表分成块。然后,按块使用块,然后在块中捕获每个表行。对于它捕获的每行,快照会发出 READ
事件。该事件代表了块开始快照时的行值。
当快照继续进行时,其他进程可能会继续访问数据库,从而可能会修改表记录。要反映此类更改,INSERT
、UPDATE
或 DELETE
操作会照常提交到事务日志中。同样,持续 Debezium 流过程还会继续检测这些更改事件,并将对应的更改事件记录发送到 Kafka。
Debezium 如何使用相同的主密钥解决记录间的冲突
在某些情况下,流传输进程发出的 UPDATE
或 DELETE
事件会耗尽序列。也就是说,流过程可能会发出一个事件,它会在快照捕获包含该行的 READ
事件之前修改表行。当快照最终会为行发出对应的 READ
事件时,其值已经被替换。为确保以正确的逻辑顺序处理到达序列的增量快照事件,Debezium 会使用一种缓冲区方案来解决冲突。只有在快照事件和流事件间冲突时才解决后,Debezium 会向 Kafka 发送事件记录。
快照窗口
为了帮助解决后续 READ
事件和修改同一表行的流事件之间的冲突,Debezium 采用所谓的 快照窗口。快照窗口分离了增量快照捕获指定表块的数据的时间间隔。在打开块的快照窗口前,Debebe 会遵循其常见的行为,并将事件直接从事务日志直接降级到目标 Kafka 主题。但是,从打开特定块的快照时,Debebe 会执行重复数据删除步骤,以解决具有相同主密钥的事件之间冲突。
对于每个数据收集,Debezium 会发出两种类型的事件,并将其记录存储在单个目标 Kafka 主题中。它直接从表中捕获的快照记录作为 READ
操作发出。同时,当用户继续更新数据收集中的记录,并更新事务日志以反映每个提交,Debezium 会为每个更改发出 UPDATE
或 DELETE
操作。
当快照窗口打开时,Debezium 开始处理快照块,它会将快照记录提供给内存缓冲区。在快照窗口中,缓冲区中 READ
事件的主键将与传入流事件的主键进行比较。如果没有找到匹配项,流的事件记录将直接发送到 Kafka。如果 Debezium 检测到匹配项,它会丢弃缓冲的 READ
事件,并将流的记录写入目标主题,因为流的事件逻辑地替换静态快照事件。在块的快照窗口关闭后,缓冲区仅包含没有相关事务日志事件的 READ
事件。Debezium 将这些剩余的 READ
事件发送到表的 Kafka 主题。
连接器重复每个快照块的进程。
Db2 的 Debezium 连接器不支持增量快照运行时的 schema 更改。
3.2.1.3. 触发增量快照 复制链接链接已复制到粘贴板!
目前,启动增量快照的唯一方法是向源数据库上的 信号发送临时快照 信号。
您可以以 SQL INSERT
查询形式向信号表提交信号。
在 Debezium 检测到信号表中的更改后,它会读取信号,并运行请求的快照操作。
您提交的查询指定要包含在快照中的表,以及可选的指定快照操作类型。目前,快照操作的唯一有效选项是默认值 增量
。
要指定快照中包含的表,请提供一个 data-collections
数组,该数组列出了用于匹配表的表或一组正则表达式,例如:
{"data-collections": ["public.MyFirstTable", "public.MySecondTable"]}
增量快照信号的 data-collections
数组没有默认值。如果 data-collections
数组为空,Debezium 会检测到不需要任何操作,且不执行快照。
如果要包含在快照中的表名称包含数据库、模式或表名称的句点(.
),要将表添加到 data-collections
数组中,您必须用双引号转义名称的每个部分。
例如,若要包含 公共
模式中存在的表,并且名为 My.Table
,请使用以下格式:" public"."My.Table
"。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
发送 SQL 查询,将临时增量快照请求添加到信号表中:
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令中的
id
、type
和data
参数的值对应于 信号表的字段。下表描述了示例中的参数:
Expand 表 3.2. 向信号表发送增量快照信号的 SQL 命令中的字段描述 项 值 描述 1
myschema.debezium_signal
指定源数据库上信号表的完全限定名称。
2
ad-hoc-1
id
参数指定分配给信号请求的id
标识符的任意字符串。
使用此字符串来标识到信号表中条目的日志消息。Debezium 不使用此字符串。相反,在快照中,Debebe 会生成自己的id
字符串作为水位信号。3
execute-snapshot
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段所需的组件,用于指定表名称或正则表达式数组,以匹配快照中包含的表名称。
数组列出了根据完全限定名称匹配表的正则表达式,其格式与您用来指定signal.data.collection
配置属性中的连接器信号表的名称相同。5
增量
信号的
data
字段的可选类型
组件,用于指定要运行的快照操作类型。
目前,唯一有效选项是默认值增量
。
如果没有指定值,连接器将运行一个增量快照。6
additional-condition
可选字符串,它根据表的列指定条件,用于捕获表内容的子集。有关
additional-condition
参数的详情请参考带有额外条件
的临时增量快照。
带有额外条件
的临时增量快照
如果您希望快照在表中仅包含内容子集,您可以通过将 additional-condition
参数附加到快照信号来修改信号请求。
典型的快照的 SQL 查询采用以下格式:
SELECT * FROM <tableName> ....
SELECT * FROM <tableName> ....
通过添加 additional-condition
参数,您可以将 WHERE
条件附加到 SQL 查询中,如下例所示:
SELECT * FROM <tableName> WHERE <additional-condition> ....
SELECT * FROM <tableName> WHERE <additional-condition> ....
以下示例显示了向信号表发送带有额外条件的临时增量快照请求的 SQL 查询:
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
例如,假设您有一个包含以下列的产品表:
-
id
(主密钥) -
color
-
quantity
如果您希望 product 表的增量快照只包含 color=blue
的数据项,您可以使用以下 SQL 语句来触发快照:
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue"}');
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue"}');
additional-condition
参数还允许您传递基于多个列的条件。例如,使用上例中的 product 表,您可以提交查询来触发增量快照,该快照仅包含那些项目的 data =blue
和 quantity>10
:
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue AND quantity>10"}');
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue AND quantity>10"}');
以下示例显示了连接器捕获的增量快照事件的 JSON。
示例:增加快照事件信息
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定要运行的快照操作类型。 |
2 |
|
指定事件类型。 |
3.2.1.4. 停止增量快照 复制链接链接已复制到粘贴板!
您还可以通过向源数据库上的表发送信号来停止增量快照。您可以通过发送 SQL INSERT
查询,向表提交停止快照信号。
在 Debezium 检测到信号表中的更改后,它会读取信号,并在进行时停止增量快照操作。
您提交的查询指定了 增量
的快照操作,以及可选的、要删除的当前运行快照的表。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
发送 SQL 查询以停止临时增量快照到信号表:
INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<tableName>","<tableName>"],"type":"incremental"}');
INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<tableName>","<tableName>"],"type":"incremental"}');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
INSERT INTO myschema.debezium_signal (id, type, data) values ('ad-hoc-1', 'stop-snapshot', '{"data-collections": ["schema1.table1", "schema2.table2"], "type":"incremental"}');
INSERT INTO myschema.debezium_signal (id, type, data)
1 values ('ad-hoc-1',
2 'stop-snapshot',
3 '{"data-collections": ["schema1.table1", "schema2.table2"],
4 "type":"incremental"}');
5 Copy to Clipboard Copied! Toggle word wrap Toggle overflow signal 命令中的
id
、type
和data
参数的值对应于 信号表的字段。下表描述了示例中的参数:
Expand 表 3.3. 向信号表发送停止增量快照信号的 SQL 命令中的字段描述 项 值 描述 1
myschema.debezium_signal
指定源数据库上信号表的完全限定名称。
2
ad-hoc-1
id
参数指定分配给信号请求的id
标识符的任意字符串。
使用此字符串来标识到信号表中条目的日志消息。Debezium 不使用此字符串。3
stop-snapshot
指定
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段的可选组件,用于指定表名称或正则表达式数组,以匹配要从快照中删除的表名称。
数组列出了根据完全限定名称匹配表的正则表达式,其格式与您用来指定signal.data.collection
配置属性中的连接器信号表的名称相同。如果省略了data
字段的此组件,则信号将停止正在进行的整个增量快照。5
增量
信号的
data
字段所需的组件,用于指定要停止的快照操作类型。
目前,唯一有效选项是增量的
。
如果没有指定类型
值,则信号无法停止增量快照。
3.2.2. Debezium Db2 连接器如何读取更改数据表 复制链接链接已复制到粘贴板!
完成快照后,当 Debezium Db2 连接器首次启动后,连接器会标识处于捕获模式的每个源表的 change-data 表。连接器为每个 change-data 表执行以下操作:
- 读取上次存储、最高 LSN 和当前最高 LSN 之间创建的更改事件。
- 根据提交 LSN 和每个事件的更改 LSN 排序更改事件。这样可确保连接器按表更改的顺序发出更改事件。
- 将提交并更改 LSNs 作为偏移到 Kafka Connect。
- 存储连接器传递给 Kafka Connect 的最高 LSN。
重启后,连接器会从关闭的偏移(提交并更改 LSN)中恢复发出更改事件。当连接器正在运行并发出更改事件时,如果您从捕获模式中删除表,或者添加表来捕获模式,连接器会检测到更改并相应地修改其行为。
3.2.3. 接收 Debezium Db2 更改事件记录的 Kafka 主题默认名称 复制链接链接已复制到粘贴板!
默认情况下,Db2 连接器将表中发生的所有 INSERT
、UPDATE
和 DELETE
操作的更改事件写入特定于该表的单个 Apache Kafka 主题。连接器使用以下惯例命名更改事件主题:
topicPrefix.schemaName.tableName
以下列表提供默认名称组件的定义:
- topicPrefix
-
由
topic.prefix
连接器配置属性指定的主题前缀。 - schemaName
- 在其中操作的 schema 的名称。
- tableName
- 操作发生的表的名称。
例如,一个使用 mydatabase
数据库的 Db2 安装,其中包含四个表:PRODUCTS
, PRODUCTS_ON_HAND
, CUSTOMERS
, 和 ORDERS
,它们包括在 MYSCHEMA
schema 中。连接器会将事件发送到这四个 Kafka 主题:
-
mydatabase.MYSCHEMA.PRODUCTS
-
mydatabase.MYSCHEMA.PRODUCTS_ON_HAND
-
mydatabase.MYSCHEMA.CUSTOMERS
-
mydatabase.MYSCHEMA.ORDERS
连接器应用类似的命名约定来标记其内部数据库架构历史记录主题、架构更改主题 以及 事务元数据主题。
如果默认主题名称不满足您的要求,您可以配置自定义主题名称。要配置自定义主题名称,您可以在逻辑主题路由 SMT 中指定正则表达式。有关使用逻辑主题路由 SMT 自定义主题命名的更多信息,请参阅 主题路由。
3.2.4. 关于 Debezium Db2 连接器模式更改主题 复制链接链接已复制到粘贴板!
您可以配置 Debezium Db2 连接器来生成 schema 更改事件,该事件描述了应用于数据库中捕获的表的 schema 更改。
Debezium 在以下情况下向 schema 更改主题发送信息:
- 新表进入捕获模式。
- 表已从捕获模式中删除。
- 在 数据库 schema 更新过程中,表在捕获模式下有变化。
连接器将模式更改事件改为 Kafka 模式更改主题,其名称为 < topicPrefix&
gt;,其中 < ;topicPrefix
> 是 topic.prefix
connector 配置属性中指定的主题前缀。连接器发送到 schema 更改主题的消息包含以下元素的有效负载:
databaseName
-
将语句应用到的数据库的名称。
databaseName
的值充当 message 键。 pos
- 出现语句的 binlog 中的位置。
tableChanges
-
模式更改后整个表架构的结构化表示。
tableChanges
字段包含一个数组,其中包含表中的每个列的条目。由于结构化表示以 JSON 或 Avro 格式呈现数据,因此用户可以轻松地读取消息,而无需首先通过 DDL 解析程序处理它们。
对于处于捕获模式的表,连接器不仅将架构更改的历史记录存储在架构更改主题中,也存储在内部数据库架构历史记录主题中。内部数据库架构历史记录主题仅用于连接器,它不用于直接使用应用程序。确保需要有关架构的通知的应用程序只消耗了该模式的更改主题的信息。
永不对数据库架构历史记录进行分区。要使数据库架构历史记录主题正常工作,它必须维护连接器向其发出的事件记录的一致性全局顺序。
要确保主题不在分区中分割,请使用以下方法之一为主题设置分区计数:
-
如果您手动创建数据库模式历史记录主题,请指定分区计数
1
。 -
如果您使用 Apache Kafka 代理自动创建数据库架构历史记录主题,则创建主题,将 Kafka
num.partitions
配置选项 的值设置为1
。
连接器发送到其架构更改主题的消息格式处于 incubating 状态,在没有通知的情况下可能会改变。
示例:发送到 Db2 连接器模式更改主题的消息
以下示例显示了 schema 更改主题中的消息。消息包含表模式的逻辑表示。
项 | 字段名称 | 描述 |
---|---|---|
1 |
| 显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 在源对象中,ts_ms 表示数据库中更改的时间。通过将 payload.source.ts_ms 的值与 payload.ts_ms 的值进行比较,您可以确定源数据库更新和 Debezium 之间的滞后。 |
2 |
| 标识包含更改的数据库和 schema。 |
3 |
|
对于 Db2 连接器,始终为 |
4 |
| 包含 DDL 命令生成的模式更改的一个或多个项目的数组。 |
5 |
| 描述更改的类型。该值是以下之一:
|
6 |
| 创建、更改或丢弃的表的完整标识符。 |
7 |
| 应用更改后代表表元数据。 |
8 |
| 编写表主密钥的列列表。 |
9 |
| 更改表中的每个列的元数据。 |
10 |
| 每个表更改的自定义属性元数据。 |
在连接器发送到 schema 更改主题的消息中,message 键是包含架构更改的数据库的名称。在以下示例中,payload
字段包含键:
3.2.5. Debezium Db2 连接器生成的事件代表事务边界 复制链接链接已复制到粘贴板!
Debezium 可以生成代表事务边界的事件,并增强更改数据事件消息。
Debezium 仅在部署连接器后为发生的事务注册并接收元数据。部署连接器前发生的事务元数据。
Debezium 为每个事务生成 BEGIN
和 END
分隔符的事务边界事件。事务边界事件包含以下字段:
status
-
BEGIN
或END
。 id
- 唯一事务标识符的字符串表示。
ts_ms
-
数据源上事务边界事件(
BEGIN
或END
事件)的时间。如果数据源没有向 Debezium 提供事件时间,则该字段代表 Debezium 处理事件的时间。 event_count
(用于END
事件)- 事务所设计的事件总数。
data_collections
(用于END
事件)-
data_collection
和event_count
元素的一组对,指示连接器为来自数据收集的更改发出的事件数。
示例
除非通过 topic.transaction
选项覆盖,否则连接器会将事务事件发送到 < topic.prefix>
.transaction
主题。
数据更改事件增强
当启用事务元数据时,连接器会使用新的 transaction
字段增强更改事件 Envelope
。此字段以字段复合的形式提供有关每个事件的信息:
id
- 唯一事务标识符的字符串表示。
total_order
- 事件在事务生成的所有事件的绝对路径。
data_collection_order
- 事件在事务发送的所有事件中每个数据收集位置。
以下是消息的示例:
3.3. Debezium Db2 连接器数据更改事件的描述 复制链接链接已复制到粘贴板!
Debezium Db2 连接器会为每行级别 INSERT
、UPDATE
和 DELETE
操作生成数据更改事件。每个事件都包含一个键和值。键和值的结构取决于更改的表。
Debezium 和 Kafka Connect 围绕 事件消息的持续流 设计。但是,这些事件的结构可能会随时间而变化,而用户很难处理这些事件。要解决这个问题,每个事件都包含其内容的 schema,或者如果您使用 schema registry,则消费者可以从 registry 获取 schema 的模式 ID。这使得每个事件都可以自我包含。
以下框架 JSON 显示更改事件的基本四个部分。但是,如何配置在应用程序中使用的 Kafka Connect converter 决定了更改事件中的这四个部分的表示。只有当您将转换器配置为生成它时,schema
字段才处于更改事件中。同样,只有在将转换器配置为生成它时,才会发生更改事件中的事件密钥和事件有效负载。如果您使用 JSON 转换器,并将其配置为生成所有四个基本更改事件部分,则更改事件具有此结构:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
第一个 |
2 |
|
第一个 |
3 |
|
第二个 |
4 |
|
第二个 |
默认情况下,连接器流将事件记录更改为名称与事件原始表相同的名称的主题。如需更多信息,请参阅 主题名称。
Debezium Db2 连接器确保所有 Kafka Connect 模式名称都遵循 Avro 模式名称格式。这意味着,逻辑服务器名称必须以拉丁或下划线开头,即 a-z、A-Z 或 _。逻辑服务器名称中的每个剩余的字符以及数据库和表名称中的每个字符都必须是字母、数字或下划线,即 a-z、A-Z、0-9 或 \_。如果存在无效的字符,它将替换为下划线字符。
如果逻辑服务器名称、数据库名称或表名称包含无效字符,且区分另一个名称的唯一字符无效,则可能会导致意外冲突,因此替换为下划线。
另外,对于数据库、模式和表的 Db2 名称可能区分大小写。这意味着连接器可能会向同一 Kafka 主题发出多个表的事件记录。
详情包括在以下主题中:
3.3.1. 关于 Debezium db2 中的键更改事件 复制链接链接已复制到粘贴板!
更改事件的密钥包含更改表的密钥的 schema,以及更改的行的实际键。在连接器创建事件时,模式及其对应有效负载都包含更改表的 PRIMARY KEY
(或唯一约束)中的每个列的字段。
请考虑以下 客户
表,然后是此表的更改事件键示例。
表示例
更改事件键示例
捕获对 customers
表的更改的每个更改事件都有相同的事件键模式。只要
表有以前的定义,捕获 customer 表更改的事件都有以下关键结构:在 JSON 中,它类似如下:
customers
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
键的 schema 部分指定一个 Kafka Connect 模式,它描述了密钥 |
2 |
|
指定 |
3 |
|
指明 event 键必须在其 |
4 |
|
定义密钥有效负载结构的 schema 名称。这个模式描述了更改的表的主键的结构。键架构名称的格式为 connector-name.database-name.table-name.
|
5 |
|
包含生成此更改事件的行的键。在本例中,键包含一个 |
3.3.2. 关于 Debezium Db2 更改事件中的值 复制链接链接已复制到粘贴板!
更改事件中的值比键稍微复杂。与键一样,该值具有 schema
部分和 payload
部分。schema
部分包含描述 payload
部分的 Envelope
结构的 schema,包括其嵌套字段。更改创建、更新或删除数据的事件,并且具有 envelope 结构的值有效负载。
考虑用于显示更改事件键示例的相同示例:
表示例
customers
表的每个更改事件的事件值部分都指定了相同的模式。事件值的有效负载因事件类型而异:
创建 事件
以下示例显示了连接器为在 customer 表中创建数据的操作生成的更改事件的值部分:
项 | 字段名称 | 描述 |
---|---|---|
1 |
| 值的 schema,用于描述值有效负载的结构。每次连接器为特定表生成的更改时,更改事件的值模式都是相同的。 |
2 |
|
在 |
3 |
|
|
4 |
|
|
5 |
|
值的实际数据。这是更改事件提供的信息。 |
6 |
|
指定事件发生前行状态的可选字段。当 |
7 |
|
指定事件发生后行状态的可选字段。在本例中, |
8 |
|
描述事件源元数据的必需字段。
|
9 |
|
描述导致连接器生成事件的操作类型的必要字符串。在本例中,
|
10 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
更新 事件
示例 customer 表中更新的更改事件值与该表的 create 事件相同。同样,update 事件值的有效负载具有相同的结构。但是,事件值 payload 在更新 事件中包含不同的值。以下是连接器在
customers
表中为更新生成的更改事件值示例:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定事件发生前行状态的可选字段。在 update 事件值中, |
2 |
|
指定事件发生后行状态的可选字段。您可以比较 |
3 |
|
描述事件源元数据的必需字段。
|
4 |
|
描述操作类型的强制字符串。在 update 事件值中, |
5 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
更新行的主/唯一键的列会更改行键的值。当键更改时,Debebe 会输出 三个 事件: DELETE
事件和带有行的旧键的 tombstone 事件,后跟带有行的新键的事件。
删除 事件
delete 更改事件中的值与为同一表的 create 和 update 事件相同的 schema
部分。示例 customer
表的 delete 事件中的事件值 payload
类似如下:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定事件发生前行状态的可选字段。在一个 delete 事件值中, |
2 |
|
指定事件发生后行状态的可选字段。在 delete 事件值中, |
3 |
|
描述事件源元数据的必需字段。在一个 delete 事件值中,
|
4 |
|
描述操作类型的强制字符串。 |
5 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
删除 更改事件记录为消费者提供处理此行删除所需的信息。包括了旧值,因为有些使用者可能需要它们才能正确处理删除。
Db2 连接器事件旨在用于 Kafka 日志压缩。只要每个密钥至少保留最新的消息,日志压缩就可以删除一些旧的消息。这可让 Kafka 回收存储空间,同时确保主题包含完整的数据集,并可用于重新载入基于密钥的状态。
删除行时,delete 事件值仍可用于日志压缩,因为 Kafka 您可以删除具有相同键的所有之前信息。但是,如果 Kafka 删除具有相同键的所有消息,消息值必须是 null
。为了实现此目的,在 Debezium 的 Db2 连接器发出 delete 事件后,连接器会发出一个特殊的 tombstone 事件,它具有相同的键有一个 null
值 。
3.4. Debezium Db2 连接器如何映射数据类型 复制链接链接已复制到粘贴板!
Db2 的数据类型在 Db2 SQL 数据类型 中进行了描述。
Db2 连接器代表对带有类似于行存在的表的事件的更改。event 包含每个列值的字段。该值在事件中如何代表取决于该列的 Db2 数据类型。这部分论述了这些映射。如果默认数据类型转换无法满足您的需要,您可以为连接器 创建自定义转换器。
详情包括在以下部分:
基本类型
下表描述了连接器如何将每个 Db2 数据类型映射到 字面类型和 事件字段中 的语义类型。
-
literal type 描述了如何使用 Kafka Connect 模式类型来表示:
INT8
,INT16
,INT32
,INT64
,FLOAT32
,FLOAT64
,BOOLEAN
,STRING
,BYTES
, ARRAY,
MAP
, 和STRUCT
。 - 语义类型 描述了 Kafka Connect 模式如何使用字段名称来捕获字段 的含义。
Db2 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
| 只能从具有 BOOLEAN 类型列的表中获取快照。目前,Db2 上的 SQL Replication 不支持 BOOLEAN,因此 Debezium 无法在这些表上执行 CDC。考虑使用不同的类型。 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
|
|
|
|
|
|
|
|
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
|
|
|
|
|
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
|
|
如果存在,列的默认值会被传播到对应的字段的 Kafka Connect 模式。更改事件包含字段的默认值,除非给出了显式列值。因此,很少需要从 schema 获取默认值。
临时类型
除 Db2 的 DATETIMEOFFSET
数据类型外,其中包含时区信息,如何映射 temporal 类型取决于 time.precision.mode
连接器配置属性的值。以下小节描述了这些映射:
time.precision.mode=adaptive
当 time.precision.mode
配置属性设为 adaptive
时,默认连接器根据列的数据类型定义决定字面类型和语义类型。这样可确保事件 完全 表示数据库中的值。
Db2 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
time.precision.mode=connect
当 time.precision.mode
配置属性设为 connect
时,连接器将使用 Kafka Connect 逻辑类型。当消费者只能处理内置的 Kafka Connect 逻辑类型且无法处理变量精度时间值时,这很有用。但是,因为 Db2 支持十分之一微秒的精度,使用 connect
时间精度的连接器会在数据库列带有 fractional second precision 值大于 3 时,导致精度下降。
Db2 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
|
|
|
时间戳类型
DATETIME
类型代表没有时区信息的时间戳。这些列根据 UTC 转换为等同的 Kafka Connect 值。例如,DATETIME
值 "2018-06-20 15:13:16.945104" 由 io.debezium.time.Timestamp
代表,值为 "1539)07596000"。
运行 Kafka Connect 和 Debezium 的 JVM 的时区不会影响这个转换。
Db2 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
3.5. 设置 Db2 以运行 Debezium 连接器 复制链接链接已复制到粘贴板!
要使 Debezium 捕获提交到 Db2 表的更改事件,具有所需特权的 Db2 数据库管理员必须在数据库中配置表以更改数据捕获。开始运行 Debezium 后,您可以调整捕获代理的配置以优化性能。
有关为 Debezium 连接器设置 Db2 的详情,请查看以下部分:
3.5.1. 配置 Db2 表以更改数据捕获 复制链接链接已复制到粘贴板!
要将表置于捕获模式,Debezium 提供了一组用户定义的功能(UDF)。此处的步骤演示了如何安装和运行这些管理 UDF。或者,您可以运行 Db2 控制命令将表置于捕获模式。然后,管理员必须为希望 Debezium 捕获的每个表启用 CDC。
先决条件
-
以
db2instl
用户身份登录 Db2。 - 在 Db2 主机上,Debebe 管理 UDF 在 $HOME/asncdctools/src 目录中提供。UDF 可从 Debezium 示例存储库 获得。
流程
使用 Db2 提供的
bldrtn
命令编译 Db2 服务器主机上的 Debezium 管理 UDF:cd $HOME/asncdctools/src
cd $HOME/asncdctools/src
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ./bldrtn asncdc
./bldrtn asncdc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动数据库(如果还没有运行)。将
DB_NAME
替换为您希望 Debezium 连接到的数据库的名称。db2 start db DB_NAME
db2 start db DB_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保 JDBC 可以读取 Db2 元数据目录:
cd $HOME/sqllib/bnd
cd $HOME/sqllib/bnd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow db2 bind db2schema.bnd blocking all grant public sqlerror continue
db2 bind db2schema.bnd blocking all grant public sqlerror continue
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保数据库最近备份。ASN 代理必须具有从中读取的最新起点。如果您需要执行备份,请运行以下命令,它会修剪数据,以便只有最新版本可用。如果您不不需要保留旧版本的数据,请为备份位置指定
dev/null
。备份数据库。将
DB_NAME
和BACK_UP_LOCATION
替换为适当的值:db2 backup db DB_NAME to BACK_UP_LOCATION
db2 backup db DB_NAME to BACK_UP_LOCATION
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启数据库:
db2 restart db DB_NAME
db2 restart db DB_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
连接到数据库,以安装 Debezium 管理 UDF。假设您以
db2instl
用户身份登录,因此应在db2inst1
用户上安装 UDF。db2 connect to DB_NAME
db2 connect to DB_NAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 复制 Debezium 管理 UDF 并为它们设置权限:
cp $HOME/asncdctools/src/asncdc $HOME/sqllib/function
cp $HOME/asncdctools/src/asncdc $HOME/sqllib/function
Copy to Clipboard Copied! Toggle word wrap Toggle overflow chmod 777 $HOME/sqllib/function
chmod 777 $HOME/sqllib/function
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用用于启动和停止 ASN 捕获代理的 Debezium UDF:
db2 -tvmf $HOME/asncdctools/src/asncdc_UDF.sql
db2 -tvmf $HOME/asncdctools/src/asncdc_UDF.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 ASN 控制表:
db2 -tvmf $HOME/asncdctools/src/asncdctables.sql
$ db2 -tvmf $HOME/asncdctools/src/asncdctables.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用 Debezium UDF 来添加表来捕获模式并从捕获模式中删除表:
db2 -tvmf $HOME/asncdctools/src/asncdcaddremove.sql
$ db2 -tvmf $HOME/asncdctools/src/asncdcaddremove.sql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 设置 Db2 服务器后,使用 UDF 使用 SQL 命令控制 Db2 复制(ASN)。有些 UDF 期望一个返回值,在这种情况下,您可以使用 SQL
VALUE
语句来调用它们。对于其他 UDF,请使用 SQLCALL
语句。启动 ASN 代理:
VALUES ASNCDC.ASNCDCSERVICES('start','asncdc');
VALUES ASNCDC.ASNCDCSERVICES('start','asncdc');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以上语句返回以下结果之一:
-
asncap 已在运行
start -->
<COMMAND>
在这种情况下,在终端窗口中输入指定的
<COMMAND
>,如下例所示:/database/config/db2inst1/sqllib/bin/asncap capture_schema=asncdc capture_server=SAMPLE &
/database/config/db2inst1/sqllib/bin/asncap capture_schema=asncdc capture_server=SAMPLE &
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
将表置于捕获模式。对您要放入捕获的每个表调用以下语句:将
MYSCHEMA
替换为包含您要放入捕获模式的表的 schema 名称。同样,将MYTABLE
替换为要放入捕获模式的表名称:CALL ASNCDC.ADDTABLE('MYSCHEMA', 'MYTABLE');
CALL ASNCDC.ADDTABLE('MYSCHEMA', 'MYTABLE');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新初始化 ASN 服务:
VALUES ASNCDC.ASNCDCSERVICES('reinit','asncdc');
VALUES ASNCDC.ASNCDCSERVICES('reinit','asncdc');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.5.2. Db2 捕获代理配置对服务器负载和延迟的影响 复制链接链接已复制到粘贴板!
当数据库管理员为源表启用数据捕获时,捕获代理开始运行。代理从事务日志中读取新的更改事件记录,并将事件记录复制到捕获表中。在源表中提交更改的时间之间,更改在对应的更改表中出现的时间,始终会有一个小的延迟间隔。这个延迟间隔代表了在源表中更改时以及 Debezium 被流传输到 Apache Kafka 间的差距。
理想情况下,对于必须快速响应数据更改的应用程序,您希望在源和捕获表之间保持同步。您可能希望运行捕获代理来持续处理更改事件,可能会导致吞吐量增加吞吐量,并减少在事件发生后尽快使用新的事件记录更改表。然而,这不一定是这种情况。在更直接同步时,会牺牲性能损失。每次更改代理查询数据库是否有新的事件记录时,它会增加数据库主机上的 CPU 负载。服务器上的额外负载可能会对整体数据库性能造成负面影响,并可能会降低事务效率,特别是在峰值数据库使用期间。
监控数据库指标非常重要,以便您知道数据库是否达到服务器不再支持捕获代理级别的活动点。如果您在运行捕获代理时遇到问题,请调整捕获代理设置,以减少 CPU 负载。
3.5.3. Db2 捕获代理配置参数 复制链接链接已复制到粘贴板!
在 Db2 上,IBMSNAP_CAPPARMS
表包含控制捕获代理行为的参数。您可以调整这些参数的值,以平衡捕获过程的配置,以减少 CPU 负载并仍然维护可接受的延迟级别。
有关如何配置 Db2 捕获代理参数的具体指导超出了本文档的范围。
在 IBMSNAP_CAPPARMS
表中,以下参数对降低 CPU 负载有最大的效果:
COMMIT_INTERVAL
- 指定捕获代理等待将数据提交到更改数据的秒数。
- 数值越大可减少数据库主机上的负载并增加延迟。
-
默认值为
30
。
SLEEP_INTERVAL
- 指定捕获代理在达到活跃事务日志结束后等待启动新提交周期的秒数。
- 数值越大可减少服务器上的负载,并增加延迟。
-
默认值为
5
。
其他资源
- 有关捕获代理参数的更多信息,请参阅 Db2 文档。
3.6. 部署 Debezium Db2 连接器 复制链接链接已复制到粘贴板!
您可以使用以下任一方法部署 Debezium Db2 连接器:
由于许可要求,Debebe Db2 连接器存档不包括 Debezium 连接到 Db2 数据库所需的 Db2 JDBC 驱动程序。要启用连接器访问数据库,您必须将驱动程序添加到连接器环境中。有关如何获取驱动程序的详情,请参考包含 Db2 JDBC 驱动程序。
3.6.1. 获取 Db2 JDBC 驱动程序 复制链接链接已复制到粘贴板!
由于许可证的要求,Debezium 连接到一个 Db2 数据库所需的 Db2 JDBC 驱动程序文件没有包括在 Debezium Db2 连接器存档中。驱动程序可从 Maven Central 下载。根据您使用的部署方法,您可以通过向 Kafka Connect 自定义资源或您用来构建连接器镜像的 Dockerfile 来检索驱动程序。
-
如果您使用 AMQ Streams 将连接器添加到 Kafka Connect 镜像中,请将驱动程序的 Maven Central 位置添加到
KafkaConnect
自定义资源的builds.plugins.artifact.url
中,如 第 3.6.3 节 “使用 AMQ Streams 部署 Debezium Db2 连接器” 所示。 -
如果您使用 Dockerfile 为连接器构建容器镜像,请在 Dockerfile 中插入
curl
命令以指定从 Maven Central 下载所需驱动程序文件的 URL。更多信息请参阅 第 3.6.4 节 “通过从 Dockerfile 构建自定义 Kafka Connect 容器镜像来部署 Debezium Db2 连接器”。
3.6.2. 使用 AMQ Streams 部署 Db2 连接器 复制链接链接已复制到粘贴板!
从 Debezium 1.7 开始,部署 Debezium 连接器的首选方法是使用 AMQ Streams 来构建包含连接器插件的 Kafka Connect 容器镜像。
在部署过程中,您可以创建并使用以下自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR,并包含有关镜像中需要包含连接器工件的信息。 -
提供连接器用来访问源数据库的信息的
KafkaConnector
CR。在 AMQ Streams 启动 Kafka Connect pod 后,您可以通过应用KafkaConnector
CR 来启动连接器。
在 Kafka Connect 镜像的构建规格中,您可以指定可用于部署的连接器。对于每个连接器插件,您还可以指定您的部署可以使用的其他组件。例如,您可以添加 Apicurio Registry 工件或 Debezium 脚本组件。当 AMQ Streams 构建 Kafka Connect 镜像时,它会下载指定的工件,并将其合并到镜像中。
KafkaConnect
CR 中的 spec.build.output
参数指定存储生成的 Kafka Connect 容器镜像的位置。容器镜像可以存储在 Docker registry 中,也可以存储在 OpenShift ImageStream 中。要将镜像存储在 ImageStream 中,您必须先创建 ImageStream,然后才能部署 Kafka Connect。镜像流不会被自动创建。
如果使用 KafkaConnect
资源创建集群,之后您无法使用 Kafka Connect REST API 创建或更新连接器。您仍然可以使用 REST API 来检索信息。
其他资源
- 在 OpenShift 上使用 AMQ Streams 配置 Kafka 连接。
- 在 OpenShift 中部署和升级 AMQ Streams 中的使用 AMQ Streams 自动创建新容器镜像。
3.6.3. 使用 AMQ Streams 部署 Debezium Db2 连接器 复制链接链接已复制到粘贴板!
使用早期版本的 AMQ Streams 时,要在 OpenShift 上部署 Debezium 连接器,首先需要为连接器构建 Kafka Connect 镜像。在 OpenShift 上部署连接器的当前首选的方法是使用 AMQ Streams 中的构建配置来自动构建 Kafka Connect 容器镜像,其中包含您要使用的 Debezium 连接器插件。
在构建过程中,AMQ Streams Operator 会将 KafkaConnect
自定义资源中的输入参数(包括 Debezium 连接器定义)转换为 Kafka Connect 容器镜像。构建从 Red Hat Maven 存储库或其他配置的 HTTP 服务器下载必要的工件。
新创建的容器被推送到 .spec.build.output
中指定的容器 registry,用于部署 Kafka Connect 集群。AMQ Streams 构建 Kafka Connect 镜像后,您可以创建 KafkaConnector
自定义资源来启动构建中包含的连接器。
先决条件
- 您可以访问安装了集群 Operator 的 OpenShift 集群。
- AMQ Streams Operator 正在运行。
- 部署 Apache Kafka 集群,如在 OpenShift 中部署和升级 AMQ Streams 所述。
- Kafka Connect 部署在 AMQ Streams 上
- 您有红帽构建的 Debezium 许可证。
-
已安装 OpenShift
oc
CLI 客户端,或者您可以访问 OpenShift Container Platform Web 控制台。 根据您要存储 Kafka Connect 构建镜像的方式,您需要 registry 权限或您必须创建 ImageStream 资源:
- 要将构建镜像存储在镜像 registry 中,如 Red Hat Quay.io 或 Docker Hub
- 在 registry 中创建和管理镜像的帐户和权限。
- 将构建镜像存储为原生 OpenShift ImageStream
- ImageStream 资源已部署到集群中,以存储新的容器镜像。您必须为集群明确创建 ImageStream。镜像流默认不可用。如需有关 ImageStreams 的更多信息,请参阅在 OpenShift Container Platform 上管理镜像流。
流程
- 登录 OpenShift 集群。
为连接器创建 Debezium
KafkaConnect
自定义资源(CR),或修改现有的资源。例如,创建一个名为dbz-connect.yaml
的KafkaConnect
CR,用于指定metadata.annotations
和spec.build
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
例 3.1.
dbz-connect.yaml
文件,该文件定义包含 Debezium 连接器的KafkaConnect
自定义资源在以下示例中,自定义资源被配置为下载以下工件:
- Debezium Db2 连接器存档。
- 红帽构建的 Apicurio Registry 存档。Apicurio Registry 是一个可选组件。只有在打算在连接器中使用 Avro 序列化时,才添加 Apicurio Registry 组件。
- Debezium 脚本 SMT 归档以及您要与 Debezium 连接器一起使用的相关语言依赖项。SMT 归档和语言依赖项是可选组件。只有在打算使用 Debezium 是 基于内容的路由 SMT 或 过滤 SMT 时,才添加这些组件。
- Db2 JDBC 驱动程序需要连接到 Db2 数据库,但不包含在连接器存档中。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 3.14. Kafka Connect 配置设置的描述 项 描述 1
将
strimzi.io/use-connector-resources
注解设置为"true"
,以便 Cluster Operator 使用KafkaConnector
资源在此 Kafka Connect 集群中配置连接器。2
spec.build
配置指定构建镜像的位置,并列出要在镜像中包含的插件,以及插件工件的位置。3
build.output
指定存储新构建镜像的 registry。4
指定镜像输出的名称和镜像名称。
output.type
的有效值是docker
,可推送到容器 registry,如 Docker Hub 或 Quay,或将镜像推送到内部 OpenShift ImageStream的镜像流
。要使用 ImageStream,必须将 ImageStream 资源部署到集群中。有关在 KafkaConnect 配置中指定build.output
的更多信息,请参阅在 OpenShift 中配置 AMQ Streams 中的 AMQ Streams Build schema 参考。5
插件配置
列出了您要包含在 Kafka Connect 镜像中的所有连接器。对于列表中的每个条目,指定一个插件名称
,以及有关构建连接器所需的工件的信息。另外,对于每个连接器插件,您还可以包含您要与连接器一起使用的其他组件。例如,您可以添加 Service Registry 工件或 Debezium 脚本组件。6
artifacts.type
的值指定artifacts.url
中指定的工件的文件类型。有效类型是zip
、tgz
或jar
。Debezium 连接器存档以.zip
文件格式提供。JDBC 驱动程序文件采用.jar
格式。type
值必须与url
字段中引用的文件类型匹配。7
artifacts.url
的值指定 HTTP 服务器的地址,如 Maven 存储库,用于存储连接器工件的文件。OpenShift 集群必须有权访问指定的服务器。8
(可选)指定用于下载 Apicurio Registry 组件的工件
类型和
url
。包括 Apicurio Registry 工件,只有在您希望连接器使用 Apache Avro 与 Red Hat build of Apicurio Registry 序列化事件键和值时,而不是使用默认的 JSON converter。9
(可选)指定 Debezium 脚本 SMT 归档的工件
类型和
url
,以用于 Debezium 连接器。只有在打算使用 Debezium 基于内容的路由 SMT 或 过滤 SMT 时使用脚本 SMT 时,才包含脚本 SMT,您必须部署 JSR 223 兼容脚本实施,如 groovy。10
(可选)为 JSR 223 兼容脚本实现的 JAR 文件指定工件
类型和
url
,这是 Debezium 脚本 SMT 所需的。重要如果您使用 AMQ Streams 将连接器插件合并到 Kafka Connect 镜像中,对于每个所需脚本语言组件,则
artifacts.url
必须指定 JAR 文件的位置,而artifacts.type
的值还必须设置为jar
。无效的值会导致连接器在运行时失败。要启用使用带有脚本 SMT 的 Apache Groovy 语言,示例中的自定义资源会检索以下库的 JAR 文件:
-
groovy
-
Groovy-jsr223
(协调代理) -
Groovy-json
(用于解析 JSON 字符串的模块)
Debezium 脚本 SMT 还支持使用 GraalVM JavaScript 的 JSR 223 实现。
11
指定 Maven Central 中的 Db2 JDBC 驱动程序的位置。Debezium Db2 连接器存档中没有包括所需的驱动程序。
输入以下命令将
KafkaConnect
构建规格应用到 OpenShift 集群:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据自定义资源中指定的配置,Streams Operator 会准备要部署的 Kafka Connect 镜像。
构建完成后,Operator 将镜像推送到指定的 registry 或 ImageStream,并启动 Kafka Connect 集群。您配置中列出的连接器工件在集群中可用。创建一个
KafkaConnector
资源来定义您要部署的每个连接器的实例。
例如,创建以下KafkaConnector
CR,并将它保存为db2-inventory-connector.yaml
例 3.2. 为 Debezium 连接器定义
KafkaConnector
自定义资源的db2-inventory-connector.yaml
文件Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 3.15. 连接器配置设置的描述 项 描述 1
使用 Kafka Connect 集群注册的连接器名称。
2
连接器类的名称。
3
可同时运行的任务数量。
4
连接器的配置。
5
主机数据库实例的地址。
6
数据库实例的端口号。
7
Debezium 用于连接到数据库的帐户名称。
8
Debezium 用于连接到数据库用户帐户的密码。
9
要从中捕获更改的数据库名称。
10
数据库实例或集群的主题前缀。
指定的名称只能从字母数字字符或下划线括起。
由于主题前缀用作从这个连接器接收更改事件的任何 Kafka 主题的前缀,所以名称必须在集群中的连接器之间唯一。
此命名空间也用于相关的 Kafka Connect 模式的名称,如果您将连接器与 Avro 连接器集成,则对应的 Avro 模式的命名空间也用于。11
连接器从中捕获更改事件的表列表。
运行以下命令来创建连接器资源:
oc create -n <namespace> -f <kafkaConnector>.yaml
oc create -n <namespace> -f <kafkaConnector>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc create -n debezium -f {context}-inventory-connector.yaml
oc create -n debezium -f {context}-inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 连接器注册到 Kafka Connect 集群,并开始针对
KafkaConnector
CR 中的spec.config.database.dbname
指定的数据库运行。连接器 pod 就绪后,Debezium 正在运行。
您现在已准备好 验证 Debezium Db2 部署。
要部署 Debezium Db2 连接器,您必须构建包含 Debezium 连接器存档的自定义 Kafka Connect 容器镜像,然后将此容器镜像推送到容器 registry。然后,您需要创建以下自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR。CR 中的image
属性指定您创建用来运行 Debezium 连接器的容器镜像的名称。您可以将此 CR 应用到部署了 Red Hat AMQ Streams 的 OpenShift 实例。AMQ Streams 提供将 Apache Kafka 引入到 OpenShift 的 operator 和镜像。 -
定义 Debezium Db2 连接器的
KafkaConnector
CR。将此 CR 应用到应用KafkaConnect
CR 的相同 OpenShift 实例。
先决条件
- Db2 正在运行,您完成了 设置 Db2 的步骤以用于 Debezium 连接器。
- AMQ Streams 部署在 OpenShift 上,并运行 Apache Kafka 和 Kafka Connect。如需更多信息,请参阅在 OpenShift 中部署和升级 AMQ Streams。
- podman 或 Docker 已安装。
- Kafka Connect 服务器有权访问 Maven Central 来下载 Db2 所需的 JDBC 驱动程序。您还可以使用驱动程序的本地副本,或者从本地 Maven 存储库或其他 HTTP 服务器提供。
-
您有在容器 registry 中创建和管理容器(如
quay.io
或docker.io
)的帐户和权限,您要向其添加将运行 Debezium 连接器的容器。
流程
为 Kafka Connect 创建 Debezium Db2 容器:
创建一个 Dockerfile,它使用
registry.redhat.io/amq7/amq-streams-kafka-32-rhel8:2.2.0-12
作为基础镜像。例如,在终端窗口中输入以下命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
您可以指定您想要的任何文件名。
2
指定 Kafka Connect 插件目录的路径。如果您的 Kafka Connect 插件目录位于不同的位置,请将这个路径替换为您的目录的实际路径。
该命令在当前目录中创建一个名为
debezium-container-for-db2.yaml
的 Dockerfile。从您在上一步中创建的
debezium-container-for-db2.yaml
Docker 文件中构建容器镜像。在包含该文件的目录中,打开终端窗口并输入以下命令之一:podman build -t debezium-container-for-db2:latest .
podman build -t debezium-container-for-db2:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker build -t debezium-container-for-db2:latest .
docker build -t debezium-container-for-db2:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述命令使用名称
debezium-container-for-db2
构建容器镜像。将自定义镜像推送到容器 registry,如 quay.io 或内部容器 registry。容器 registry 必须可供部署镜像的 OpenShift 实例使用。输入以下命令之一:
podman push <myregistry.io>/debezium-container-for-db2:latest
podman push <myregistry.io>/debezium-container-for-db2:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker push <myregistry.io>/debezium-container-for-db2:latest
docker push <myregistry.io>/debezium-container-for-db2:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建新的 Debezium Db2
KafkaConnect
自定义资源(CR)。例如,创建一个名为dbz-connect.yaml
的KafkaConnect
CR,用于指定注解和
镜像
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
metadata.annotations
表示KafkaConnector
资源用于配置在这个 Kafka Connect 集群中使用的 Cluster Operator。2
spec.image
指定您为运行 Debezium 连接器而创建的镜像名称。此属性覆盖 Cluster Operator 中的STRIMZI_DEFAULT_KAFKA_CONNECT_IMAGE
变量。输入以下命令将
KafkaConnect
CR 应用到 OpenShift Kafka Connect 环境:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令添加一个 Kafka Connect 实例,用于指定您为运行 Debezium 连接器而创建的镜像名称。
创建一个
KafkaConnector
自定义资源来配置 Debezium Db2 连接器实例。您可以在
.yaml
文件中配置 Debezium Db2 连接器,该文件指定连接器的配置属性。连接器配置可能会指示 Debezium 为 schema 和表的子集生成事件,或者可能会设置属性,以便 Debezium 忽略敏感、太大或不需要的指定栏中的值。以下示例配置了 Debezium 连接器,该连接器连接到 Db2 服务器主机
192.168.99.100
,端口50000
。此主机有一个名为mydatabase
的数据库,名为 inventory 的表,inventory
-connector-db2Db2
inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 3.16. 连接器配置设置的描述 项 描述 1
在将连接器注册到 Kafka Connect 集群时,它的名称。
2
此 Db2 连接器类的名称。
3
任何时候只能有一个任务。
4
连接器的配置。
5
数据库主机,它是 Db2 实例的地址。
6
Db2 实例的端口号。
7
Db2 用户的名称。
8
Db2 用户的密码。
9
要从中捕获更改的数据库名称。
10
Db2 实例/集群的逻辑名称,它组成一个命名空间,用于连接器写入的 Kafka 主题名称、Kafka Connect 模式的名称以及在使用 Avro Connector 时对应 Avro 模式的命名空间。
11
连接器仅捕获来自
public.inventory
表中的更改。使用 Kafka Connect 创建连接器实例。例如,如果您将
KafkaConnector
资源保存到inventory-connector.yaml
文件中,您将运行以下命令:oc apply -f inventory-connector.yaml
oc apply -f inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述命令注册
inventory-connector
,连接器开始针对KafkaConnector
CR 中定义的mydatabase
数据库运行。
有关您可以为 Debezium Db2 连接器设置的配置属性的完整列表,请参阅 Db2 连接器属性。
结果
连接器启动后,它会对连接器配置为捕获更改的 Db2 数据库表 执行一致的快照。然后,连接器开始为行级操作生成数据更改事件,并将事件记录流传输到 Kafka 主题。
3.6.5. 验证 Debezium Db2 连接器正在运行 复制链接链接已复制到粘贴板!
如果连接器正确启动且没有错误,它会为每个连接器配置为捕获的表创建一个主题。下游应用程序可以订阅这些主题以检索源数据库中发生的信息事件。
要验证连接器是否正在运行,您可以从 OpenShift Container Platform Web 控制台或 OpenShift CLI 工具(oc)执行以下操作:
- 验证连接器状态。
- 验证连接器是否生成主题。
- 验证主题是否填充了每个表初始快照过程中生成的读操作("op":"r")的事件。
先决条件
- Debezium 连接器部署到 OpenShift 上的 AMQ Streams。
-
已安装 OpenShift
oc
CLI 客户端。 - 访问 OpenShift Container Platform web 控制台。
流程
使用以下方法之一检查
KafkaConnector
资源的状态:在 OpenShift Container Platform Web 控制台中:
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 以打开 Select Resource 复选框,然后键入
KafkaConnector
。 - 在 KafkaConnectors 列表中,点您要检查的连接器的名称,如 inventory-connector-db2。
- 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc describe KafkaConnector <connector-name> -n <project>
oc describe KafkaConnector <connector-name> -n <project>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc describe KafkaConnector inventory-connector-db2 -n debezium
oc describe KafkaConnector inventory-connector-db2 -n debezium
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 3.3.
KafkaConnector
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证连接器是否已创建 Kafka 主题:
通过 OpenShift Container Platform Web 控制台。
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 打开 Select Resource 复选框,然后键入
KafkaTopic
。 -
在 KafkaTopics 列表中,点您要检查的主题的名称,例如
inventory-connector-db2.inventory.orders--ac5e98ac6a5d91e04d8ec0dc9078a1ece439081d
。 - 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc get kafkatopics
oc get kafkatopics
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 3.4.
KafkaTopic
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
检查主题内容。
- 在终端窗口中输入以下命令:
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-db2.inventory.products_on_hand
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-db2.inventory.products_on_hand
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定主题名称的格式与
oc describe
命令的格式在第 1 步中返回,例如inventory-connector-db2.inventory.addresses
。对于主题中的每个事件,命令会返回类似以下输出的信息:
例 3.5. Debezium 更改事件的内容
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-db2.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-db2.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-db2.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.db2.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-db2.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"db2","name":"inventory-connector-db2","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"db2-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-db2.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-db2.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-db2.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.db2.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-db2.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"db2","name":"inventory-connector-db2","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"db2-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,
有效负载
值显示连接器快照从表inventory.products_on_hand
中生成一个读取("op" ="r"
)事件。product_id
记录的"before"
状态为null
,这表示记录没有之前的值。"after"
状态对于product_id
为101
的项目的quantity
显示为3
。
3.6.6. Debezium Db2 连接器配置属性的描述 复制链接链接已复制到粘贴板!
Debezium Db2 连接器有许多配置属性,您可以使用它们来实现应用程序的正确连接器行为。许多属性具有默认值。有关属性的信息按如下方式进行组织:
- 所需的配置属性
- 高级配置属性
数据库架构历史记录配置属性,用于控制 Debezium 如何处理从数据库架构历史记录主题读取的事件。
- 控制 数据库驱动程序行为的直通数据库驱动程序属性。
所需的 Debezium Db2 连接器配置属性
除非默认值可用 , 否则需要以下配置属性。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 | 连接器的唯一名称。尝试再次使用相同的名称注册将失败。所有 Kafka Connect 连接器都需要此属性。 | |
没有默认值 |
连接器的 Java 类的名称。对于 Db2 连接器,始终使用 | |
| 应该为此连接器创建的最大任务数量。Db2 连接器始终使用单个任务,因此不要使用这个值,因此始终可以接受默认值。 | |
没有默认值 | Db2 数据库服务器的 IP 地址或主机名。 | |
| Db2 数据库服务器的整数端口号。 | |
没有默认值 | 用于连接到 Db2 数据库服务器的 Db2 数据库用户的名称。 | |
没有默认值 | 连接到 Db2 数据库服务器时要使用的密码。 | |
没有默认值 | 从中流传输更改的 Db2 数据库的名称 | |
没有默认值 |
为特定的 Db2 数据库服务器提供命名空间前缀,用于托管 Debezium 正在捕获更改的数据库。主题前缀名称中只能使用字母数字字符、连字符、句点和下划线。主题前缀应该在所有其他连接器中唯一,因为此主题前缀用于接收这个连接器记录的所有 Kafka 主题。 警告 不要更改此属性的值。如果您更改了 name 值,重启后,而不是继续向原始主题发出事件,连接器会将后续事件发送到名称基于新值的主题。连接器也无法恢复其数据库架构历史记录主题。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与您希望连接器捕获的表的完全限定表标识符匹配。当设置此属性时,连接器只从指定的表中捕获更改。每个标识符的格式都是 schemaName。tableName。默认情况下,连接器捕获每个非系统表中的更改。
要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的全名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与您不想连接器捕获的表的完全限定表标识符匹配。连接器捕获未包含在 exclude 列表中的每个非系统表中的更改。每个标识符的格式都是 schemaName。tableName。
要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的全名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
空字符串 |
可选的、以逗号分隔的正则表达式列表,与更改事件记录值中包含的列的完全限定名称匹配。列的完全限定域名格式为 schemaName。tableName.columnName。
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配,它与列名称中可能存在的子字符串不匹配。如果您在配置中包含此属性,不要设置 | |
空字符串 |
可选的、以逗号分隔的正则表达式列表,与列的完全限定名称匹配,以便从更改事件值中排除。列的完全限定域名格式为 schemaName。tableName.columnName。
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配,它与列名称中可能存在的子字符串不匹配。事件键中始终包含主键列,即使它们不包括在值中。如果您在配置中包含此属性,请不要设置 | |
不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。列的完全限定域名格式为 schemaName。tableName.columnName。
一个 pseudonym,它包括了通过应用指定的 hashAlgorithm 和 salt 的结果的哈希值。根据使用的 hash 功能,会维护引用完整性,而列值则替换为伪nyms。支持的哈希功能在 Java Cryptography 架构标准算法名称文档中的 MessageDigest 部分 进行了描述。 column.mask.hash.SHA-256.with.salt.CzQMA0cB5K = inventory.orders.customerName, inventory.shipment.customerName
如有必要,伪的nym 会自动缩短到列的长度。连接器配置可以包含多个指定不同哈希算法和 salt 的属性。 | |
|
时间、日期和时间戳可以通过不同类型的精度 | |
|
控制 删除 事件是否随后是 tombstone 事件。 | |
| 指定连接器是否应该将数据库模式中的更改发布到与数据库服务器 ID 的名称相同的 Kafka 主题的布尔值。每个架构更改都会使用一个键进行记录,其中包含数据库名称和一个 JSON 结构,用于描述 schema 更新。这独立于连接器内部记录数据库架构历史记录。 | |
不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。如果您要在一组列中超过属性名称中指定的字符数时,设置此属性。将 列的完全限定域名会观察以下格式: schemaName.tableName.columnName。要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配;表达式不匹配列名称中可能存在的子字符串。 您可以在单个配置中指定多个长度不同的属性。 | |
不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。如果您希望连接器屏蔽一组列的值,例如,如果它们包含敏感数据,则设置此属性。将
列的完全限定域名会观察以下格式: schemaName.tableName.columnName。 您可以在单个配置中指定多个长度不同的属性。 | |
不适用 | 可选的、以逗号分隔的正则表达式列表,它与您希望连接器发送代表列元数据的完全限定名称匹配。当设置此属性时,连接器会将以下字段添加到事件记录的架构中:
这些参数分别传播列的原始类型和长度(用于变量带宽类型)。
列的完全限定域名会观察以下格式之一: databaseName.tableName.columnName, 或 databaseName.schemaName.tableName.columnName. | |
不适用 | 可选的、以逗号分隔的正则表达式列表,用于指定为数据库列定义的数据类型的完全限定名称。当设置此属性时,对于具有匹配数据类型的列,连接器会发出事件记录,该记录在 schema 中包含以下额外字段:
这些参数分别传播列的原始类型和长度(用于变量带宽类型)。
列的完全限定域名会观察以下格式之一: databaseName.tableName.typeName, 或 databaseName.schemaName.tableName.typeName. 有关特定于 Db2 的数据类型名称的列表,请查看 Db2 数据类型映射。 | |
空字符串 | 指定连接器用来组成自定义消息键的表达式列表,以更改它发布到指定表的 Kafka 主题的事件记录。
默认情况下,Debezium 使用表的主键列作为它发出的记录的消息键。对于缺少主密钥的表,或者指定缺少主密钥的表的密钥,您可以根据一个或多个列配置自定义消息密钥。
属性可以列出多个表的条目。使用分号分隔列表中不同表的条目。 | |
none |
指定如何调整架构名称,以便与连接器使用的消息转换器兼容。可能的设置:
|
高级连接器配置属性
以下 高级配置 属性具有在大多数情况下工作的默认值,因此很少需要在连接器配置中指定。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 |
枚举连接器可以使用 的自定义转换器 实例的符号名称的逗号分隔列表。例如,
您必须设置
对于您为连接器配置的每个转换器,还必须添加一个
例如, isbn.type: io.debezium.test.IsbnConverter
如果要进一步控制配置的转换器的行为,您可以添加一个或多个配置参数将值传递给转换器。要将任何其他配置参数与转换器关联,请将参数名称与转换器的符号链接名称添加前缀。 isbn.schema.name: io.debezium.db2.type.Isbn
| |
|
指定在连接器启动 | |
|
在快照中,控制事务隔离级别以及连接器锁定处于捕获模式的表的时长。可能的值有: | |
|
指定连接器如何处理事件处理异常。可能的值有: | |
| 正整数值,用于指定连接器在处理批处理事件前应该等待出现新更改事件的毫秒数。默认值为 500 毫秒,或 0.5 秒。 | |
| 正整数值,用于指定连接器进程每个批处理的最大大小。 | |
|
正整数值,用于指定阻塞队列可以保存的最大记录数。当 Debezium 从数据库读取事件时,它会将事件放置在阻塞队列中,然后再将它们写入 Kafka。当连接器将消息写入 Kafka 或 Kafka 不可用时,阻塞队列可以提供从数据库读取更改事件的后端。当连接器定期记录偏移时,队列中保存的事件会被忽略。始终将 | |
|
较长的整数值,指定块队列的最大卷(以字节为单位)。默认情况下,不会为阻塞队列指定卷限制。要指定队列可以使用的字节数,请将此属性设置为正长值。 | |
|
控制连接器将心跳信息发送到 Kafka 主题的频率。默认行为是连接器不会发送心跳信息。 | |
没有默认值 | 连接器在连接器启动时应等待的时间(毫秒)。如果您要在集群中启动多个连接器,此属性对于避免快照中断非常有用,这可能会导致连接器重新平衡。 | |
|
可选的、以逗号分隔的正则表达式列表,与表的完全限定名称(< 要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
| 在快照中,连接器以行批处理形式读取表内容。此属性指定批处理中的最大行数。 | |
|
正整数值,用于指定在执行快照时等待获取表锁定的最长时间(以毫秒为单位)。如果连接器无法在这个间隔中获取表锁定,快照会失败。连接器如何提供快照 提供详情。其他可能的设置是: | |
没有默认值 | 指定要包含在快照中的表行。如果您希望快照仅在表中包括行的子集,请使用此属性。此属性仅影响快照。它不适用于连接器从日志中读取的事件。
属性包含一个以逗号分隔的表名称列表,格式为 <
在包含 soft-delete 列 "snapshot.select.statement.overrides": "customer.orders", "snapshot.select.statement.overrides.customer.orders": "SELECT * FROM [customers].[orders] WHERE delete_flag = 0 ORDER BY id DESC"
在生成的快照中,连接器仅包含 | |
如果连接器配置将
如果没有,则为 | 指明是否清理字段名称以遵循 Avro 命名要求。 | |
|
确定连接器是否生成带有事务边界的事件,并使用事务元数据增强更改事件。如果您希望连接器进行此操作,请指定 | |
|
以逗号分隔的操作类型列表,这些类型将在流期间跳过。操作包括: | |
没有默认值 |
用于向连接器发送信号的数据收集的完全限定名称。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#debezium-signaling-enabling-signaling使用以下格式指定集合名称: | |
| 连接器在增量快照块期间获取并读取内存的最大行数。增加块大小可提高效率,因为快照会运行更大的快照查询。但是,较大的块大小还需要更多内存来缓冲快照数据。将块大小调整为在您的环境中提供最佳性能的值。 | |
|
应该用来决定数据更改的主题名称、模式更改、事务、心跳事件等的 TopicNamingStrategy 类的名称,默认为 | |
|
指定主题名称的分隔符,默认为 | |
| 用于在绑定并发哈希映射中保存主题名称的大小。此缓存有助于确定与给定数据收集对应的主题名称。 | |
|
控制连接器向发送心跳消息的主题名称。主题名称具有此模式: | |
|
控制连接器向发送事务元数据消息的主题名称。主题名称具有此模式: |
Debezium 连接器数据库模式历史记录配置属性
Debezium 提供了一组 schema.history.internal114
属性,用于控制连接器如何与 schema 历史记录主题交互。
下表描述了用于配置 Debezium 连接器的 schema.history.internal
属性。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 | 连接器存储数据库架构历史记录的 Kafka 主题的完整名称。 | |
没有默认值 | 连接器用来建立到 Kafka 集群的初始连接的主机/端口对列表。此连接用于检索之前由连接器存储的数据库架构历史记录,并编写从源数据库读取的每个 DDL 语句。每个对都应该指向 Kafka Connect 进程使用的相同 Kafka 集群。 | |
| 整数值,用于指定连接器在轮询保留数据时应该等待的最大毫秒数。默认值为 100ms。 | |
| 指定连接器在使用 Kafka admin 客户端获取集群信息时应等待的最大毫秒数。 | |
| 指定连接器在使用 Kafka admin 客户端创建 kafka 历史记录主题时应等待的最大毫秒数。 | |
|
连接器在连接器恢复失败前读取保留历史记录数据的次数上限。在收到数据后等待的最长时间为 | |
|
指定连接器是否应该忽略不正确的或未知数据库语句或停止处理等布尔值,以便人可以解决这个问题。安全默认值为 | |
|
指定连接器是否应该记录所有 DDL 语句的布尔值
安全默认值为 |
直通数据库模式历史记录属性,用于配置制作者和消费者客户端
Debezium 依赖于 Kafka producer 将模式更改写入数据库架构历史记录主题。同样,它依赖于 Kafka 使用者在连接器启动时从数据库 schema 历史记录主题中读取。您可以通过将值分配给以 schema.history.internal.consumer 前缀开头的一组直通配置属性来定义 Kafka producer
和 消费者
客户端的配置。直通制作者和消费者数据库模式历史记录属性控制一系列行为,如这些客户端如何与 Kafka 代理安全连接,如下例所示:
Debezium 在将属性传递给 Kafka 客户端之前,从属性名称中分离前缀。
如需有关 Kafka producer 配置属性和 Kafka 使用者配置属性的更多详情,请参阅 Kafka 文档。
Debezium 连接器传递数据库驱动程序配置属性
Debezium 连接器为数据库驱动程序的透传配置提供。直通数据库属性以前缀 驱动程序 开头
。例如,连接器将 driver.foobar=false
等属性传递给 JDBC URL。
与 数据库架构历史记录客户端的直通属性 一样,Debebe 会将属性中的前缀从属性分离,然后再将它们传递给数据库驱动程序。
3.7. 监控 Debezium Db2 连接器性能 复制链接链接已复制到粘贴板!
Debezium Db2 连接器除了对 Apache ZooKeeper、Apache Kafka 和 Kafka Connect 提供的 JMX 指标的内置支持外,还提供三种类型的指标。
Debezium 监控文档 提供了有关如何使用 JMX 公开这些指标的详细信息。
3.7.1. 在 Db2 数据库的快照期间监控 Debezium 复制链接链接已复制到粘贴板!
MBean 是 debezium.db2:type=connector-metrics,context=snapshot,server= <db2.server.name>
。
除非快照操作处于活跃状态,否则快照指标不会被公开,或者快照自上次连接器启动后发生。
下表列出了可用的 shapshot 指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个快照事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器从上次启动或重置后看到的事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 包括在快照中的表的总数。 | |
| 快照要复制的表数。 | |
| 快照是否启动。 | |
| 快照是否暂停。 | |
| 快照是否中止。 | |
| 快照是否完成。 | |
| 快照目前花费的秒数,即使未完成也是如此。还包括快照暂停时的时间。 | |
| 快照暂停的秒数。如果快照暂停多次,则暂停的时间会增加。 | |
| 包含快照中每个表扫描的行数的映射。表在处理期间逐步添加到映射中。更新每个 10,000 行扫描,并在完成表后更新。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
在执行增量快照时,连接器还提供以下额外快照指标:
3.7.2. 监控 Debezium Db2 连接器记录流 复制链接链接已复制到粘贴板!
MBean 是 debezium.db2:type=connector-metrics,context=streaming,server= <db2.server.name>
。
下表列出了可用的流指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个流事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器自上次开始或指标重置以来看到的事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的创建事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的更新事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的删除事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 表示连接器当前是否连接到数据库服务器的标记。 | |
| 最后一次更改事件时间戳和连接器处理之间毫秒的数量。该值将限制运行数据库服务器和连接器的机器上时钟之间的差别。 | |
| 已提交的已处理的事务数量。 | |
| 最后一次接收的事件的协调。 | |
| 最后一次处理的事务的事务标识符。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
3.7.3. 监控 Debezium Db2 连接器模式历史记录 复制链接链接已复制到粘贴板!
MBean 是 debezium.db2:type=connector-metrics,context=schema-history,server= <db2.server.name>
。
下表列出了可用的模式历史记录指标。
属性 | 类型 | 描述 |
---|---|---|
|
| |
| 恢复开始的时间(以 epoch 秒为单位)。 | |
| 恢复阶段读取的更改数量。 | |
| 恢复和运行时应用的架构更改总数。 | |
| 从历史记录存储中恢复自上次更改以来的毫秒数。 | |
| 从上次更改被应用后经过的毫秒数。 | |
| 从历史记录存储中恢复最后一次更改的字符串表示。 | |
| 最后一次应用的更改的字符串表示。 |
3.8. 管理 Debezium Db2 连接器 复制链接链接已复制到粘贴板!
部署 Debezium Db2 连接器后,请使用 Debezium 管理 UDFs 来使用 SQL 命令控制 Db2 复制(ASN)。有些 UDF 期望一个返回值,在这种情况下,您可以使用 SQL VALUE
语句来调用它们。对于其他 UDF,请使用 SQL CALL
语句。
任务 | 命令和备注 |
---|---|
| |
| |
| |
| |
| |
|
3.9. 更新 Debezium 连接器捕获模式的 Db2 表的模式 复制链接链接已复制到粘贴板!
虽然 Debezium Db2 连接器可以捕获架构更改,但为了更新架构,您必须与数据库管理员合作,以确保连接器继续生成更改事件。这通过 Db2 实施复制的方式是必需的。
对于捕获模式中的每个表,Db2 的复制功能会创建一个 change-data 表,其中包含该源表的所有更改。但是,change-data 表模式是静态的。如果您在捕获模式下为表更新模式,还必须更新其对应 change-data 表的 schema。Debezium Db2 连接器无法执行此操作。具有升级权限的数据库管理员必须为处于捕获模式的表更新模式。
在在同一表中有新的架构更新前,完全执行架构更新过程非常重要。因此,建议是在单个批处理中执行所有 DDL,因此架构更新过程仅一次完成。
通常有两个更新表模式的步骤:
每种方法都有优势和缺点。
3.9.1. 为 Debezium Db2 连接器执行离线 schema 更新 复制链接链接已复制到粘贴板!
在执行离线架构更新前,您将停止 Debezium Db2 连接器。虽然这是更安全的模式更新流程,但可能不适用于具有高可用性要求的应用程序。
先决条件
- 处于捕获模式的一个或多个表需要 schema 更新。
流程
- 暂停更新数据库的应用。
- 等待 Debezium 连接器流传输所有未流更改事件记录。
- 停止 Debezium 连接器。
- 将所有更改应用到源表模式。
-
在 ASN 注册表中,将更新的模式标记为
INACTIVE
。 - 重新初始化 ASN 捕获服务。
- 通过运行 Debezium UDF 从捕获模式中删除表,从捕获模式中删除带有旧模式的源表。
- 使用新模式添加源表以捕获模式,方法是运行 Debezium UDF 将表添加到捕获模式。
-
在 ASN 注册表中,将更新的源表标记为
ACTIVE
。 - 重新初始化 ASN 捕获服务。
- 恢复更新数据库的应用程序。
- 重启 Debezium 连接器。
3.9.2. 为 Debezium Db2 连接器执行在线 schema 更新 复制链接链接已复制到粘贴板!
在线 schema 更新不会导致应用程序和数据处理的停机时间。也就是说,在执行在线架构更新前,您不会停止 Debezium Db2 连接器。另外,在线架构更新过程比离线架构更新的步骤要简单。
但是,当表处于捕获模式时,在更改列名称后,Db2 复制功能将继续使用旧列名称。新列名称不会出现在 Debezium 更改事件中。您必须重启连接器才能在更改事件中看到新列名称。
先决条件
- 处于捕获模式的一个或多个表需要 schema 更新。
在表末尾添加列的步骤
- 锁定您要更改其模式的源表。
-
在 ASN 注册表中,将锁定的表标记为
INACTIVE
。 - 重新初始化 ASN 捕获服务。
- 将所有更改应用到源表的 schema。
- 对相应 change-data 表的 schema 应用所有更改。
-
在 ASN 注册表中,将源表标记为
ACTIVE
。 - 重新初始化 ASN 捕获服务。
- 可选。重启连接器以查看更改事件中的更新列名称。
在表的中间添加列时的流程
- 锁定要更改的源表。
-
在 ASN 注册表中,将锁定的表标记为
INACTIVE
。 - 重新初始化 ASN 捕获服务。
对于要更改的每个源表,请执行以下操作:
- 在源表中导出数据。
- 截断源表。
- 更改源表并添加列。
- 将导出的数据加载到更改的源表中。
- 在源表的对应 change-data 表中导出数据。
- 截断 change-data 表。
- 更改 change-data 表并添加列。
- 将导出的数据加载到更改的 change-data 表中。
-
在 ASN 注册表中,将表标记为
INACTIVE
。这会将旧的 change-data 表标记为 inactive,这样允许其中的数据保留,但不再更新它们。 - 重新初始化 ASN 捕获服务。
- 可选。重启连接器以查看更改事件中的更新列名称。
第 4 章 MongoDB 的 Debezium 连接器 复制链接链接已复制到粘贴板!
Debezium 的 MongoDB 连接器跟踪 MongoDB 副本集或 MongoDB 分片集群,用于记录数据库和集合,在 Kafka 主题中记录这些更改。连接器自动处理分片集群中分片的添加或删除,更改每个副本集的成员资格、每个副本集中的选举,以及等待通信问题解析。
有关与此连接器兼容的 MongoDB 版本的详情,请参考 Debezium 支持的配置页面。
使用 Debezium MongoDB 连接器的信息和流程进行组织,如下所示:
4.1. Debezium MongoDB 连接器概述 复制链接链接已复制到粘贴板!
MongoDB 的复制机制提供冗余和高可用性,这是在生产环境中运行 MongoDB 的首选方法。MongoDB 连接器捕获副本集或分片集群中的更改。
MongoDB 副本集 由一组服务器组成,所有服务器都有相同数据的副本,并且复制可确保客户端对副本集 的主 文档所做的所有更改都会正确应用到其他副本集的服务器,称为 第二个信息。MongoDB 复制的工作原理是:主记录其 oplog (或操作日志),第二方都会读取主的 oplog,并应用所有操作对自己的文档。当将新的服务器添加到副本集时,该服务器首先在主服务器上执行所有数据库和集合 的快照,然后读取主的 oplog 以应用自快照开始的所有更改。当该服务器捕获到主 oplog 的尾部时,该服务器就成为次要(并可处理查询)。
4.1.1. MongoDB 连接器如何使用更改流捕获事件记录的描述 复制链接链接已复制到粘贴板!
虽然 Debezium MongoDB 连接器没有成为副本集的一部分,但它使用类似的复制机制来获取 oplog 数据。主要区别在于连接器不会直接读取 oplog。相反,它会将 oplog 数据的捕获和解码委派给 MongoDB 更改流 功能。通过更改流,MongoDB 服务器会公开集合中作为事件流所做的更改。Debezium 连接器监控流,然后提供下游更改。连接器第一次检测到副本集时,它会检查 oplog 以获取最后记录的事务,然后执行主数据库和集合的快照。连接器完成复制数据后,它会从之前读取的 oplog 位置创建一个更改流。
随着 MongoDB 连接器处理更改,它会定期记录事件源自在 oplog 流中的位置。当连接器停止时,它会记录它处理的最后一个 oplog 流位置,以便在重启后它可以从该位置恢复流。换句话说,可以停止、升级或维护连接器,并在稍后重启一些时间,并且始终在不丢失单个事件的情况下完全关闭它。当然,MongoDB oplogs 通常上限为最大大小,因此如果长时间停止连接器,则 oplog 中的操作可能会在连接器读取前清除。在这种情况下,重启后连接器检测到缺少的 oplog 操作,执行快照,然后进行流更改。
MongoDB 连接器还对副本集的成员资格和领导、添加或删除分片集群中的分片以及可能导致通信失败的网络问题有很大的修改。连接器始终使用副本集的主节点来流更改,因此当副本集强制和不同的节点变为主节点时,连接器将立即停止流更改,连接到新的主节点,并使用新的主节点开始流更改。同样,如果连接器无法与副本集主通信,它将尝试重新连接(使用 exponential backoff,以便不可能造成网络或副本集)。重新建立连接后,连接器将继续从捕获的最后一个事件更改。这样,连接器会动态调整副本设置成员资格的变化,并自动处理通信中断。
4.2. Debezium MongoDB 连接器的工作方式 复制链接链接已复制到粘贴板!
有关连接器支持的 MongoDB 拓扑概述,用于规划应用程序。
当配置和部署 MongoDB 连接器时,它会首先通过连接到 seed 地址的 MongoDB 服务器,并确定每个可用副本集的详情。由于每个副本集都有自己的独立的 oplog,因此连接器会尝试为每个副本集使用单独的任务。连接器可以限制将使用的最大任务数量,如果没有足够的任务可用,则连接器会将多个副本集分配给每个任务,但任务仍会为每个副本集使用单独的线程。
在针对分片集群运行连接器时,请使用大于副本集数的 tasks.max
值。这将允许连接器为每个副本集创建一个任务,并允许 Kafka Connect 协调、分发和管理所有可用 worker 进程中的任务。
以下主题提供有关 Debezium MongoDB 连接器如何工作的详细信息:
- 第 4.2.1 节 “Debezium 连接器支持的 MongoDB 拓扑”
- 第 4.2.2 节 “Debezium MongoDB 连接器如何为副本集和分片集群使用逻辑名称”
- 第 4.2.3 节 “Debezium MongoDB 连接器如何执行快照”
- 第 4.2.4 节 “Debezium MongoDB 连接器流更改事件记录”
- 第 4.2.6 节 “接收 Debezium MongoDB 更改事件记录的 Kafka 主题默认名称”
- 第 4.2.7 节 “Debezium MongoDB 连接器的事件键控制主题分区的方式”
- 第 4.2.8 节 “Debezium MongoDB 连接器生成的事件代表事务边界”
4.2.1. Debezium 连接器支持的 MongoDB 拓扑 复制链接链接已复制到粘贴板!
MongoDB 连接器支持以下 MongoDB 拓扑:
- MongoDB 副本集
Debezium MongoDB 连接器可以从单个 MongoDB 副本集 捕获更改。生产环境副本集 至少需要三个成员。
要将 MongoDB 连接器与副本集一起使用,请使用连接器的
mongodb.hosts
属性提供一个或多个副本集服务器的地址作为 seed addresses。连接器将使用这些 seeds 连接到副本集,然后在连接后从副本集获取完整的成员集合,以及哪些成员是主成员。连接器将启动一个任务来连接到主设备并从主 oplog 中捕获更改。当副本集选择新主主时,任务将自动切换到新的主设备。注意当 MongoDB 由代理(如 OS X 或 Windows 上的 Docker)开头时,当客户端连接到副本集并发现成员时,MongoDB 客户端将排除代理作为有效成员,并将尝试并无法直接连接到成员,而不是通过代理进行连接。
在这种情况下,将连接器的可选
mongodb.members.auto.discover
配置属性设置为false
,以指示连接器强制识别身份发现,而是使用第一个 seed 地址(通过mongodb.hosts
属性指定)作为主节点。这可能会正常工作,但仍在选举发生时导致问题。
- MongoDB 分片集群
MongoDB 分片集群 包括:
- 一个或多个 分片,各自部署为副本集;
- 用作 集群配置服务器的独立副本集
客户端需要连接到的一个或多个 routers (也称为
mongos
)。它们会将请求路由到相关的分片。要将 MongoDB 连接器与分片集群搭配使用,请使用 配置服务器副本集的主机地址配置 连接器。当连接器连接到此副本集时,它会发现它充当分片集群的配置服务器,发现有关集群中用作分片的每个副本集的信息,然后启动一个单独的任务来捕获每个副本集中的更改。如果向集群或现有分片添加了新的分片,连接器将相应地调整其任务。
- MongoDB 独立服务器
- MongoDB 连接器无法监控独立 MongoDB 服务器的更改,因为单机服务器没有 oplog。如果单机服务器转换为一个成员设置的副本集,则连接器将可以正常工作。
MongoDB 不建议在生产环境中运行独立服务器。如需更多信息,请参阅 MongoDB 文档。
4.2.2. Debezium MongoDB 连接器如何为副本集和分片集群使用逻辑名称 复制链接链接已复制到粘贴板!
连接器配置属性 topic.prefix
充当 MongoDB 副本集或分片集群的逻辑名称。连接器以多种方式使用逻辑名称: 作为所有主题名称的前缀,在记录每个副本集的更改流位置时作为唯一标识符。
您应该为每个 MongoDB 连接器指定一个有意义的逻辑名称,它有意义的描述源 MongoDB 系统。我们建议逻辑名称以字母或下划线字符开头,剩余字符为字母数字字符或下划线。
4.2.3. Debezium MongoDB 连接器如何执行快照 复制链接链接已复制到粘贴板!
当任务使用副本集启动时,它会使用连接器的逻辑名称和副本集名称来查找偏移,该 偏移 描述了连接器之前停止读取更改的位置。如果可以找到偏移,并且它仍然存在于 oplog 中,则任务会立即进行 流更改,从记录的偏移位置开始。
但是,如果没有找到偏移,或者 oplog 不再包含该位置,则任务必须首先通过 执行快照 来获取副本集内容的当前状态。这个过程首先记录 oplog 的当前位置,并记录为偏移量(以及表示已启动快照的标记)。然后,该任务将继续复制每个集合,尽可能生成线程(最多为 snapshot.max.threads
配置属性的值)来并行执行这一工作。连接器将为每个文档记录一个单独的 读取事件,并且读取事件将包含对象的标识符、对象的完整状态,以及找到对象的 MongoDB 副本集 的源 信息。源信息还包括一个标记,表示事件是在快照期间生成的。
此快照将继续,直到复制了与连接器过滤器匹配的所有集合。如果在任务的快照完成前停止连接器,在重启连接器后再次开始快照。
尝试避免在连接器执行任何副本集的快照时避免任务重新分配和重新配置。连接器会生成日志消息来报告快照的进度。要提供最大的控制,请为每个连接器运行单独的 Kafka Connect 集群。
4.2.3.1. 临时快照 复制链接链接已复制到粘贴板!
临时快照是 Debezium MongoDB 连接器的技术预览功能。技术预览功能不被红帽产品服务级别协议(SLA)支持,且可能无法完成。因此,红帽不推荐在生产环境中实施任何技术预览功能。此技术预览功能为您提供对即将推出的产品创新的早期访问,允许您在开发过程中测试并提供反馈。如需有关支持范围的更多信息,请参阅 技术预览功能支持范围。
默认情况下,连接器仅在首次启动后运行初始快照操作。在正常情况下,遵循这个初始快照,连接器不会重复快照过程。连接器捕获的任何将来更改事件数据都仅通过流传输过程。
然而,在某些情况下,连接器在初始快照期间获取的数据可能会变得过时、丢失或不完整。为了提供总结集合数据的机制,Debezium 包含一个执行临时快照的选项。数据库中的以下更改可能是执行临时快照:
- 连接器配置会被修改来捕获不同的集合集。
- Kafka 主题已删除,必须重建。
- 由于配置错误或某些其他问题导致数据损坏。
您可以通过启动所谓的 临时命令快照,为之前捕获的快照重新运行快照。临时快照需要使用 信号集合。您可以通过向 Debezium 信号集合发送信号请求来启动临时快照。
当您启动现有集合的临时快照时,连接器会将内容附加到集合已存在的主题中。如果删除了之前存在的主题,如果启用自动主题创建,Debezium 可以自动创建主题。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#customization-of-kafka-connect-automatic-topic-creation
临时快照信号指定要包含在快照中的集合。快照可以捕获数据库的整个内容,或者只捕获数据库中的集合子集。另外,快照也可以捕获数据库中集合内容的子集。
您可以通过向信号集合发送 execute-snapshot
消息来指定要捕获的集合。将 execute-snapshot
信号的类型设置为增量
,并提供快照中包含的集合名称,如下表所述:
字段 | 默认 | 值 |
---|---|---|
|
|
指定您要运行的快照类型。 |
| 不适用 |
包含与要快照的集合的完全限定域名匹配的正则表达式的数组。 |
| 不适用 | 可选字符串,它根据集合的列指定条件,用于捕获集合内容的子集。 |
触发临时快照
您可以通过在信号集合中添加带有 execute-snapshot
信号类型的条目来启动临时快照。连接器处理消息后,它会开始快照操作。快照过程读取第一个和最后一个主密钥值,并使用这些值作为每个集合的开始和端点。根据集合中条目数量以及配置的块大小,Debezium 将集合分成块,并一次为每个块进行快照。
4.2.3.2. 增量快照 复制链接链接已复制到粘贴板!
增量快照是 Debezium MongoDB 连接器的技术预览功能。技术预览功能不被红帽产品服务级别协议(SLA)支持,且可能无法完成。因此,红帽不推荐在生产环境中实施任何技术预览功能。此技术预览功能为您提供对即将推出的产品创新的早期访问,允许您在开发过程中测试并提供反馈。如需有关支持范围的更多信息,请参阅 技术预览功能支持范围。
为了提供管理快照的灵活性,Debezium 包括一个补充的快照机制,称为 增量快照。增量快照依赖于 Debezium 机制 向 Debezium 连接器发送信号。
在增量快照中,而不是一次性捕获数据库的完整状态,如初始快照,Debezium 会在一系列可配置的块中捕获每个集合。您可以指定您希望快照捕获 的集合以及每个块的大小。块大小决定了快照在数据库的每个获取操作期间收集的行数。增量快照的默认块大小为 1 KB。
当增量快照进行时,Debezium 使用水位线来跟踪其进度,维护它捕获的每个集合行的记录。这个阶段捕获数据的方法比标准初始快照过程提供以下优点:
- 您可以使用流化数据捕获并行运行增量快照,而不是经过发布流,直到快照完成为止。连接器会继续在整个快照过程中从更改日志捕获接近实时事件,且操作都不会阻断其他事件。
- 如果增量快照的进度中断,您可以在不丢失任何数据的情况下恢复它。在进程恢复后,快照从停止的时间开始,而不是从开始回收集合。
-
您可以随时根据需要运行增量快照,并根据需要重复这个过程以适应数据库更新。例如,您可以在修改连接器配置后重新运行快照,以将集合添加到其
collection.include.list
属性中。
增量快照过程
当您运行增量快照时,Debezium 按主密钥对集合进行排序,然后根据 配置的块大小 将集合分成块。然后,按块使用块,然后捕获块中的每个集合行。对于它捕获的每行,快照会发出 READ
事件。该事件代表了块开始快照时的行值。
当快照继续进行时,其他进程可能会继续访问数据库,从而可能会修改集合记录。要反映此类更改,INSERT
、UPDATE
或 DELETE
操作会照常提交到事务日志中。同样,持续 Debezium 流过程还会继续检测这些更改事件,并将对应的更改事件记录发送到 Kafka。
Debezium 如何使用相同的主密钥解决记录间的冲突
在某些情况下,流传输进程发出的 UPDATE
或 DELETE
事件会耗尽序列。也就是说,流过程可能会发出一个事件,它会在快照捕获包含该行的 READ
事件前修改集合行。当快照最终会为行发出对应的 READ
事件时,其值已经被替换。为确保以正确的逻辑顺序处理到达序列的增量快照事件,Debezium 会使用一种缓冲区方案来解决冲突。只有在快照事件和流事件间冲突时才解决后,Debezium 会向 Kafka 发送事件记录。
快照窗口
为了帮助解决后续 READ
事件和修改同一集合行的流事件之间的冲突,Debezium 采用所谓的 快照窗口。快照窗口分离了增量快照捕获指定集合块的数据的时间间隔。在打开块的快照窗口前,Debebe 会遵循其常见的行为,并将事件直接从事务日志直接降级到目标 Kafka 主题。但是,从打开特定块的快照时,Debebe 会执行重复数据删除步骤,以解决具有相同主密钥的事件之间冲突。
对于每个数据收集,Debezium 会发出两种类型的事件,并将其记录存储在单个目标 Kafka 主题中。它直接从表中捕获的快照记录作为 READ
操作发出。同时,当用户继续更新数据收集中的记录,并更新事务日志以反映每个提交,Debezium 会为每个更改发出 UPDATE
或 DELETE
操作。
当快照窗口打开时,Debezium 开始处理快照块,它会将快照记录提供给内存缓冲区。在快照窗口中,缓冲区中 READ
事件的主键将与传入流事件的主键进行比较。如果没有找到匹配项,流的事件记录将直接发送到 Kafka。如果 Debezium 检测到匹配项,它会丢弃缓冲的 READ
事件,并将流的记录写入目标主题,因为流的事件逻辑地替换静态快照事件。在块的快照窗口关闭后,缓冲区仅包含没有相关事务日志事件的 READ
事件。Debezium 将这些剩余的 READ
事件发送到集合的 Kafka 主题。
连接器重复每个快照块的进程。
增量快照需要完全排序主密钥。但是,字符串
可能无法保证稳定的排序,因为编码和特殊字符可能会导致意外行为(Mongo 排序 字符串
)。请考虑在执行增量快照时将其他类型用于主密钥。
目前,单个副本集部署只支持增量快照。
4.2.3.3. 触发增量快照 复制链接链接已复制到粘贴板!
目前,启动增量快照的唯一方法是向源数据库上的 信号集合发送临时快照 信号。
您可以使用 MongoDB insert ()
方法向信号集合提交信号。
在 Debezium 检测到信号集合中的更改后,它会读取信号,并运行请求的快照操作。
您提交的查询指定要包含在快照中的集合,以及可选的指定快照操作类型。目前,快照操作的唯一有效选项是默认值 增量
。
要指定快照中包含的集合,提供一个 data-collections
数组,该数组列出了用于匹配集合的集合或一组正则表达式,例如{"data-collections": ["public.Collection1", "public.Collection2"]}
增量快照信号的 data-collections
数组没有默认值。如果 data-collections
数组为空,Debezium 会检测到不需要任何操作,且不执行快照。
如果要包含在快照中的集合名称包含数据库、模式或表名称的句点(.
),则需要将集合添加到 data-collections
数组中,您必须用双引号转义名称的每个部分。
例如,若要包含 公共
数据库中存在的数据收集,并且名为 MyCollection
,请使用以下格式:" public"."MyCollection
"。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
将快照信号文档插入到信号集合中:
<signalDataCollection>.insert({"id" : _<idNumber>,"type" : <snapshotType>, "data" : {"data-collections" ["<collectionName>", "<collectionName>"],"type": <snapshotType>}});
<signalDataCollection>.insert({"id" : _<idNumber>,"type" : <snapshotType>, "data" : {"data-collections" ["<collectionName>", "<collectionName>"],"type": <snapshotType>}});
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令中的
id
、type
和data
参数的值对应于 信号集合的字段。下表描述了示例中的参数:
Expand 表 4.2. MongoDB insert ()命令中的字段描述,用于将增量快照信号发送到信号集合 项 值 描述 1
db.debeziumSignal
指定源数据库上信号集合的完全限定名称。
2
null
_id
参数指定分配给信号请求的id
标识符的任意字符串。
上例中的插入方法省略了可选_id
参数的使用。由于文档没有明确为该参数分配值,所以 MongoDB 会自动分配给文档的任意 id 成为信号请求的id
标识符。
使用此字符串来标识到信号集合中条目的日志记录信息。Debezium 不使用此标识符字符串。相反,在快照中,Debebe 会生成自己的id
字符串作为水位信号。3
execute-snapshot
指定
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段所需的组件,用于指定集合名称或正则表达式数组,以匹配快照中包含的集合名称。
数组根据其完全限定名称列出与集合匹配的正则表达式,其格式与您用来在signal.data.collection
配置属性中指定连接器的信号集合的名称相同。5
增量
信号的
data
字段的可选类型
组件,用于指定要运行的快照操作类型。
目前,唯一有效选项是默认值增量
。
如果没有指定值,连接器将运行一个增量快照。
以下示例显示了连接器捕获的增量快照事件的 JSON。
示例:增加快照事件信息
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定要运行的快照操作类型。 |
2 |
|
指定事件类型。 |
4.2.3.4. 停止增量快照 复制链接链接已复制到粘贴板!
您还可以通过向源数据库上的集合发送信号来停止增量快照。您可以通过在信号集合中插入文档来提交停止快照信号。在 Debezium 检测到信号集合中的更改后,它会读取信号,并在进行时停止增量快照操作。
您提交的查询指定了 增量
的快照操作,以及可选的、要删除的当前运行快照的集合。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
将停止快照信号文档插入到信号集合中:
<signalDataCollection>.insert({"id" : _<idNumber>,"type" : "stop-snapshot", "data" : {"data-collections" ["<collectionName>", "<collectionName>"],"type": "incremental"}});
<signalDataCollection>.insert({"id" : _<idNumber>,"type" : "stop-snapshot", "data" : {"data-collections" ["<collectionName>", "<collectionName>"],"type": "incremental"}});
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
Copy to Clipboard Copied! Toggle word wrap Toggle overflow signal 命令中的
id
、type
和data
参数的值对应于 信号集合的字段。下表描述了示例中的参数:
Expand 表 4.3. 向信号集合发送停止增量快照文档的插入命令中字段的描述 项 值 描述 1
db.debeziumSignal
指定源数据库上信号集合的完全限定名称。
2
null
上例中的插入方法省略了可选
_id
参数的使用。由于文档没有明确为该参数分配值,所以 MongoDB 会自动分配给文档的任意 id 成为信号请求的id
标识符。
使用此字符串来标识到信号集合中条目的日志记录信息。Debezium 不使用此标识符字符串。3
stop-snapshot
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段的可选组件,用于指定集合名称或正则表达式数组,以匹配要从快照中删除的集合名称。
数组根据其完全限定名称列出与集合匹配的正则表达式,其格式与您用来在signal.data.collection
配置属性中指定连接器的信号集合的名称相同。如果省略了data
字段的此组件,则信号将停止正在进行的整个增量快照。5
增量
信号的
data
字段所需的组件,用于指定要停止的快照操作类型。
目前,唯一有效选项是增量的
。
如果没有指定类型
值,则信号无法停止增量快照。
4.2.4. Debezium MongoDB 连接器流更改事件记录 复制链接链接已复制到粘贴板!
在副本设置的连接器任务记录偏移后,它会使用偏移来确定它应该启动流更改的 oplog 中的位置。然后,任务(取决于配置)连接到副本集的主节点,或连接到副本集范围的更改流,并开始从该位置更改流。它处理所有创建、插入和删除操作,并将其转换为 Debezium 更改事件。每个更改事件都包含找到操作的 oplog 中的位置,连接器会定期将其记录为其最新的偏移量。记录偏移的时间间隔取决于 offset.flush.interval.ms
,它是一个 Kafka Connect worker 配置属性。
当连接器安全停止时,处理的最后一个偏移会被记录,以便在重启时,连接器将继续准确关闭位置。如果连接器的任务意外终止,则任务可能会在最后记录偏移后处理并生成事件,但在记录最后一个偏移前;重启后,连接器从上次 记录的 偏移开始,可能会生成之前在崩溃前生成的相同事件。
当 Kafka 管道中的所有组件无关时,Kafka 使用者 会完全 接收每个消息。但是,当出现错误时,Kafka 只能保证消费者 至少接收每个消息一次。为避免意外的结果,消费者必须能够处理重复的消息。
如前面所述,连接器任务总是使用副本集的主节点从 oplog 流更改,确保连接器尽可能查看最新的操作,并可以捕获比使用第二个延迟更低的更改。当副本集选择新主节点时,连接器会立即停止流更改,连接到新主节点,并从同一位置的新主节点启动流更改。同样,如果连接器遇到与副本集成员通信的问题,它会尝试使用 exponential backoff 来重新连接,以便不负担副本集,并连接后继续从最后离开的位置进行更改。这样,连接器可以动态调整副本设置成员资格中的更改,并自动处理通信失败。
为了总结,MongoDB 连接器在大多数情况下继续运行。通信问题可能会导致连接器等待直到问题解决为止。
4.2.5. MongoDB 支持在 Debezium 更改事件中填充 before 字段 复制链接链接已复制到粘贴板!
在 MongoDB 6.0 及更高版本中,您可以配置更改流,以发出文档的预镜像状态,以填充 MongoDB 更改事件的 before
字段。要在 MongoDB 中启用预镜像,您必须使用 db.
、创建或 create
Collection ()collMod
为集合设置 changeStreamPreAndPostImages
。要使 Debezium MongoDB 在更改事件中包含 pre-images,请将连接器的 capture.mode
设置为 一 一 一 一,with_pre_image
选项。
MongoDB 更改流事件的大小限制为 16MB。因此,使用预镜像会增加这个阈值的可能性,这可能会导致失败。有关如何避免超过更改流限制的详情,请参考 MongoDB 文档。
4.2.6. 接收 Debezium MongoDB 更改事件记录的 Kafka 主题默认名称 复制链接链接已复制到粘贴板!
MongoDB 连接器将所有插入、更新和删除操作写入事件,将每个集合中的操作写入单个 Kafka 主题。Kafka 主题的名称始终使用 logicalName.databaseName.collectionName 格式,其中 logical Name 是连接器的逻辑名称,如 topic.prefix
配置属性,databaseName 是发生操作的数据库的名称,collectionName 是受影响的文档存在的 MongoDB 集合的名称。
例如,假设一个 MongoDB 副本集有一个 inventory
数据库,其中包含四个集合:products
, products_on_hand
, customers
, 和 orders
。如果监控这个数据库的连接器有一个逻辑名称 fulfillment
,则这个连接器会在这四个 Kafka 主题上生成事件:
-
fulfillment.inventory.products
-
fulfillment.inventory.products_on_hand
-
fulfillment.inventory.customers
-
fulfillment.inventory.orders
请注意,主题名称不包含副本集名称或分片名称。因此,对分片集合的所有更改(每个分片都包含集合文档的子集)都属于相同的 Kafka 主题。
您可以根据需要将 Kafka 设置为自动创建主题。https://kafka.apache.org/documentation.html#basic_ops_add_topic如果没有,则必须使用 Kafka 管理工具在启动连接器前创建主题。
4.2.7. Debezium MongoDB 连接器的事件键控制主题分区的方式 复制链接链接已复制到粘贴板!
MongoDB 连接器不会明确决定如何为事件分区主题。相反,它允许 Kafka 根据事件密钥决定如何对主题进行分区。您可以通过在 Kafka Connect worker 配置中定义 Partitioner
实现来更改 Kafka 的分区逻辑。
Kafka 仅在写入单个主题分区的事件维护总顺序。按键对事件进行分区意味着所有具有相同键的事件始终都进入同一分区。这样可确保特定文档的所有事件始终被完全排序。
4.2.8. Debezium MongoDB 连接器生成的事件代表事务边界 复制链接链接已复制到粘贴板!
Debezium 可以生成代表事务元数据边界的事件,并增强更改数据事件消息。
Debezium 仅在部署连接器后为发生的事务注册并接收元数据。部署连接器前发生的事务元数据。
对于每个事务 BEGIN
和 END
,Debezium 生成一个包含以下字段的事件:
status
-
BEGIN
或END
id
- 唯一事务标识符的字符串表示。
event_count
(用于END
事件)- 事务发出的事件总数。
data_collections
(用于END
事件)-
data_collection
和event_count
对,它提供了由来自给定数据收集的更改所发出的事件数量。
以下示例显示了典型的信息:
除非通过 topic.transaction
选项覆盖,否则事务事件将写入名为 <topic. prefix>
。
.transaction
的主题
更改数据事件增强
如果启用了事务元数据,数据消息 Envelope
会增加一个新的 transaction
字段。此字段以字段复合的形式提供有关每个事件的信息:
id
- 唯一事务标识符的字符串表示。
total_order
- 事件在事务生成的所有事件的绝对路径。
data_collection_order
- 事件在事务发送的所有事件中每个数据收集位置。
以下是信息类似如下的示例:
4.3. Debezium MongoDB 连接器数据更改事件的描述 复制链接链接已复制到粘贴板!
Debezium MongoDB 连接器为每个插入、更新或删除数据的文档级别操作生成数据更改事件。每个事件都包含一个键和值。键和值的结构取决于更改的集合。
Debezium 和 Kafka Connect 围绕 事件消息的持续流 设计。但是,这些事件的结构可能会随时间而变化,而用户很难处理这些事件。要解决这个问题,每个事件都包含其内容的 schema,或者如果您使用 schema registry,则消费者可以从 registry 获取 schema 的模式 ID。这使得每个事件都可以自我包含。
以下框架 JSON 显示更改事件的基本四个部分。但是,如何配置在应用程序中使用的 Kafka Connect converter 决定了更改事件中的这四个部分的表示。只有当您将转换器配置为生成它时,schema
字段才处于更改事件中。同样,只有在将转换器配置为生成它时,才会发生更改事件中的事件密钥和事件有效负载。如果您使用 JSON 转换器,并将其配置为生成所有四个基本更改事件部分,则更改事件具有此结构:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
第一个 |
2 |
|
第一个 |
3 |
|
第二个 |
4 |
|
第二个 |
默认情况下,连接器流将事件记录更改为名称与事件原始集合相同的名称的主题。请参阅 主题名称。
MongoDB 连接器确保所有 Kafka Connect 模式名称都遵循 Avro 模式名称格式。这意味着,逻辑服务器名称必须以拉丁或下划线开头,即 a-z、A-Z 或 _。逻辑服务器名称中的每个剩余的字符以及数据库和集合名称中的每个字符都必须是一个字母、数字或下划线,即 a-z、A-Z、0-9 或 \_。如果存在无效的字符,它将替换为下划线字符。
如果逻辑服务器名称、数据库名称或集合名称包含无效字符,且区分另一个名称的唯一字符无效,则可能会导致意外冲突,因此替换为下划线。
如需更多信息,请参阅以下主题:
4.3.1. 关于 Debezium MongoDB 更改事件中的键 复制链接链接已复制到粘贴板!
更改事件的密钥包含更改文档的密钥的 schema,以及更改的文档的实际密钥。对于给定集合,schema 及其对应有效负载都包含单个 id
字段。此字段的值是文档的标识符,表示为来自 MongoDB 扩展 JSON 序列化严格模式的字符串。
考虑一个连接器,其逻辑名称为 fulfillment
,包括一个 inventory
数据库的副本集,以及包含如下文档的 customers
集合。
文档示例
更改事件键示例
捕获对 customers
集合的更改的每个更改事件都有相同的事件键模式。只要 customers
集合有以前的定义,捕获 客户
集合更改的事件都有以下关键结构:在 JSON 中,它类似如下:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
键的 schema 部分指定一个 Kafka Connect 模式,它描述了密钥 |
2 |
|
定义密钥有效负载结构的 schema 名称。这个模式描述了文档的密钥结构。Key 模式名称的格式为 connector-name.database-name.collection-name.
|
3 |
|
指明 event 键必须在其 |
4 |
|
指定 |
5 |
|
包含生成此更改事件的文档的密钥。在本例中,键包含一个类型为 |
本例使用带有整数标识符的文档,但任何有效的 MongoDB 文档标识符都的工作方式相同,包括文档标识符。对于文档标识符,事件的 payload.id
值是一个字符串,它代表更新的文档的原始 _id
字段作为一个 MongoDB 扩展 JSON 序列化,它使用严格的模式。下表提供了如何表示不同类型的 _id
字段的示例。
类型 | MongoDB _id Value | 密钥的有效负载 |
---|---|---|
整数 | 1234 |
|
浮点值 | 12.34 |
|
字符串 | "1234" |
|
文档 |
|
|
ObjectId |
|
|
二进制 |
|
|
4.3.2. 关于 Debezium MongoDB 更改事件中的值 复制链接链接已复制到粘贴板!
更改事件中的值比键稍微复杂。与键一样,该值具有 schema
部分和 payload
部分。schema
部分包含描述 payload
部分的 Envelope
结构的 schema,包括其嵌套字段。更改创建、更新或删除数据的事件,并且具有 envelope 结构的值有效负载。
考虑用于显示更改事件键示例的相同示例文档:
文档示例
对每个事件类型都描述了更改事件的值部分:
创建 事件
以下示例显示了连接器为 在客户
集合中创建数据的操作生成的更改事件的值部分:
项 | 字段名称 | 描述 |
---|---|---|
1 |
| 值的 schema,用于描述值有效负载的结构。每次连接器为特定集合生成的更改时,更改事件的值模式都是相同的。 |
2 |
|
在 |
3 |
|
|
4 |
|
|
5 |
|
值的实际数据。这是更改事件提供的信息。 |
6 |
|
指定事件发生后文档状态的可选字段。在本例中, |
7 |
| 描述事件源元数据的必需字段。此字段包含可用于将此事件与其他事件进行比较的信息,以及事件的来源、事件发生的顺序,以及事件是否为同一事务的一部分。源元数据包括:
|
8 |
|
描述导致连接器生成事件的操作类型的必要字符串。在本例中,
|
9 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
更改流捕获模式
示例 customers
集合中一个更新的改变事件的值有与那个集合的 create 事件相同的模式。同样,事件的 payload 具有相同的结构。但是,事件值 payload 在更新 事件中包含不同的值。只有在 capture.mode
选项被设置为 change_streams_ update _full
时,更新事件才会包括 after
值。如果 capture.mode
选项被设置为 一 个,则 会提供一个
before
值。新的 structured 字段 更新Description
,本例中为几个附加字段:
-
updatedFields
是一个字符串字段,其中包含更新的文档字段的 JSON 表示及其值 -
removedFields
是从文档中删除的字段名称列表 -
已
截断的Arrays
是被截断的文档中的数组列表
以下是连接器为 customers
集合中更新生成的改变事件值的示例:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
描述导致连接器生成事件的操作类型的必要字符串。在本例中, |
2 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
3 |
|
在更改前,包含实际 MongoDB 文档的 JSON 字符串表示。如果捕获模式没有设置为 sVirt |
4 |
|
包含实际 MongoDB 文档的 JSON 字符串表示。 |
5 |
|
包含文档更新字段值的 JSON 字符串表示。在本例中,更新将 |
6 |
| 描述事件源元数据的必需字段。此字段包含与同一集合的 create 事件相同的信息,但它们的值不同,因为此事件来自 oplog 中的不同位置。源元数据包括:
|
事件中的 after
值应作为文档的 at-of-time 值进行处理。该值不会被动态计算,而是从集合中获取。因此,如果多个更新一个紧随另一个发生,则所有 update 事件都会包含在文档中存储的代表最后的值相同的 after
值。
如果您的应用程序依赖于逐步变化,那么您应该只依赖 更新描述
。
删除 事件
delete 更改事件中的值与为同一集合的 create 和 update 事件相同的 schema
部分。delete 事件中的 payload
部分包含与为同一集合的 create 和 update 事件不同的值。特别是 delete 事件既不包含 after
值,也不包含 updateDescription
值。以下是 customers
集合中文档的 delete 事件示例:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
描述操作类型的强制字符串。 |
2 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
3 |
|
在更改前,包含实际 MongoDB 文档的 JSON 字符串表示。如果捕获模式没有设置为 sVirt |
4 |
| 描述事件源元数据的必需字段。此字段包含与同一集合的 create 或 update 事件相同的信息,但它们的值不同,因为此事件来自 oplog 中的不同位置。源元数据包括:
|
MongoDB 连接器事件旨在用于 Kafka 日志压缩。只要每个密钥至少保留最新的消息,日志压缩就可以删除一些旧的消息。这可让 Kafka 回收存储空间,同时确保主题包含完整的数据集,并可用于重新载入基于密钥的状态。
tombstone 事件
唯一标识文档的所有 MongoDB 连接器事件都完全相同。删除文档时,delete 事件值仍可用于日志压缩,因为 Kafka 您可以删除具有相同键的所有之前信息。但是,对于 Kafka 删除具有该键的所有消息,消息值必须是 null
。为了实现此目的,在 Debezium 的 MongoDB 连接器发出 delete 事件后,连接器会发出一个特殊的 tombstone 事件,它具有相同的键但为 null
值。tombstone 事件会通知 Kafka,所有具有相同键的消息都可被删除。
4.4. 设置 MongoDB 以使用 Debezium 连接器 复制链接链接已复制到粘贴板!
MongoDB 连接器使用 MongoDB 的更改流捕获更改,因此连接器仅适用于 MongoDB 副本集或分片集群,其中每个分片都是一个单独的副本集。有关设置 副本集或 分片 集群的信息,请参阅 MongoDB 文档。另外,请务必了解如何使用副本集启用 访问控制和身份验证。
您还必须有一个 MongoDB 用户,该用户具有适当的角色才能读取 oplog 的 admin
数据库。另外,用户还必须能够在分片集群的配置服务器中读取 config
数据库,并且必须具有 listDatabases
特权操作。当使用更改流时(默认)用户还必须有集群范围的权限操作 find
并 changeStream
。
当您打算使用 pre-image 并填充 before
字段时,您需要首先使用 db.
、创建 或 create
Collection ()collMod
为集合启用 changeStreamPreAndPostImages
。
4.5. 部署 Debezium MongoDB 连接器 复制链接链接已复制到粘贴板!
您可以使用以下任一方法部署 Debezium MongoDB 连接器:
4.5.1. 使用 AMQ Streams 部署 MongoDB 连接器 复制链接链接已复制到粘贴板!
从 Debezium 1.7 开始,部署 Debezium 连接器的首选方法是使用 AMQ Streams 来构建包含连接器插件的 Kafka Connect 容器镜像。
在部署过程中,您可以创建并使用以下自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR,并包含有关镜像中需要包含连接器工件的信息。 -
提供连接器用来访问源数据库的信息的
KafkaConnector
CR。在 AMQ Streams 启动 Kafka Connect pod 后,您可以通过应用KafkaConnector
CR 来启动连接器。
在 Kafka Connect 镜像的构建规格中,您可以指定可用于部署的连接器。对于每个连接器插件,您还可以指定您的部署可以使用的其他组件。例如,您可以添加 Apicurio Registry 工件或 Debezium 脚本组件。当 AMQ Streams 构建 Kafka Connect 镜像时,它会下载指定的工件,并将其合并到镜像中。
KafkaConnect
CR 中的 spec.build.output
参数指定存储生成的 Kafka Connect 容器镜像的位置。容器镜像可以存储在 Docker registry 中,也可以存储在 OpenShift ImageStream 中。要将镜像存储在 ImageStream 中,您必须先创建 ImageStream,然后才能部署 Kafka Connect。镜像流不会被自动创建。
如果使用 KafkaConnect
资源创建集群,之后您无法使用 Kafka Connect REST API 创建或更新连接器。您仍然可以使用 REST API 来检索信息。
其他资源
- 在 OpenShift 上使用 AMQ Streams 配置 Kafka 连接。
- 在 OpenShift 中部署和升级 AMQ Streams 中的使用 AMQ Streams 自动创建新容器镜像。
4.5.2. 使用 AMQ Streams 部署 Debezium MongoDB 连接器 复制链接链接已复制到粘贴板!
使用早期版本的 AMQ Streams 时,要在 OpenShift 上部署 Debezium 连接器,首先需要为连接器构建 Kafka Connect 镜像。在 OpenShift 上部署连接器的当前首选的方法是使用 AMQ Streams 中的构建配置来自动构建 Kafka Connect 容器镜像,其中包含您要使用的 Debezium 连接器插件。
在构建过程中,AMQ Streams Operator 会将 KafkaConnect
自定义资源中的输入参数(包括 Debezium 连接器定义)转换为 Kafka Connect 容器镜像。构建从 Red Hat Maven 存储库或其他配置的 HTTP 服务器下载必要的工件。
新创建的容器被推送到 .spec.build.output
中指定的容器 registry,用于部署 Kafka Connect 集群。AMQ Streams 构建 Kafka Connect 镜像后,您可以创建 KafkaConnector
自定义资源来启动构建中包含的连接器。
先决条件
- 您可以访问安装了集群 Operator 的 OpenShift 集群。
- AMQ Streams Operator 正在运行。
- 部署 Apache Kafka 集群,如在 OpenShift 中部署和升级 AMQ Streams 所述。
- Kafka Connect 部署在 AMQ Streams 上
- 您有红帽构建的 Debezium 许可证。
-
已安装 OpenShift
oc
CLI 客户端,或者您可以访问 OpenShift Container Platform Web 控制台。 根据您要存储 Kafka Connect 构建镜像的方式,您需要 registry 权限或您必须创建 ImageStream 资源:
- 要将构建镜像存储在镜像 registry 中,如 Red Hat Quay.io 或 Docker Hub
- 在 registry 中创建和管理镜像的帐户和权限。
- 将构建镜像存储为原生 OpenShift ImageStream
- ImageStream 资源已部署到集群中。您必须为集群明确创建 ImageStream。镜像流默认不可用。如需有关 ImageStreams 的更多信息,请参阅在 OpenShift Container Platform 上管理镜像流。
流程
- 登录 OpenShift 集群。
为连接器创建 Debezium
KafkaConnect
自定义资源(CR),或修改现有的资源。例如,创建一个名为dbz-connect.yaml
的KafkaConnect
CR,用于指定metadata.annotations
和spec.build
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
例 4.1.
dbz-connect.yaml
文件,该文件定义包含 Debezium 连接器的KafkaConnect
自定义资源在以下示例中,自定义资源被配置为下载以下工件:
- Debezium MongoDB 连接器存档。
- 红帽构建的 Apicurio Registry 存档。Apicurio Registry 是一个可选组件。只有在打算在连接器中使用 Avro 序列化时,才添加 Apicurio Registry 组件。
- Debezium 脚本 SMT 归档以及您要与 Debezium 连接器一起使用的关联脚本引擎。SMT 归档和脚本语言依赖项是可选组件。只有在打算使用 Debezium 是 基于内容的路由 SMT 或 过滤 SMT 时,才添加这些组件。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 4.10. Kafka Connect 配置设置的描述 项 描述 1
将
strimzi.io/use-connector-resources
注解设置为"true"
,以便 Cluster Operator 使用KafkaConnector
资源在此 Kafka Connect 集群中配置连接器。2
spec.build
配置指定构建镜像的位置,并列出要在镜像中包含的插件,以及插件工件的位置。3
build.output
指定存储新构建镜像的 registry。4
指定镜像输出的名称和镜像名称。
output.type
的有效值是docker
,可推送到容器 registry,如 Docker Hub 或 Quay,或将镜像推送到内部 OpenShift ImageStream的镜像流
。要使用 ImageStream,必须将 ImageStream 资源部署到集群中。有关在 KafkaConnect 配置中指定build.output
的更多信息,请参阅在 OpenShift 中配置 AMQ Streams 中的 AMQ Streams Build schema 参考。5
插件配置
列出了您要包含在 Kafka Connect 镜像中的所有连接器。对于列表中的每个条目,指定一个插件名称
,以及有关构建连接器所需的工件的信息。另外,对于每个连接器插件,您还可以包含您要与连接器一起使用的其他组件。例如,您可以添加 Service Registry 工件或 Debezium 脚本组件。6
artifacts.type
的值指定artifacts.url
中指定的工件的文件类型。有效类型是zip
、tgz
或jar
。Debezium 连接器存档以.zip
文件格式提供。type
值必须与url
字段中引用的文件类型匹配。7
artifacts.url
的值指定 HTTP 服务器的地址,如 Maven 存储库,用于存储连接器工件的文件。Debezium 连接器工件位于 Red Hat Maven 存储库中。OpenShift 集群必须有权访问指定的服务器。8
(可选)指定用于下载 Apicurio Registry 组件的工件
类型和
url
。包括 Apicurio Registry 工件,只有在您希望连接器使用 Apache Avro 与 Red Hat build of Apicurio Registry 序列化事件键和值时,而不是使用默认的 JSON converter。9
(可选)指定 Debezium 脚本 SMT 归档的工件
类型和
url
,以用于 Debezium 连接器。只有在打算使用 Debezium 基于内容的路由 SMT 或 过滤 SMT 时使用脚本 SMT 时,才包含脚本 SMT,您必须部署 JSR 223 兼容脚本实施,如 groovy。10
(可选)为 JSR 223 兼容脚本实现的 JAR 文件指定工件
类型和
url
,这是 Debezium 脚本 SMT 所需的。重要如果您使用 AMQ Streams 将连接器插件合并到 Kafka Connect 镜像中,每个所需脚本语言组件
artifacts.url
必须指定 JAR 文件的位置,而artifacts.type
的值还必须设置为jar
。无效的值会导致连接器在运行时失败。要启用使用带有脚本 SMT 的 Apache Groovy 语言,示例中的自定义资源会检索以下库的 JAR 文件:
-
groovy
-
Groovy-jsr223
(协调代理) -
Groovy-json
(用于解析 JSON 字符串的模块)
作为替代方案,Debebe 脚本 SMT 还支持使用 GraalVM JavaScript 的 JSR 223 实现。
输入以下命令将
KafkaConnect
构建规格应用到 OpenShift 集群:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据自定义资源中指定的配置,Streams Operator 会准备要部署的 Kafka Connect 镜像。
构建完成后,Operator 将镜像推送到指定的 registry 或 ImageStream,并启动 Kafka Connect 集群。您配置中列出的连接器工件在集群中可用。创建一个
KafkaConnector
资源来定义您要部署的每个连接器的实例。
例如,创建以下KafkaConnector
CR,并将它保存为mongodb-inventory-connector.yaml
例 4.2. 为 Debezium 连接器定义
KafkaConnector
自定义资源的mongodb-inventory-connector.yaml
文件Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 4.11. 连接器配置设置的描述 项 描述 1
使用 Kafka Connect 集群注册的连接器名称。
2
连接器类的名称。
3
可同时运行的任务数量。
4
连接器的配置。
5
主机数据库实例的地址和端口号。
7
Debezium 用于连接到数据库的帐户名称。
8
Debezium 用于连接到数据库用户帐户的密码。
8
数据库实例或集群的主题前缀。
指定的名称只能从字母数字字符或下划线括起。
由于主题前缀用作从这个连接器接收更改事件的任何 Kafka 主题的前缀,所以名称必须在集群中的连接器之间唯一。
此命名空间也用于相关的 Kafka Connect 模式的名称,如果您将连接器与 Avro 连接器集成,则对应的 Avro 模式的命名空间也用于。9
连接器从中捕获更改的集合名称。
运行以下命令来创建连接器资源:
oc create -n <namespace> -f <kafkaConnector>.yaml
oc create -n <namespace> -f <kafkaConnector>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc create -n debezium -f {context}-inventory-connector.yaml
oc create -n debezium -f {context}-inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 连接器注册到 Kafka Connect 集群,并开始针对
KafkaConnector
CR 中的spec.config.database.dbname
指定的数据库运行。连接器 pod 就绪后,Debezium 正在运行。
现在,您已准备好 验证 Debezium MongoDB 部署。
要部署 Debezium MongoDB 连接器,您必须构建包含 Debezium 连接器存档的自定义 Kafka Connect 容器镜像,然后将此容器镜像推送到容器 registry。然后,创建两个自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR。CR 中的image
属性指定您创建用来运行 Debezium 连接器的容器镜像的名称。您可以将此 CR 应用到部署了 Red Hat AMQ Streams 的 OpenShift 实例。AMQ Streams 提供将 Apache Kafka 引入到 OpenShift 的 operator 和镜像。 -
定义 Debezium MongoDB 连接器的
KafkaConnector
CR。将此 CR 应用到应用KafkaConnect
CR 的同一 OpenShift 实例。
先决条件
- MongoDB 正在运行,您完成了 设置 MongoDB 的步骤以用于 Debezium 连接器。
- AMQ Streams 部署在 OpenShift 上,并运行 Apache Kafka 和 Kafka Connect。如需更多信息,请参阅在 OpenShift 中部署和升级 AMQ Streams。
- podman 或 Docker 已安装。
-
您有在容器 registry 中创建和管理容器(如
quay.io
或docker.io
)的帐户和权限,您要向其添加将运行 Debezium 连接器的容器。
流程
为 Kafka Connect 创建 Debezium MongoDB 容器:
创建一个 Dockerfile,它使用
registry.redhat.io/amq7/amq-streams-kafka-32-rhel8:2.2.0-12
作为基础镜像。例如,在终端窗口中输入以下命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
您可以指定您想要的任何文件名。
2
指定 Kafka Connect 插件目录的路径。如果您的 Kafka Connect 插件目录位于不同的位置,请将这个路径替换为您的目录的实际路径。
该命令在当前目录中创建一个名为
debezium-container-for-mongodb.yaml
的 Dockerfile。从您在上一步中创建的
debezium-container-for-mongodb.yaml
Docker 文件中构建容器镜像。在包含该文件的目录中,打开终端窗口并输入以下命令之一:podman build -t debezium-container-for-mongodb:latest .
podman build -t debezium-container-for-mongodb:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker build -t debezium-container-for-mongodb:latest .
docker build -t debezium-container-for-mongodb:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述命令使用名称
debezium-container-for-mongodb
构建容器镜像。将自定义镜像推送到容器 registry,如
quay.io
或内部容器 registry。容器 registry 必须可供部署镜像的 OpenShift 实例使用。输入以下命令之一:podman push <myregistry.io>/debezium-container-for-mongodb:latest
podman push <myregistry.io>/debezium-container-for-mongodb:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker push <myregistry.io>/debezium-container-for-mongodb:latest
docker push <myregistry.io>/debezium-container-for-mongodb:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建新的 Debezium MongoDB
KafkaConnect
自定义资源(CR)。例如,创建一个名为dbz-connect.yaml
的KafkaConnect
CR,用于指定注解和
镜像
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
metadata.annotations
表示KafkaConnector
资源用于配置在这个 Kafka Connect 集群中使用的 Cluster Operator。2
spec.image
指定您为运行 Debezium 连接器而创建的镜像名称。此属性覆盖 Cluster Operator 中的STRIMZI_DEFAULT_KAFKA_CONNECT_IMAGE
变量。输入以下命令将
KafkaConnect
CR 应用到 OpenShift Kafka Connect 环境:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令添加一个 Kafka Connect 实例,用于指定您为运行 Debezium 连接器而创建的镜像名称。
创建一个
KafkaConnector
自定义资源来配置 Debezium MongoDB 连接器实例。您可以在
.yaml
文件中配置 Debezium MongoDB 连接器,该文件指定连接器的配置属性。连接器配置可能会指示 Debezium 为 MongoDB 副本集或分片集群的子集生成更改事件。另外,您可以设置过滤不需要的集合的属性。以下示例配置了 Debezium 连接器,它连接到在
192.168.99.100
上的端口27017
处连接到 MongoDB 副本集rs0
,并捕获清单
集合中发生的更改。inventory-connector-mongodb
是副本集的逻辑名称。MongoDB
inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
- 用于在 Kafka Connect 中注册连接器的名称。
- 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
- MongoDB 连接器类的名称。
- 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
- 用于连接到 MongoDB 副本集的主机地址。
- 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
- MongoDB 副本集的逻辑名称,它组成了生成事件的命名空间,并在使用 Avro converter 时,用来写入的 Kafka 主题、Kafka Connect 模式名称和相应 Avro 模式的命名空间中使用。
- 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
- 与要监控的所有集合的集合命名空间(如 <dbName>.<collectionName>)匹配的正则表达式列表。
使用 Kafka Connect 创建连接器实例。例如,如果您将
KafkaConnector
资源保存到inventory-connector.yaml
文件中,您将运行以下命令:oc apply -f inventory-connector.yaml
oc apply -f inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述命令注册
inventory-connector
,连接器开始针对KafkaConnector
CR 中定义的清单
集合运行。
有关您可以为 Debezium MongoDB 连接器设置的配置属性的完整列表,请参阅 MongoDB 连接器配置属性。
结果
连接器启动后,它会完成以下操作:
- 在 MongoDB 副本集中对集合执行一致的快照。
- 读取副本集的更改流。
- 为每个插入、更新和删除文档生成更改事件。
- 将事件记录更改为 Kafka 主题。
4.5.4. 验证 Debezium MongoDB 连接器是否正在运行 复制链接链接已复制到粘贴板!
如果连接器正确启动且没有错误,它会为每个连接器配置为捕获的表创建一个主题。下游应用程序可以订阅这些主题以检索源数据库中发生的信息事件。
要验证连接器是否正在运行,您可以从 OpenShift Container Platform Web 控制台或 OpenShift CLI 工具(oc)执行以下操作:
- 验证连接器状态。
- 验证连接器是否生成主题。
- 验证主题是否填充了每个表初始快照过程中生成的读操作("op":"r")的事件。
先决条件
- Debezium 连接器部署到 OpenShift 上的 AMQ Streams。
-
已安装 OpenShift
oc
CLI 客户端。 - 访问 OpenShift Container Platform web 控制台。
流程
使用以下方法之一检查
KafkaConnector
资源的状态:在 OpenShift Container Platform Web 控制台中:
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 以打开 Select Resource 复选框,然后键入
KafkaConnector
。 - 在 KafkaConnectors 列表中,点您要检查的连接器的名称,如 inventory-connector-mongodb。
- 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc describe KafkaConnector <connector-name> -n <project>
oc describe KafkaConnector <connector-name> -n <project>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc describe KafkaConnector inventory-connector-mongodb -n debezium
oc describe KafkaConnector inventory-connector-mongodb -n debezium
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 4.3.
KafkaConnector
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证连接器是否已创建 Kafka 主题:
通过 OpenShift Container Platform Web 控制台。
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 打开 Select Resource 复选框,然后键入
KafkaTopic
。 -
在 KafkaTopics 列表中,点您要检查的主题的名称,例如
inventory-connector-mongodb.inventory.orders--ac5e98ac6a5d91e04d8ec0dc9078a1ece439081d
。 - 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc get kafkatopics
oc get kafkatopics
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 4.4.
KafkaTopic
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
检查主题内容。
- 在终端窗口中输入以下命令:
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-mongodb.inventory.products_on_hand
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-mongodb.inventory.products_on_hand
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定主题名称的格式与
oc describe
命令的格式在第 1 步中返回,例如inventory-connector-mongodb.inventory.addresses
。对于主题中的每个事件,命令会返回类似以下输出的信息:
例 4.5. Debezium 更改事件的内容
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-mongodb.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-mongodb.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-mongodb.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.mongodb.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-mongodb.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"mongodb","name":"inventory-connector-mongodb","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"mongodb-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-mongodb.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-mongodb.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-mongodb.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.mongodb.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-mongodb.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"mongodb","name":"inventory-connector-mongodb","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"mongodb-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,
有效负载
值显示连接器快照从表inventory.products_on_hand
中生成一个读取("op" ="r"
)事件。product_id
记录的"before"
状态为null
,这表示记录没有之前的值。"after"
状态对于product_id
为101
的项目的quantity
显示为3
。
4.5.5. Debezium MongoDB 连接器配置属性的描述 复制链接链接已复制到粘贴板!
Debezium MongoDB 连接器有很多配置属性,您可以使用它们来实现应用程序的正确连接器行为。许多属性具有默认值。有关属性的信息按如下方式进行组织:
除非默认值可用 , 否则需要以下配置属性。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 | 连接器的唯一名称。尝试再次使用相同的名称注册将失败。(所有 Kafka Connect 连接器都需要此属性。) | |
没有默认值 |
连接器的 Java 类的名称。对于 MongoDB 连接器,始终使用 | |
没有默认值 |
副本集中 MongoDB 服务器的主机名和端口对列表(格式为 'host' 或 'host:port')。列表可以包含单个主机名和端口对。如果 注意 必须提供当前的主地址是必需的。在下一个 Debezium 发行版本中会删除这个限制。 | |
没有默认值 |
指定连接器在 MongoDB 副本集的初始发现过程中使用的连接字符串。要使用这个选项,您必须将 注意
连接器只在初始副本集发现过程中使用此连接字符串。在此发现过程中,连接器会忽略在其他属性中指定的连接值( | |
没有默认值 |
标识此连接器和/或 MongoDB 副本集或分片集群的唯一名称。每个服务器都应该被最多一个 Debezium 连接器监控,因为这个服务器名称前缀的所有持久性 Kafka 主题都来自 MongoDB 副本集或集群。仅使用字母数字字符、连字符、句点和下划线组成名称。逻辑名称在所有其他连接器中应该是唯一的,因为名称用作命名从这个连接器接收记录的 Kafka 主题的前缀。 警告 不要更改此属性的值。如果您更改了 name 值,重启后,而不是继续向原始主题发出事件,连接器会将后续事件发送到名称基于新值的主题。 | |
没有默认值 | 连接到 MongoDB 时使用的数据库用户的名称。这只在将 MongoDB 配置为使用身份验证时才需要。 | |
没有默认值 | 连接到 MongoDB 时使用的密码。这只在将 MongoDB 配置为使用身份验证时才需要。 | |
|
包含 MongoDB 凭证的数据库(身份验证源)。这只有在 MongoDB 被配置为使用与 | |
| 连接器将使用 SSL 连接到 MongoDB 实例。 | |
|
启用 SSL 时,控制在连接阶段是否禁用严格的主机名检查。如果为 | |
空字符串 |
一个可选的正则表达式列表,与要监控的数据库名称匹配。默认情况下,所有数据库都会被监控。
要匹配数据库的名称,Debebe 应用 您指定的正则表达式。也就是说,指定的表达式与数据库的整个名称字符串匹配,它与数据库名称中可能存在的子字符串不匹配。 | |
空字符串 |
可选的正则表达式列表,与要在监控中排除的数据库名称匹配。当设置了
要匹配数据库的名称,Debebe 应用 您指定的正则表达式。也就是说,指定的表达式与数据库的整个名称字符串匹配,它与数据库名称中可能存在的子字符串不匹配。 | |
空字符串 |
可选的、以逗号分隔的正则表达式列表,与要监控的 MongoDB 集合的完全限定命名空间匹配。默认情况下,连接器会监控除
要匹配命名空间的名称,Debebe 应用 您指定的正则表达式。也就是说,指定的表达式与命名空间的整个名称字符串匹配,它与名称中的子字符串不匹配。 | |
空字符串 |
可选的正则表达式列表,与 MongoDB 集合的完全限定命名空间匹配,以便从监控中排除。当设置了
要匹配命名空间的名称,Debebe 应用 您指定的正则表达式。也就是说,指定的表达式与命名空间的整个名称字符串匹配,它与数据库名称中可能存在的子字符串不匹配。 | |
| 指定在连接器启动时执行快照的条件。将属性设置为以下值之一:
| |
|
指定连接器用于从 MongoDB 服务器捕获
| |
|
可选的、以逗号分隔的正则表达式列表,与您要包含在快照中的 schema 的完全限定名称(< 要匹配架构的名称,Debezium 应用您指定的正则表达式,以 替代 的正则表达式。也就是说,指定的表达式与模式的整个名称字符串匹配,它与 schema 名称中可能存在的子字符串不匹配。 | |
空字符串 | 可选的逗号分隔列表,字段的完全限定名称应不包括在更改事件消息值中。字段的完全限定域名格式为 databaseName.collectionName.fieldName.nestedFieldName,其中 databaseName 和 collectionName 可能包含与任何字符匹配的通配符。 | |
空字符串 | 可选的、以逗号分隔的字段列表,字段应用于重命名更改事件消息值中的字段。字段的完全限定替换格式为 databaseName.collectionName.fieldName.nestedFieldName:newNestedFieldName,其中 databaseName 和 collectionName 可能包含与任何字符匹配的通配符,冒号字符(:)用于决定重命名字段映射。下一字段替换将应用于列表中之前字段替换的结果,因此在重命名同一路径中的多个字段时请注意这一点。 | |
| 应该为此连接器创建的最大任务数量。MongoDB 连接器会尝试为每个副本集使用单独的任务,因此在将连接器与单个 MongoDB 副本集搭配使用时可以接受。当将连接器与 MongoDB 分片集群搭配使用时,我们建议指定一个等于集群中的分片数量的值,以便 Kafka Connect 可以分发每个副本集的工作。 | |
| 正整数值,用于指定用于在副本集中执行集合同步的最大线程数量。默认值为 1。 | |
|
控制 删除 事件是否随后是 tombstone 事件。 | |
没有默认值 |
连接器在启动后进行快照的间隔(毫秒)。 | |
|
指定在进行快照时应从一个集合中读取的最大文档数。连接器将以这个大小的多个批处理读取集合内容。 | |
none |
指定如何调整架构名称,以便与连接器使用的消息转换器兼容。可能的设置:
|
以下 高级配置 属性有很好的默认值,其在大多数情况下可以正常工作,因此很少需要在连接器配置中指定。
属性 | 默认 | 描述 |
---|---|---|
| 正整数值,用于指定在每个连接器迭代过程中应处理的每个批处理事件的最大大小。默认值为 2048。 | |
|
正整数值,用于指定阻塞队列可以保存的最大记录数。当 Debezium 从数据库读取事件时,它会将事件放置在阻塞队列中,然后再将它们写入 Kafka。当连接器将消息写入 Kafka 或 Kafka 不可用时,阻塞队列可以提供从数据库读取更改事件的后端。当连接器定期记录偏移时,队列中保存的事件会被忽略。始终将 | |
|
较长的整数值,指定块队列的最大卷(以字节为单位)。默认情况下,不会为阻塞队列指定卷限制。要指定队列可以使用的字节数,请将此属性设置为正长值。 | |
| 正整数值,用于指定连接器在每次迭代期间应该等待的毫秒数,以便显示新的更改事件。默认值为 500 毫秒,或 0.5 秒。 | |
| 正整数值,用于指定在第一次连接尝试或没有主连接可用后尝试重新连接到主时的初始延迟。默认值为 1 秒(1000 ms)。 | |
| 正整数值,用于指定在重复失败连接尝试或没有主连接可用后尝试重新连接到主数时的最大延迟。默认为 120 秒(120,000 ms)。 | |
|
正整数值,用于指定在发生异常和任务中止前尝试到副本集主的最大失败连接数。默认为 16,对于 | |
|
布尔值,指定 'mongodb.hosts' 中的地址是 seeds,它用于发现集群或副本集的所有成员( | |
|
控制发送心跳消息的频率。
将此参数设置为 | |
当连接器配置明确指定使用 Avro 的 | 字段名称是否被清理以遵守 Avro 命名要求。 | |
|
以逗号分隔的操作类型列表,这些类型将在流期间跳过。操作包括: | |
没有默认值 | 控制快照中包含的集合项目。此属性仅影响快照。以 databaseName.collectionName 格式指定以逗号分隔的集合名称列表。
对于您指定的每个集合,还要指定另一个配置属性: | |
|
当设置为 如需了解更多详细信息,请参阅事务元数据。 | |
10000 (10 秒) | 在发生可分配错误后重启连接器前要等待的毫秒数量。 | |
| 连接器轮询新的、删除或更改的副本集的时间间隔。 | |
10000 (10 秒) | 驱动程序在中止新连接尝试前等待的时间。 | |
10000 (10 秒) | 集群监控器试图访问每台服务器的频率。 | |
0 |
在超时发生前,套接字上的发送/接收前的毫秒数。 | |
30000 (30 秒) | 驱动程序在超时前等待选择服务器的毫秒数,并抛出错误。 | |
|
指定 oplog/change 流光标将等待服务器生成结果的最大毫秒数,然后再导致执行超时异常。值 | |
没有默认值 |
用于向连接器发送信号的数据收集的完全限定名称。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#debezium-signaling-enabling-signaling使用以下格式指定集合名称: | |
|
连接器在增量快照块期间获取和读取内存的最大文档数。增加块大小可提高效率,因为快照会运行更大的快照查询。但是,较大的块大小还需要更多内存来缓冲快照数据。将块大小调整为在您的环境中提供最佳性能的值。 | |
|
应该用来确定数据更改的主题名称、模式更改、事务、心跳事件等的 TopicNamingStrategy 类的名称,默认为 | |
|
指定主题名称的分隔符,默认为 | |
| 用于在绑定并发哈希映射中保存主题名称的大小。此缓存有助于确定与给定数据收集对应的主题名称。 | |
|
控制连接器向发送心跳消息的主题名称。主题名称具有此模式: | |
|
控制连接器向发送事务元数据消息的主题名称。主题名称具有此模式: |
4.6. 监控 Debezium MongoDB 连接器性能 复制链接链接已复制到粘贴板!
除了支持 Zookeeper、Kafka 和 Kafka Connect 的 JMX 指标外,Debebe MongoDB 连接器还有两个指标类型。
Debezium 监控文档 提供了有关如何使用 JMX 公开这些指标的详细信息。
4.6.1. 在 MongoDB 快照过程中监控 Debezium 复制链接链接已复制到粘贴板!
MBean 是 debezium.mongodb:type=connector-metrics,context=snapshot,server= <mongodb.server.name > ,task= <task.id>
。
除非快照操作处于活跃状态,否则快照指标不会被公开,或者快照自上次连接器启动后发生。
下表列出了可用的 shapshot 指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个快照事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器从上次启动或重置后看到的事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 包括在快照中的表的总数。 | |
| 快照要复制的表数。 | |
| 快照是否启动。 | |
| 快照是否暂停。 | |
| 快照是否中止。 | |
| 快照是否完成。 | |
| 快照目前花费的秒数,即使未完成也是如此。还包括快照暂停时的时间。 | |
| 快照暂停的秒数。如果快照暂停多次,则暂停的时间会增加。 | |
| 包含快照中每个表扫描的行数的映射。表在处理期间逐步添加到映射中。更新每个 10,000 行扫描,并在完成表后更新。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
Debezium MongoDB 连接器还提供以下自定义快照指标:
属性 | 类型 | 描述 |
---|---|---|
|
| 数据库断开连接的数量。 |
4.6.2. 监控 Debezium MongoDB 连接器记录流 复制链接链接已复制到粘贴板!
MBean 是 debezium.mongodb:type=connector-metrics,context=streaming,server= <mongodb.server.name > ,task= <task.id>
。
下表列出了可用的流指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个流事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器自上次开始或指标重置以来看到的事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的创建事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的更新事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的删除事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 表示连接器当前是否连接到数据库服务器的标记。 | |
| 最后一次更改事件时间戳和连接器处理之间毫秒的数量。该值将限制运行数据库服务器和连接器的机器上时钟之间的差别。 | |
| 已提交的已处理的事务数量。 | |
| 最后一次接收的事件的协调。 | |
| 最后一次处理的事务的事务标识符。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
Debezium MongoDB 连接器还提供以下自定义流指标:
属性 | 类型 | 描述 |
---|---|---|
|
| 数据库断开连接的数量。 |
|
| 主节点选举数量。 |
4.7. Debezium MongoDB 连接器如何处理错误和问题 复制链接链接已复制到粘贴板!
Debezium 是一个分布式系统,它捕获多个上游数据库中的所有更改,永远不会丢失或丢失事件。当系统正常运行并谨慎管理时,Debezium 会在每次更改事件时发送一次。
如果发生错误,系统将不会丢失任何事件。但是,当它从故障中恢复时,可能会重复一些更改事件。在这种情况下,Debebe (如 Kafka)提供 至少一次 更改事件。
以下主题详细介绍了 Debezium MongoDB 连接器如何处理各种错误和问题。
配置和启动错误
在以下情况下,当尝试启动时连接器会失败,在日志中报告错误或异常,并停止运行:
- 连接器的配置无效。
- 连接器无法使用指定的连接参数成功连接到 MongoDB。
失败后,连接器会尝试使用 exponential backoff 重新重新连接。您可以配置最大重新连接尝试数。
在这些情况下,这个错误将了解更多有关此问题的详细信息,并可能会有推荐的临时解决方案。当配置已被修正或已解决 MongoDB 问题时,可以重启连接器。
尝试重新连接由三个属性控制:
-
connect.backoff.initial.delay.ms
- 第一次尝试重新连接前的延迟,默认值为 1 秒(1000 毫秒)。 -
connect.backoff.max.delay.ms
- 尝试重新连接前的最大延迟,默认为 120 秒(120,000 毫秒)。 -
connect.max.attempts
- 生成错误前的最大尝试次数,默认值为 16。
每个延迟都是之前延迟的两倍,最多延迟上限。根据默认值,下表显示每个失败的连接尝试的延迟,以及失败前的总累积时间。
重新连接尝试号 | 尝试前的延迟,以秒为单位 | 尝试前的总延迟,以分钟和秒为单位 |
---|---|---|
1 | 1 | 00:01 |
2 | 2 | 00:03 |
3 | 4 | 00:07 |
4 | 8 | 00:15 |
5 | 16 | 00:31 |
6 | 32 | 01:03 |
7 | 64 | 02:07 |
8 | 120 | 04:07 |
9 | 120 | 06:07 |
10 | 120 | 08:07 |
11 | 120 | 10:07 |
12 | 120 | 12:07 |
13 | 120 | 14:07 |
14 | 120 | 16:07 |
15 | 120 | 18:07 |
16 | 120 | 20:07 |
Kafka Connect 进程安全停止
如果 Kafka Connect 以分布式模式运行,并且 Kafka Connect 进程安全停止,则在关闭 Kafka Connect 之前,会将所有进程的连接器任务迁移到那个组中的另一个 Kafka Connect 进程,新的连接器任务会完全从之前的任务停止。处理会有一个短暂的延迟,同时连接器任务安全停止并在新进程中重启。
如果组只包含一个进程,且该进程安全停止,则 Kafka Connect 将停止连接器并记录每个副本集的最后偏移量。重启后,副本集的任务将在其停止的地方继续。
Kafka Connect 进程崩溃
如果 Kafka Connector 进程意外停止,则运行的任何连接器任务都会终止,而不记录其最近处理的偏移量。当 Kafka Connect 以分布式模式运行时,它将在其他进程上重启这些连接器任务。但是,MongoDB 连接器将从之前进程 记录 的最后偏移中恢复,这意味着新的替换任务可能会生成一些在崩溃前处理的一些更改事件。重复事件的数量取决于偏移清除周期,以及数据在崩溃前更改的卷。
由于某些事件在从故障中恢复期间可能会重复,因此用户应始终预计某些事件可能会被重复。Debezium 更改是幂等的,因此一系列事件总会产生相同的状态。
Debezium 还包含在每个更改事件消息中有关事件来源的特定信息,包括 MongoDB 事件的唯一标识符(h
)和时间戳(sec
和 ord
)。用户可以跟踪其他这些值,以了解它是否已看到特定的事件。
如果将 snapshot.mode
设置为 initial
,则连接器会在长时间停止的间隔后失败
如果连接器安全停止,用户可能会继续对副本集成员执行操作。连接器离线时发生的更改仍然记录在 MongoDB 的 oplog 中。在大多数情况下,在连接器重启后,它会读取 oplog 中的偏移值,以确定为每个副本集流传输的最后一个操作,然后恢复该点的流传输更改。重启后,连接器停止时发生的数据库操作会照常发送到 Kafka,并在一段时间后,连接器会随数据库捕获。连接器捕获所需的时间取决于 Kafka 的功能和性能以及数据库中发生的更改卷。
但是,如果连接器会长时间停止,则 MongoDB 会在连接器不活跃期间清除 oplog,从而导致连接器的最后位置丢失信息。连接器重启后,它无法恢复流,因为 oplog 不再包含以前的偏移值,用于标记连接器处理的最后一个操作。连接器也无法执行快照,因为它通常是当 snapshot.mode
属性设置为 initial
时,且没有偏移值。在这种情况下,存在不匹配,因为 oplog 不包含之前偏移的值,但连接器的内部 Kafka 偏移主题中存在偏移值。错误结果和连接器失败。
要从失败中恢复,请删除失败的连接器,并使用相同的配置创建新连接器,但使用不同的连接器名称。当您启动新的连接器时,它会执行快照以最多数据库状态,然后恢复流。
MongoDB 丢失写入
在某些情况下,MongoDB 可能会丢失提交,这会导致 MongoDB 连接器无法捕获丢失的更改。例如,如果在应用更改后的主要崩溃,并记录对 oplog 的更改,则 oplog 可能会在次要节点读取其内容前不可用。因此,选择为新主节点的二级节点可能会缺少最新的 oplog 更改。
目前,无法防止在 MongoDB 中造成这种副作用。
第 5 章 MySQL 的 Debezium 连接器 复制链接链接已复制到粘贴板!
MySQL 有一个二进制日志(binlog),它会按照它们提交到数据库的顺序记录所有操作。这包括对表模式的更改以及表中的数据更改。MySQL 使用 binlog 进行复制和恢复。
Debezium MySQL 连接器读取 binlog,为行级 INSERT
、UPDATE
和 DELETE
操作生成更改事件,并将更改事件发送到 Kafka 主题。客户端应用程序读取这些 Kafka 主题。
由于 MySQL 通常在指定时间段内清除 binlogs,因此 MySQL 连接器会为每个数据库执行初始 一致的快照。MySQL 连接器从创建快照的点读取 binlog。
有关与此连接器兼容的 MySQL 数据库版本的详情,请参考 Debezium 支持的配置页面。
使用 Debezium MySQL 连接器的信息和流程进行组织,如下所示:
5.1. Debezium MySQL 连接器的工作方式 复制链接链接已复制到粘贴板!
连接器支持的 MySQL 拓扑概述可用于规划应用程序。为了最佳配置和运行 Debezium MySQL 连接器,了解连接器如何跟踪表结构、公开架构更改、执行快照并确定 Kafka 主题名称很有帮助。
详情包括在以下主题中:
5.1.1. Debezium 连接器支持的 MySQL 拓扑 复制链接链接已复制到粘贴板!
Debezium MySQL 连接器支持以下 MySQL 拓扑:
- Standalone
- 使用单个 MySQL 服务器时,服务器必须启用 binlog (以及可选启用了 GTID),以便 Debezium MySQL 连接器可以监控服务器。这通常可以接受,因为二进制日志也可以用作 增量备份。在这种情况下,MySQL 连接器总是连接到并遵循此独立 MySQL 服务器实例。
- 主和副本
Debezium MySQL 连接器可以遵循主服务器之一或其中一个副本(如果该副本启用了 binlog),但连接器只看到对该服务器可见的集群中的更改。通常,这不是除多主拓扑之外的问题。
连接器在服务器的 binlog 中记录其位置,后者在集群中的每个服务器上有所不同。因此,连接器必须只遵循一个 MySQL 服务器实例。如果该服务器失败,则必须在连接器继续前重启或恢复该服务器。
- 高可用性集群
- MySQL 存在各种 高可用性解决方案,它们可以显著地容忍,并且几乎立即从问题和故障中恢复。大多数 HA MySQL 集群都使用 GTID,以便副本能够跟踪任何主服务器上的所有更改。
- 多主
网络数据库(NDB)集群复制 使用一个或多个 MySQL 副本节点,每个节点从多个主服务器复制。这是聚合多个 MySQL 集群的复制方法。这个拓扑需要使用 GTID。
Debezium MySQL 连接器可以使用这些多主 MySQL 副本作为源,只要新副本被耗尽到旧副本,就可以切换到不同的多主 MySQL 副本。也就是说,新副本具有第一个副本上看到的所有事务。即使连接器只使用一个数据库和/或表的子集,因为连接器可以在尝试重新连接到新的多主 MySQL 副本时包含或排除特定的 GTID 源,并在 binlog 中找到正确的位置。
- 托管
支持 Debezium MySQL 连接器,以使用 Amazon RDS 和 Amazon Aurora 等托管选项。
由于这些托管选项不允许全局读锁定,因此表级锁定用于创建 一致的快照。
5.1.2. Debezium MySQL 连接器如何处理数据库架构更改 复制链接链接已复制到粘贴板!
当数据库客户端查询数据库时,客户端将使用数据库的当前模式。但是,数据库架构可以随时更改,这意味着连接器必须能够识别每次插入、更新或删除操作时的模式是什么。另外,连接器无法只使用当前的模式,因为连接器可能是处理在表模式更改前记录的事件相对旧的事件。
为确保正确处理 schema 更改后发生的更改,MySQL 仅包含对数据的行级更改,以及应用到数据库的 DDL 语句。当连接器读取 binlog 并位于这些 DDL 语句中时,它会解析它们并更新每个表架构的内存中表示。连接器使用此架构表示来标识每次插入、更新或删除操作时表的结构,并生成适当的更改事件。在单独的数据库架构历史记录 Kafka 主题中,连接器记录了所有 DDL 语句以及出现每个 DDL 语句的 binlog 中的位置。
当连接器在崩溃或安全停止后重启时,连接器会从特定位置(即从特定时间点)读取 binlog。连接器重新构建此时存在的表结构,方法是读取数据库模式历史记录 Kafka 主题,并将所有 DDL 语句解析为启动连接器的 binlog 中的点。
此数据库架构历史记录主题仅用于连接器。连接器可以选择 发出架构将事件更改为用于消费者应用程序的不同主题。
当 MySQL 连接器捕获表中的更改时,架构更改工具(如 gh-ost
或 pt-online-schema-change
)会应用在迁移过程中创建的帮助程序表。需要配置连接器来捕获对这些帮助程序表的更改。如果消费者不需要为帮助程序表生成的记录,则可以应用单个消息转换来过滤它们。
如需更多信息,请参阅接收 Debezium 事件记录 的主题的默认名称。
5.1.3. Debezium MySQL 连接器如何公开数据库架构更改 复制链接链接已复制到粘贴板!
您可以配置 Debezium MySQL 连接器来生成模式更改事件,这些事件描述了应用于数据库中捕获的表的 schema 更改。连接器将模式更改事件改为名为 < topicPrefix>
的 Kafka 主题,其中 topicPrefix
是 topic.prefix
connector 配置属性中指定的命名空间。连接器发送到 schema 更改主题的消息包含一个有效负载,也可以包含更改事件消息的 schema。
模式更改事件消息的有效负载包括以下元素:
ddl
-
提供导致架构更改的 SQL
CREATE
、ALTER
或DROP
语句。 databaseName
-
将 DDL 语句应用到的数据库名称。
databaseName
的值充当 message 键。 pos
- 出现语句的 binlog 中的位置。
tableChanges
-
模式更改后整个表架构的结构化表示。
tableChanges
字段包含一个数组,其中包含表中的每个列的条目。由于结构化表示以 JSON 或 Avro 格式呈现数据,因此用户可以轻松地读取消息,而无需首先通过 DDL 解析程序处理它们。
对于处于捕获模式的表,连接器不仅将架构更改的历史记录存储在架构更改主题中,也存储在内部数据库架构历史记录主题中。内部数据库架构历史记录主题仅用于连接器,它不用于直接使用应用程序。确保需要有关架构的通知的应用程序只消耗了该模式的更改主题的信息。
永不对数据库架构历史记录进行分区。要使数据库架构历史记录主题正常工作,它必须维护连接器向其发出的事件记录的一致性全局顺序。
要确保主题不在分区中分割,请使用以下方法之一为主题设置分区计数:
-
如果您手动创建数据库模式历史记录主题,请指定分区计数
1
。 -
如果您使用 Apache Kafka 代理自动创建数据库架构历史记录主题,则创建主题,将 Kafka
num.partitions
配置选项 的值设置为1
。
连接器发送到其架构更改主题的消息格式处于 incubating 状态,并可能会在不通知的情况下更改。
示例:发送到 MySQL 连接器模式更改主题的消息
以下示例显示了 JSON 格式的典型架构更改消息。消息包含表模式的逻辑表示。
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
|
2 |
| 显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 在源对象中,ts_ms 表示数据库中更改的时间。通过将 payload.source.ts_ms 的值与 payload.ts_ms 的值进行比较,您可以确定源数据库更新和 Debezium 之间的滞后。 |
3 |
|
标识包含更改的数据库和 schema。 |
4 |
|
此字段包含负责架构更改的 DDL。 |
5 |
| 包含 DDL 命令生成的模式更改的一个或多个项目的数组。 |
6 |
| 描述更改的类型。该值是以下之一:
|
7 |
|
创建、更改或丢弃的表的完整标识符。对于表重命名,这个标识符是 < |
8 |
| 应用更改后代表表元数据。 |
9 |
| 编写表主密钥的列列表。 |
10 |
| 更改表中的每个列的元数据。 |
11 |
| 每个表更改的自定义属性元数据。 |
如需更多信息,请参阅 架构历史记录主题。
5.1.4. Debezium MySQL 连接器如何执行数据库快照 复制链接链接已复制到粘贴板!
当 Debezium MySQL 连接器首次启动时,它会为 您的数据库执行初始一致的快照。以下流描述了连接器如何创建此快照。此流用于默认快照模式,即 。有关其他快照模式的详情,请查看 MySQL 连接器
snapshot.mode
配置属性。
Step | 操作 |
---|---|
1 |
获取全局读锁定,阻止其他数据库客户端 写入。 |
2 | 启动具有 可重复读取语义 的事务,以确保针对 一致的快照 执行事务中的所有后续读取。 |
3 | 读取当前的 binlog 位置。 |
4 | 读取连接器配置为捕获更改的数据库和表的 schema。 |
5 | 释放全局读取锁定。其他数据库客户端现在可以写入数据库。 |
6 |
如果适用,将 DDL 更改写入架构更改主题,包括所有必要的 |
7 |
扫描数据库表。对于每行,连接器会将 |
8 | 提交事务。 |
9 | 在连接器偏移中记录已完成的快照。 |
- 连接器重启
如果连接器在 执行初始快照时 失败、停止或重新平衡,则可以在连接器重启后执行新的快照。完成该 入侵快照后,Debebe MySQL 连接器会从 binlog 中的同一位置重启,使其不会丢失任何更新。
如果连接器停止很长时间,MySQL 可能会清除旧的 binlog 文件,连接器的位置将会丢失。如果位置丢失,连接器会恢复到 初始快照 以进行起始位置。有关 Debezium MySQL 连接器故障排除的更多提示,请参阅 出错时的行为。
- 不允许全局读取锁定
有些环境不允许全局读取锁定。如果 Debezium MySQL 连接器检测到不允许全局读锁定,则连接器将使用表级锁定,并使用此方法执行快照。这要求 Debezium 连接器的数据库用户具有
LOCK TABLES
权限。Expand 表 5.3. 使用表级锁定执行初始快照的工作流 Step 操作 1
获取表级锁定。
2
启动具有 可重复读取语义 的事务,以确保针对 一致的快照 执行事务中的所有后续读取。
3
读取并过滤数据库和表的名称。
4
读取当前的 binlog 位置。
5
读取连接器配置为捕获更改的数据库和表的 schema。
6
如果适用,将 DDL 更改写入架构更改主题,包括所有必要的
DROP…
和CREATE…
DDL 语句。7
扫描数据库表。对于每行,连接器会将
CREATE
事件发送到相关的特定于表的 Kafka 主题。8
提交事务。
9
释放表级锁定。
10
在连接器偏移中记录已完成的快照。
5.1.4.1. 临时快照 复制链接链接已复制到粘贴板!
默认情况下,连接器仅在首次启动后运行初始快照操作。在正常情况下,遵循这个初始快照,连接器不会重复快照过程。连接器捕获的任何将来更改事件数据都仅通过流传输过程。
然而,在某些情况下,连接器在初始快照期间获取的数据可能会变得过时、丢失或不完整。为了提供总结表数据的机制,Debezium 包含一个执行临时快照的选项。数据库中的以下更改可能是执行临时快照:
- 连接器配置会被修改为捕获不同的表集合。
- Kafka 主题已删除,必须重建。
- 由于配置错误或某些其他问题导致数据损坏。
您可以通过启动所谓的 临时命令快照,为之前捕获的快照重新运行快照。临时快照需要使用 信号表。您可以通过向 Debezium 信号表发送信号请求来启动临时快照。
当您启动现有表的临时快照时,连接器会将内容附加到表已存在的主题中。如果删除了之前存在的主题,如果启用自动主题创建,Debezium 可以自动创建主题。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#customization-of-kafka-connect-automatic-topic-creation
临时快照信号指定要包含在快照中的表。快照可以捕获数据库的整个内容,或者只捕获数据库中表的子集。另外,快照也可以捕获数据库中表内容的子集。
您可以通过向信号表发送 execute-snapshot
消息来指定要捕获的表。将 execute-snapshot
信号的类型设置为增量
,并提供快照中包含的表名称,如下表所述:
字段 | 默认 | 值 |
---|---|---|
|
|
指定您要运行的快照类型。 |
| 不适用 |
包含与要快照的表的完全限定域名匹配的正则表达式的数组。 |
| 不适用 | 可选字符串,它根据表的列指定条件,用于捕获表内容的子集。 |
触发临时快照
您可以通过在信号表中添加带有 execute-snapshot
信号类型的条目来启动临时快照。连接器处理消息后,它会开始快照操作。快照过程读取第一个和最后一个主密钥值,并使用这些值作为每个表的开头和端点。根据表中的条目数量以及配置的块大小,Debezium 将表分成块,并一次为每个块进行快照。
5.1.4.2. 增量快照 复制链接链接已复制到粘贴板!
为了提供管理快照的灵活性,Debezium 包括一个补充的快照机制,称为 增量快照。增量快照依赖于 Debezium 机制 向 Debezium 连接器发送信号。
在增量快照中,而不是一次性捕获数据库的完整状态,如初始快照,Debezium 以一系列可配置的块的形式捕获每个表。您可以指定您希望快照捕获的表,以及每个块的大小。块大小决定了快照在数据库的每个获取操作期间收集的行数。增量快照的默认块大小为 1 KB。
当增量快照进行时,Debezium 使用水位线来跟踪其进度,维护它捕获的每一个表行的记录。这个阶段捕获数据的方法比标准初始快照过程提供以下优点:
- 您可以使用流化数据捕获并行运行增量快照,而不是经过发布流,直到快照完成为止。连接器会继续在整个快照过程中从更改日志捕获接近实时事件,且操作都不会阻断其他事件。
- 如果增量快照的进度中断,您可以在不丢失任何数据的情况下恢复它。在进程恢复后,快照从停止的时间开始,而不是从开始重新定义表。
-
您可以随时根据需要运行增量快照,并根据需要重复这个过程以适应数据库更新。例如,您可以在修改连接器配置后重新运行快照,以将表添加到其
table.include.list
属性中。
增量快照过程
当您运行增量快照时,Debezium 按主密钥对表进行排序,然后根据 配置的块大小 将表分成块。然后,按块使用块,然后在块中捕获每个表行。对于它捕获的每行,快照会发出 READ
事件。该事件代表了块开始快照时的行值。
当快照继续进行时,其他进程可能会继续访问数据库,从而可能会修改表记录。要反映此类更改,INSERT
、UPDATE
或 DELETE
操作会照常提交到事务日志中。同样,持续 Debezium 流过程还会继续检测这些更改事件,并将对应的更改事件记录发送到 Kafka。
Debezium 如何使用相同的主密钥解决记录间的冲突
在某些情况下,流传输进程发出的 UPDATE
或 DELETE
事件会耗尽序列。也就是说,流过程可能会发出一个事件,它会在快照捕获包含该行的 READ
事件之前修改表行。当快照最终会为行发出对应的 READ
事件时,其值已经被替换。为确保以正确的逻辑顺序处理到达序列的增量快照事件,Debezium 会使用一种缓冲区方案来解决冲突。只有在快照事件和流事件间冲突时才解决后,Debezium 会向 Kafka 发送事件记录。
快照窗口
为了帮助解决后续 READ
事件和修改同一表行的流事件之间的冲突,Debezium 采用所谓的 快照窗口。快照窗口分离了增量快照捕获指定表块的数据的时间间隔。在打开块的快照窗口前,Debebe 会遵循其常见的行为,并将事件直接从事务日志直接降级到目标 Kafka 主题。但是,从打开特定块的快照时,Debebe 会执行重复数据删除步骤,以解决具有相同主密钥的事件之间冲突。
对于每个数据收集,Debezium 会发出两种类型的事件,并将其记录存储在单个目标 Kafka 主题中。它直接从表中捕获的快照记录作为 READ
操作发出。同时,当用户继续更新数据收集中的记录,并更新事务日志以反映每个提交,Debezium 会为每个更改发出 UPDATE
或 DELETE
操作。
当快照窗口打开时,Debezium 开始处理快照块,它会将快照记录提供给内存缓冲区。在快照窗口中,缓冲区中 READ
事件的主键将与传入流事件的主键进行比较。如果没有找到匹配项,流的事件记录将直接发送到 Kafka。如果 Debezium 检测到匹配项,它会丢弃缓冲的 READ
事件,并将流的记录写入目标主题,因为流的事件逻辑地替换静态快照事件。在块的快照窗口关闭后,缓冲区仅包含没有相关事务日志事件的 READ
事件。Debezium 将这些剩余的 READ
事件发送到表的 Kafka 主题。
连接器重复每个快照块的进程。
5.1.4.3. 触发增量快照 复制链接链接已复制到粘贴板!
目前,启动增量快照的唯一方法是向源数据库上的 信号发送临时快照 信号。
您可以以 SQL INSERT
查询形式向信号表提交信号。
在 Debezium 检测到信号表中的更改后,它会读取信号,并运行请求的快照操作。
您提交的查询指定要包含在快照中的表,以及可选的指定快照操作类型。目前,快照操作的唯一有效选项是默认值 增量
。
要指定快照中包含的表,请提供一个 data-collections
数组,该数组列出了用于匹配表的表或一组正则表达式,例如:
{"data-collections": ["public.MyFirstTable", "public.MySecondTable"]}
增量快照信号的 data-collections
数组没有默认值。如果 data-collections
数组为空,Debezium 会检测到不需要任何操作,且不执行快照。
如果要包含在快照中的表名称包含数据库、模式或表名称的句点(.
),要将表添加到 data-collections
数组中,您必须用双引号转义名称的每个部分。
例如,若要包含 公共
模式中存在的表,并且名为 My.Table
,请使用以下格式:" public"."My.Table
"。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
发送 SQL 查询,将临时增量快照请求添加到信号表中:
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令中的
id
、type
和data
参数的值对应于 信号表的字段。下表描述了示例中的参数:
Expand 表 5.5. 向信号表发送增量快照信号的 SQL 命令中的字段描述 项 值 描述 1
myschema.debezium_signal
指定源数据库上信号表的完全限定名称。
2
ad-hoc-1
id
参数指定分配给信号请求的id
标识符的任意字符串。
使用此字符串来标识到信号表中条目的日志消息。Debezium 不使用此字符串。相反,在快照中,Debebe 会生成自己的id
字符串作为水位信号。3
execute-snapshot
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段所需的组件,用于指定表名称或正则表达式数组,以匹配快照中包含的表名称。
数组列出了根据完全限定名称匹配表的正则表达式,其格式与您用来指定signal.data.collection
配置属性中的连接器信号表的名称相同。5
增量
信号的
data
字段的可选类型
组件,用于指定要运行的快照操作类型。
目前,唯一有效选项是默认值增量
。
如果没有指定值,连接器将运行一个增量快照。6
additional-condition
可选字符串,它根据表的列指定条件,用于捕获表内容的子集。有关
additional-condition
参数的详情请参考带有额外条件
的临时增量快照。
带有额外条件
的临时增量快照
如果您希望快照在表中仅包含内容子集,您可以通过将 additional-condition
参数附加到快照信号来修改信号请求。
典型的快照的 SQL 查询采用以下格式:
SELECT * FROM <tableName> ....
SELECT * FROM <tableName> ....
通过添加 additional-condition
参数,您可以将 WHERE
条件附加到 SQL 查询中,如下例所示:
SELECT * FROM <tableName> WHERE <additional-condition> ....
SELECT * FROM <tableName> WHERE <additional-condition> ....
以下示例显示了向信号表发送带有额外条件的临时增量快照请求的 SQL 查询:
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
例如,假设您有一个包含以下列的产品表:
-
id
(主密钥) -
color
-
quantity
如果您希望 product 表的增量快照只包含 color=blue
的数据项,您可以使用以下 SQL 语句来触发快照:
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue"}');
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue"}');
additional-condition
参数还允许您传递基于多个列的条件。例如,使用上例中的 product 表,您可以提交查询来触发增量快照,该快照仅包含那些项目的 data =blue
和 quantity>10
:
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue AND quantity>10"}');
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue AND quantity>10"}');
以下示例显示了连接器捕获的增量快照事件的 JSON。
示例:增加快照事件信息
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定要运行的快照操作类型。 |
2 |
|
指定事件类型。 |
5.1.4.4. 停止增量快照 复制链接链接已复制到粘贴板!
您还可以通过向源数据库上的表发送信号来停止增量快照。您可以通过发送 SQL INSERT
查询,向表提交停止快照信号。
在 Debezium 检测到信号表中的更改后,它会读取信号,并在进行时停止增量快照操作。
您提交的查询指定了 增量
的快照操作,以及可选的、要删除的当前运行快照的表。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
发送 SQL 查询以停止临时增量快照到信号表:
INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<tableName>","<tableName>"],"type":"incremental"}');
INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<tableName>","<tableName>"],"type":"incremental"}');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
INSERT INTO myschema.debezium_signal (id, type, data) values ('ad-hoc-1', 'stop-snapshot', '{"data-collections": ["schema1.table1", "schema2.table2"], "type":"incremental"}');
INSERT INTO myschema.debezium_signal (id, type, data)
1 values ('ad-hoc-1',
2 'stop-snapshot',
3 '{"data-collections": ["schema1.table1", "schema2.table2"],
4 "type":"incremental"}');
5 Copy to Clipboard Copied! Toggle word wrap Toggle overflow signal 命令中的
id
、type
和data
参数的值对应于 信号表的字段。下表描述了示例中的参数:
Expand 表 5.6. 向信号表发送停止增量快照信号的 SQL 命令中的字段描述 项 值 描述 1
myschema.debezium_signal
指定源数据库上信号表的完全限定名称。
2
ad-hoc-1
id
参数指定分配给信号请求的id
标识符的任意字符串。
使用此字符串来标识到信号表中条目的日志消息。Debezium 不使用此字符串。3
stop-snapshot
指定
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段的可选组件,用于指定表名称或正则表达式数组,以匹配要从快照中删除的表名称。
数组列出了根据完全限定名称匹配表的正则表达式,其格式与您用来指定signal.data.collection
配置属性中的连接器信号表的名称相同。如果省略了data
字段的此组件,则信号将停止正在进行的整个增量快照。5
增量
信号的
data
字段所需的组件,用于指定要停止的快照操作类型。
目前,唯一有效选项是增量的
。
如果没有指定类型
值,则信号无法停止增量快照。
5.1.5. 接收 Debezium MySQL 更改事件记录的 Kafka 主题默认名称 复制链接链接已复制到粘贴板!
默认情况下,MySQL 连接器将表中的所有 INSERT
、UPDATE
和 DELETE
操作的更改事件写入特定于该表的单个 Apache Kafka 主题。
连接器使用以下惯例命名更改事件主题:
topicPrefix.databaseName.tableName
假设 fulfillment
是主题前缀,inventory
是数据库名称,数据库包含名为 orders
、customer 和 products
的表。Debezium MySQL 连接器将事件发送到三个 Kafka 主题,一个用于数据库中的每个表:
fulfillment.inventory.orders fulfillment.inventory.customers fulfillment.inventory.products
fulfillment.inventory.orders
fulfillment.inventory.customers
fulfillment.inventory.products
以下列表提供默认名称组件的定义:
- topicPrefix
-
由
topic.prefix
连接器配置属性指定的主题前缀。 - schemaName
- 在其中操作的 schema 的名称。
- tableName
- 操作发生的表的名称。
连接器应用类似的命名约定来标记其内部数据库架构历史记录主题、架构更改主题 以及 事务元数据主题。
如果默认主题名称不满足您的要求,您可以配置自定义主题名称。要配置自定义主题名称,您可以在逻辑主题路由 SMT 中指定正则表达式。有关使用逻辑主题路由 SMT 自定义主题命名的更多信息,请参阅 主题路由。
事务元数据
Debezium 可以生成代表事务边界的事件,并增强数据更改事件消息。
Debezium 仅在部署连接器后为发生的事务注册并接收元数据。部署连接器前发生的事务元数据。
Debezium 为每个事务生成 BEGIN
和 END
分隔符的事务边界事件。事务边界事件包含以下字段:
status
-
BEGIN
或END
。 id
- 唯一事务标识符的字符串表示。
ts_ms
-
数据源上事务边界事件(
BEGIN
或END
事件)的时间。如果数据源没有向 Debezium 提供事件时间,则该字段代表 Debezium 处理事件的时间。 event_count
(用于END
事件)- 事务发出的事件总数。
data_collections
(用于END
事件)-
data_collection
和event_count
元素的一组对,指示连接器为来自数据收集的更改发出的事件数。
示例
除非通过 topic.transaction
选项覆盖,否则连接器会将事务事件发送到 < topic.prefix>
.transaction
主题。
更改数据事件增强
当启用事务元数据时,可通过新的 事务
字段增强数据消息 Envelope
。此字段以字段复合的形式提供有关每个事件的信息:
id
- 唯一事务标识符的字符串表示。
total_order
- 事件在事务生成的所有事件的绝对路径。
data_collection_order
- 事件在事务发送的所有事件中每个数据收集位置。
以下是消息的示例:
对于没有启用 GTID 的系统,事务标识符会使用 binlog 文件名和 binlog 位置的组合来构建。例如,如果与事务 BEGIN 事件对应的 binlog 文件名和位置分别是 mysql-bin.000002 和 1913,则 Debezium 构建的事务标识符将是 file=mysql-bin.000002,pos=1913
。
5.2. Debezium MySQL 连接器数据更改事件的描述 复制链接链接已复制到粘贴板!
Debezium MySQL 连接器会为每行级别 INSERT
、UPDATE
和 DELETE
操作生成数据更改事件。每个事件都包含一个键和值。键和值的结构取决于更改的表。
Debezium 和 Kafka Connect 围绕 事件消息的持续流 设计。但是,这些事件的结构可能会随时间而变化,而用户很难处理这些事件。要解决这个问题,每个事件都包含其内容的 schema,或者如果您使用 schema registry,则消费者可以从 registry 获取 schema 的模式 ID。这使得每个事件都可以自我包含。
以下框架 JSON 显示更改事件的基本四个部分。但是,如何配置在应用程序中使用的 Kafka Connect converter 决定了更改事件中的这四个部分的表示。只有当您将转换器配置为生成它时,schema
字段才处于更改事件中。同样,只有在将转换器配置为生成它时,才会发生更改事件中的事件密钥和事件有效负载。如果您使用 JSON 转换器,并将其配置为生成所有四个基本更改事件部分,则更改事件具有此结构:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
第一个 |
2 |
|
第一个 |
3 |
|
第二个 |
4 |
|
第二个 |
默认情况下,连接器流将事件记录更改为名称与事件原始表相同的名称的主题。请参阅 主题名称。
MySQL 连接器确保所有 Kafka Connect 模式名称都遵循 Avro 模式名称格式。这意味着,逻辑服务器名称必须以拉丁或下划线开头,即 a-z、A-Z 或 _。逻辑服务器名称中的每个剩余的字符以及数据库和表名称中的每个字符都必须是字母、数字或下划线,即 a-z、A-Z、0-9 或 _。如果存在无效的字符,它将替换为下划线字符。
如果逻辑服务器名称、数据库名称或表名称包含无效字符,且区分另一个名称的唯一字符无效,则可能会导致意外冲突,因此替换为下划线。
更多详情包括在以下主题中:
5.2.1. 关于 Debezium MySQL 中的键更改事件 复制链接链接已复制到粘贴板!
更改事件的密钥包含更改表的密钥的 schema,以及更改的行的实际键。在连接器创建事件时,模式及其对应有效负载都包含更改表的 PRIMARY KEY
(或唯一约束)中的每个列的字段。
请考虑以下 客户
表,然后是此表的更改事件键示例。
捕获对 customers
表的更改的每个更改事件都有相同的事件键模式。只要
表有以前的定义,捕获 customer 表更改的事件都有以下关键结构:在 JSON 中,它类似如下:
customers
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
键的 schema 部分指定一个 Kafka Connect 模式,它描述了密钥 |
2 |
|
定义密钥有效负载结构的 schema 名称。这个模式描述了更改的表的主键的结构。键架构名称的格式为 connector-name.database-name.table-name.
|
3 |
|
指明 event 键必须在其 |
4 |
|
指定 |
5 |
|
包含生成此更改事件的行的键。在本例中,键包含一个 |
5.2.2. 关于 Debezium MySQL 更改事件中的值 复制链接链接已复制到粘贴板!
更改事件中的值比键稍微复杂。与键一样,该值具有 schema
部分和 payload
部分。schema
部分包含描述 payload
部分的 Envelope
结构的 schema,包括其嵌套字段。更改创建、更新或删除数据的事件,并且具有 envelope 结构的值有效负载。
考虑用于显示更改事件键示例的相同示例:
有关此表的更改事件的值部分,如下所述:
创建 事件
以下示例显示了连接器为在 customer 表中创建数据的操作生成的更改事件的值部分:
项 | 字段名称 | 描述 |
---|---|---|
1 |
| 值的 schema,用于描述值有效负载的结构。每次连接器为特定表生成的更改时,更改事件的值模式都是相同的。 |
2 |
|
在 |
3 |
|
|
4 |
|
|
5 |
|
值的实际数据。这是更改事件提供的信息。 |
6 |
|
描述导致连接器生成事件的操作类型的必要字符串。在本例中,
|
7 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
8 |
|
指定事件发生前行状态的可选字段。当 |
9 |
|
指定事件发生后行状态的可选字段。在本例中, |
10 |
| 描述事件源元数据的必需字段。此字段包含可用于将此事件与其他事件进行比较的信息,以及事件的来源、事件发生的顺序,以及事件是否为同一事务的一部分。源元数据包括:
如果启用了 |
更新 事件
示例 customer 表中更新的更改事件值与该表的 create 事件相同。同样,事件的 payload 具有相同的结构。但是,事件值 payload 在更新 事件中包含不同的值。以下是连接器在
customers
表中为更新生成的更改事件值示例:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定事件发生前行状态的可选字段。在 update 事件值中, |
2 |
|
指定事件发生后行状态的可选字段。您可以比较 |
3 |
|
描述事件源元数据的必需字段。
如果启用了 |
4 |
|
描述操作类型的强制字符串。在 update 事件值中, |
5 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
更新行的主/唯一键的列会更改行键的值。当键更改时,Debebe 会输出 三个 事件: DELETE
事件和带有行的旧键的 tombstone 事件,后跟带有行的新键的事件。下一小节中提供了详细信息。
主密钥更新
更改行主密钥字段的 UPDATE
操作被称为主密钥更改。对于主键更改,为了代替 UPDATE
事件记录,连接器会为旧密钥和新(更新)键的 CREATE
事件记录发出 DELETE
事件记录。这些事件具有常见的结构和内容,以及每个事件都有一个与主密钥更改相关的消息标头:
-
DELETE
事件记录具有__debezium.newkey
作为消息标头。此标头的值是更新行的新主密钥。 -
CREATE
事件记录具有__debezium.oldkey
作为消息标头。此标头的值是更新的行具有的先前(旧的)主密钥。
删除 事件
delete 更改事件中的值与为同一表的 create 和 update 事件相同的 schema
部分。示例 customer
表的 delete 事件中 payload
部分类似如下:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定事件发生前行状态的可选字段。在一个 delete 事件值中, |
2 |
|
指定事件发生后行状态的可选字段。在 delete 事件值中, |
3 |
|
描述事件源元数据的必需字段。在一个 delete 事件值中,
如果启用了 |
4 |
|
描述操作类型的强制字符串。 |
5 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
删除 更改事件记录为消费者提供处理此行删除所需的信息。包括了旧值,因为有些使用者可能需要它们才能正确处理删除。
MySQL 连接器事件旨在用于 Kafka 日志压缩。只要每个密钥至少保留最新的消息,日志压缩就可以删除一些旧的消息。这可让 Kafka 回收存储空间,同时确保主题包含完整的数据集,并可用于重新载入基于密钥的状态。
tombstone 事件
删除行时,delete 事件值仍可用于日志压缩,因为 Kafka 您可以删除具有相同键的所有之前信息。但是,如果 Kafka 删除具有相同键的所有消息,消息值必须是 null
。为了实现此目的,在 Debezium 的 MySQL 连接器发出 一个 delete 事件后,连接器会发出一个特殊的 tombstone 事件,它具有相同的键但有一个 null
值。
截断 事件
一个 截断 的更改事件信号,表示表已被截断。本例中 message 键为 null
,消息值类似如下:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
描述事件源元数据的必需字段。在 truncate 事件值中,
|
2 |
|
描述操作类型的强制字符串。 |
3 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。
+ |
如果单个 TRUNCATE
语句应用到多个表,则会发出每个截断表的截断更改事件记录。
请注意,由于 truncate 事件代表对整个表所做的更改,且没有消息键,除非您正在使用单个分区的主题,否则不会排序与表相关的更改事件(创建、更新 等)和 截断 事件。例如,当这些事件从不同的分区读取时,消费者只能在该表的 truncate 事件后收到 update 事件。
5.3. Debezium MySQL 连接器如何映射数据类型 复制链接链接已复制到粘贴板!
Debezium MySQL 连接器代表对行的更改,其中包含与行存在的表类似的事件。event 包含每个列值的字段。该列的 MySQL 数据类型指定 Debezium 如何代表事件中的值。
存储字符串的列在 MySQL 中定义,并带有字符集和协调。MySQL 连接器在读取 binlog 事件中的列值的二进制表示时使用列的字符集。
连接器可将 MySQL 数据类型映射到 字面 和 语义 类型。
- 字面类型 :值如何使用 Kafka Connect 模式类型来表示。
- 语义类型 : Kafka Connect 模式如何捕获字段(架构名称)的含义。
如果默认数据类型转换无法满足您的需要,您可以为连接器 创建自定义转换器。
详情包括在以下部分:
基本类型
下表显示了连接器如何映射基本 MySQL 数据类型。
MySQL 类型 | 字面类型 | 语义类型 |
---|---|---|
|
| 不适用 |
|
| 不适用 |
|
|
|
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
|
精度仅用于确定存储大小。精度 |
|
|
从 MySQL 8.0.17 开始,非标准 FLOAT (M,D)和 DOUBLE (M,D)语法已弃用,并预期在以后的 MySQL 版本中删除对它的支持,将 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
|
N/A |
|
|
N/A |
|
|
N/A |
|
| 不适用 |
|
|
N/A |
|
|
N/A |
|
|
N/A |
|
| 不适用 |
|
|
N/A |
|
|
N/A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
临时类型
排除 TIMESTAMP
数据类型,MySQL temporal 类型取决于 time.precision.mode
连接器配置属性的值。对于默认值指定为 CURRENT_
列,值 TIMESTAMP
或 NOW
的 TIMESTAMP1970-01-01 00:00:00
用作 Kafka Connect 模式中的默认值。
MySQL 允许 DATE、
和 DATE
TIMETIMESTAMP
列的零值,因为有时使用零值而不是 null 值。当列定义允许 null 值时,MySQL 连接器将零值表示为 null 值,或者在列不允许 null 值时作为 epoch 天。
没有时区的临时值
DATETIME
类型代表本地日期和时间,如 "2018-01-13 09:48:27"。您可以看到,没有时区信息。这些列使用 UTC 根据列的精度转换为 epoch 毫秒或微秒。TIMESTAMP
类型代表没有时区信息的时间戳。在读取值时,MySQL 将从服务器(或会话)当前时区转换为 UTC,并从 UTC 转换为服务器(或会话)当前时区。例如:
-
DATETIME
的值为2018-06-20 06:37:03
变为1529476623000
。 -
TIMESTAMP
的值2018-06-20 06:37:03
变为2018-06-20T13:37:03Z
。
这些列根据服务器(或会话)当前的时区转换为 UTC 中的等同的 io.debezium.time.ZonedTimestamp
。默认将从服务器查询时区。如果此操作失败,则必须由数据库 connectionTimeZone
MySQL 配置选项明确指定。例如,如果数据库的时区(通过 connectionTimeZone
选项为连接器全局或配置了)是 "America/Los_Angeles",TIMESTAMP 值 "2018-06-20 06:37:03" 由带有值为 "2018-06-20T13:37:03" 的 ZonedTimestamp
表示。
运行 Kafka Connect 和 Debezium 的 JVM 的时区不会影响这些转换。
有关与临时值相关的属性的更多详细信息,请参见 MySQL 连接器配置属性 的文档。
- time.precision.mode=adaptive_time_microseconds(default)
MySQL 连接器根据列的数据类型定义决定字面类型和语义类型,以便事件准确代表数据库中的值。所有时间字段都以微秒为单位。只有
00:00:00.000000
到23:59:59.999999
范围内的正TIME
字段值才能被正确捕获。Expand 表 5.14. time.precision.mode=adaptive_time_microseconds时的映射 MySQL 类型 字面类型 语义类型 DATE
INT32
io.debezium.time.Date
代表自 epoch 以来的天数。TIME[(M)]
INT64
io.debezium.time.MicroTime
以微秒表示时间值,不包括时区信息。MySQL 允许M
位于0-6
范围内。DATETIME, DATETIME (0), DATETIME (1), DATETIME (2), DATETIME (3)
INT64
io.debezium.time.Timestamp
代表超过 epoch 的毫秒数,不包括时区信息。DATETIME (4), DATETIME (5), DATETIME (6)
INT64
io.debezium.time.MicroTimestamp
代表 epoch 过去的微秒数,不包括时区信息。- time.precision.mode=connect
MySQL 连接器使用定义的 Kafka Connect 逻辑类型。这种方法比默认方法更精确,如果数据库列具有大于
3
的部分 精度 值,则事件可能不太精确。只能处理00:00:00.000
到23:59:59.999
的值。只有在您可以确保表中的TIME
值不能超过支持的范围时,才设置time.precision.mode=connect
。在以后的 Debezium 版本中会删除connect
设置。Expand 表 5.15. time.precision.mode=connect时的映射 MySQL 类型 字面类型 语义类型 DATE
INT32
org.apache.kafka.connect.data.Date
代表自 epoch 后的天数。TIME[(M)]
INT64
org.apache.kafka.connect.data.Time
从中等以来以微秒为单位代表时间值,不包括时区信息。DATETIME[(M)]
INT64
org.apache.kafka.connect.data.Timestamp
从 epoch 开始代表毫秒的数量,不包括时区信息。
十进制类型
Debezium 连接器根据 decimal.handling.mode
连接器配置属性 的设置处理十进制。
- decimal.handling.mode=precise
Expand 表 5.16. 当 decimal.handling.mode=precise时进行映射 MySQL 类型 字面类型 语义类型 NUMERIC[(M[,D])]
BYTES
org.apache.kafka.connect.data.Decimal
scale
模式参数包括一个整数,它代表了十进制小数点移动了多少位。DECIMAL[(M[,D])]
BYTES
org.apache.kafka.connect.data.Decimal
scale
模式参数包括一个整数,它代表了十进制小数点移动了多少位。- decimal.handling.mode=double
Expand 表 5.17. Mappings when decimal.handling.mode=double MySQL 类型 字面类型 语义类型 NUMERIC[(M[,D])]
FLOAT64
不适用
DECIMAL[(M[,D])]
FLOAT64
不适用
- decimal.handling.mode=string
Expand 表 5.18. Mappings when decimal.handling.mode=string MySQL 类型 字面类型 语义类型 NUMERIC[(M[,D])]
字符串
不适用
DECIMAL[(M[,D])]
字符串
不适用
布尔值
MySQL 以特定方式在内部处理 BOOLEAN
值。BOOLEAN
列内部映射到 TINYINT (1)
数据类型。在流期间创建表时,它会使用正确的 BOOLEAN
映射,因为 Debezium 接收原始 DDL。在快照期间,Debebe 执行 SHOW CREATE TABLE
,以获取为 BOOLEAN
和 TINYINT (1)
列返回 TINYINT (1)
列的表定义。然后 Debezium 无法获取原始类型映射,因此映射到 TINYINT (1)
。
要允许您将源列转换为布尔值,Debezium 提供了一个 TinyIntOneToBooleanConverter
自定义转换器,您可以使用以下方法之一:
-
将所有
TINYINT (1)
或TINYINT (1) UNSIGNED
列映射到BOOLEAN
类型。 使用以逗号分隔的正则表达式列表枚举列子集。
要使用这种转换,您必须使用selector
参数设置转换器
配置属性,如下例所示:converters=boolean boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter boolean.selector=db1.table1.*, db1.table2.column1
converters=boolean boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter boolean.selector=db1.table1.*, db1.table2.column1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意:当快照执行
SHOW CREATE TABLE
时,MySQL8 不会显示tinyint 未签名的
类型长度,这意味着这个转换器无法正常工作。新选项length.checker
可以解决这个问题,默认值为true
。禁用length.checker
,并指定需要转换为selector
属性的列,而不是根据类型转换所有列,如下例所示:converters=boolean boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter boolean.length.checker=false boolean.selector=db1.table1.*, db1.table2.column1
converters=boolean boolean.type=io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter boolean.length.checker=false boolean.selector=db1.table1.*, db1.table2.column1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
spatial 类型
目前,Debebe MySQL 连接器支持以下 spatial 数据类型。
MySQL 类型 | 字面类型 | 语义类型 |
---|---|---|
|
|
|
5.4. 设置 MySQL 以运行 Debezium 连接器 复制链接链接已复制到粘贴板!
在安装和运行 Debezium 连接器前,需要一些 MySQL 设置任务。
详情包括在以下部分:
5.4.1. 为 Debezium 连接器创建 MySQL 用户 复制链接链接已复制到粘贴板!
Debezium MySQL 连接器需要一个 MySQL 用户帐户。此 MySQL 用户必须在 Debezium MySQL 连接器捕获更改的所有数据库上具有适当的权限。
先决条件
- MySQL 服务器。
- SQL 命令的基础知识。
流程
创建 MySQL 用户:
mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 授予用户所需的权限:
mysql> GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user' IDENTIFIED BY 'password';
mysql> GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user' IDENTIFIED BY 'password';
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 下表描述了权限。
重要如果使用 Amazon RDS 或 Amazon Aurora 等托管选项不允许全局读取锁定,则使用表级锁定来创建 一致的快照。在这种情况下,您还需要为您创建的用户授予
LOCK TABLES
权限。如需了解更多详细信息,请参阅 快照。完成用户的权限:
mysql> FLUSH PRIVILEGES;
mysql> FLUSH PRIVILEGES;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
关键字 | 描述 |
---|---|
| 启用连接器从数据库中的表中选择行。这仅在执行快照时使用。 |
|
启用连接器使用 |
|
通过发出 |
| 启用连接器连接到和读取 MySQL 服务器 binlog。 |
| 启用连接器使用以下语句:
连接器始终需要此功能。 |
| 标识权限应用到的数据库。 |
| 指定要为其授予权限的用户。 |
| 指定用户的 MySQL 密码。 |
5.4.2. 为 Debezium 启用 MySQL binlog 复制链接链接已复制到粘贴板!
您必须为 MySQL 复制启用二进制日志记录。二进制日志记录复制工具的事务更新以传播更改。
先决条件
- MySQL 服务器。
- 适当的 MySQL 用户特权。
流程
检查
log-bin
选项是否已位于:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果它处于
OFF
状态,请使用以下属性配置 MySQL 服务器配置文件,如下表中所述:server-id = 223344 log_bin = mysql-bin binlog_format = ROW binlog_row_image = FULL expire_logs_days = 10
server-id = 223344 log_bin = mysql-bin binlog_format = ROW binlog_row_image = FULL expire_logs_days = 10
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 稍后检查 binlog 状态来确认您的更改:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
属性 | 描述 |
---|---|
|
|
|
|
|
|
|
|
|
这是自动删除 binlog 文件的天数。默认值为 |
5.4.3. 为 Debezium 启用 MySQL 全局事务标识符 复制链接链接已复制到粘贴板!
全局事务标识符(GTID)唯一标识集群中服务器上出现的事务。虽然 Debezium MySQL 连接器不需要,但使用 GTID 简化了复制,并可让您更轻松地确认主和副本服务器是否一致。
在 MySQL 5.6.5 及更高版本中提供 GTID。详情请查看 MySQL 文档。
先决条件
- MySQL 服务器。
- SQL 命令的基础知识。
- 访问 MySQL 配置文件。
流程
启用
gtid_mode
:mysql> gtid_mode=ON
mysql> gtid_mode=ON
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启用
enforce_gtid_consistency
:mysql> enforce_gtid_consistency=ON
mysql> enforce_gtid_consistency=ON
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确认更改:
mysql> show global variables like '%GTID%';
mysql> show global variables like '%GTID%';
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
结果
选项 | 描述 |
---|---|
| 指定是否启用了 MySQL 服务器的 GTID 模式的布尔值。
|
| 布尔值,通过允许以事务的方式记录语句来指定服务器强制实施 GTID 一致性。使用 GTID 时是必需的。
|
5.4.4. 为 Debezium 配置 MySQL 会话超时 复制链接链接已复制到粘贴板!
为大型数据库进行初始一致的快照时,您建立的连接可能会在表读取期间超时。您可以通过在 MySQL 配置文件中配置 interactive_timeout
和 wait_timeout
来防止此行为。
先决条件
- MySQL 服务器。
- SQL 命令的基础知识。
- 访问 MySQL 配置文件。
流程
配置
interactive_timeout
:mysql> interactive_timeout=<duration-in-seconds>
mysql> interactive_timeout=<duration-in-seconds>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置
wait_timeout
:mysql> wait_timeout=<duration-in-seconds>
mysql> wait_timeout=<duration-in-seconds>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
选项 | 描述 |
---|---|
| 服务器在关闭交互式连接前等待活动的秒数。如需了解更多详细信息 ,请参阅 MySQL 文档。 |
| 服务器在关闭前等待非互动连接中的活动的秒数。如需了解更多详细信息 ,请参阅 MySQL 文档。 |
5.4.5. 为 Debezium MySQL 连接器启用查询日志事件 复制链接链接已复制到粘贴板!
您可能希望查看每个 binlog 事件的原始 SQL
语句。在 MySQL 配置文件中启用 binlog_rows_query_log_events
选项允许您执行此操作。
这个选项在 MySQL 5.6 及更高版本中可用。
先决条件
- MySQL 服务器。
- SQL 命令的基础知识。
- 访问 MySQL 配置文件。
流程
启用
binlog_rows_query_log_events
:mysql> binlog_rows_query_log_events=ON
mysql> binlog_rows_query_log_events=ON
Copy to Clipboard Copied! Toggle word wrap Toggle overflow binlog_rows_query_log_events
设置为一个值,它启用了/禁用对在 binlog 条目中包含原始SQL
语句的支持。-
on
= enabled -
OFF
= disabled
-
5.4.6. 为 Debezium MySQL 连接器验证 binlog 行值选项 复制链接链接已复制到粘贴板!
检查 binlog_row_value_options
变量,并确保值 没有设置为 PARTIAL_JSON
,因为在这种情况下连接器可能无法消耗 UPDATE 事件。
先决条件
- MySQL 服务器。
- SQL 命令的基础知识。
- 访问 MySQL 配置文件。
流程
检查当前的变量值
mysql> show global variables where variable_name = 'binlog_row_value_options';
mysql> show global variables where variable_name = 'binlog_row_value_options';
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 结果
+--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | binlog_row_value_options | | +--------------------------+-------+
+--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | binlog_row_value_options | | +--------------------------+-------+
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果值为
PARTIAL_JSON
,请通过以下方法取消设置此变量:mysql> set @@global.binlog_row_value_options="" ;
mysql> set @@global.binlog_row_value_options="" ;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.5. 部署 Debezium MySQL 连接器 复制链接链接已复制到粘贴板!
您可以使用以下任一方法部署 Debezium MySQL 连接器:
5.5.1. 使用 AMQ Streams 部署 MySQL 连接器 复制链接链接已复制到粘贴板!
从 Debezium 1.7 开始,部署 Debezium 连接器的首选方法是使用 AMQ Streams 来构建包含连接器插件的 Kafka Connect 容器镜像。
在部署过程中,您可以创建并使用以下自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR,并包含有关镜像中需要包含连接器工件的信息。 -
提供连接器用来访问源数据库的信息的
KafkaConnector
CR。在 AMQ Streams 启动 Kafka Connect pod 后,您可以通过应用KafkaConnector
CR 来启动连接器。
在 Kafka Connect 镜像的构建规格中,您可以指定可用于部署的连接器。对于每个连接器插件,您还可以指定您的部署可以使用的其他组件。例如,您可以添加 Apicurio Registry 工件或 Debezium 脚本组件。当 AMQ Streams 构建 Kafka Connect 镜像时,它会下载指定的工件,并将其合并到镜像中。
KafkaConnect
CR 中的 spec.build.output
参数指定存储生成的 Kafka Connect 容器镜像的位置。容器镜像可以存储在 Docker registry 中,也可以存储在 OpenShift ImageStream 中。要将镜像存储在 ImageStream 中,您必须先创建 ImageStream,然后才能部署 Kafka Connect。镜像流不会被自动创建。
如果使用 KafkaConnect
资源创建集群,之后您无法使用 Kafka Connect REST API 创建或更新连接器。您仍然可以使用 REST API 来检索信息。
其他资源
- 在 OpenShift 上使用 AMQ Streams 配置 Kafka 连接。
- 在 OpenShift 中部署和升级 AMQ Streams 中的使用 AMQ Streams 自动创建新容器镜像。
5.5.2. 使用 AMQ Streams 部署 Debezium MySQL 连接器 复制链接链接已复制到粘贴板!
使用早期版本的 AMQ Streams 时,要在 OpenShift 上部署 Debezium 连接器,首先需要为连接器构建 Kafka Connect 镜像。在 OpenShift 上部署连接器的当前首选的方法是使用 AMQ Streams 中的构建配置来自动构建 Kafka Connect 容器镜像,其中包含您要使用的 Debezium 连接器插件。
在构建过程中,AMQ Streams Operator 会将 KafkaConnect
自定义资源中的输入参数(包括 Debezium 连接器定义)转换为 Kafka Connect 容器镜像。构建从 Red Hat Maven 存储库或其他配置的 HTTP 服务器下载必要的工件。
新创建的容器被推送到 .spec.build.output
中指定的容器 registry,用于部署 Kafka Connect 集群。AMQ Streams 构建 Kafka Connect 镜像后,您可以创建 KafkaConnector
自定义资源来启动构建中包含的连接器。
先决条件
- 您可以访问安装了集群 Operator 的 OpenShift 集群。
- AMQ Streams Operator 正在运行。
- 部署 Apache Kafka 集群,如在 OpenShift 中部署和升级 AMQ Streams 所述。
- Kafka Connect 部署在 AMQ Streams 上
- 您有红帽构建的 Debezium 许可证。
-
已安装 OpenShift
oc
CLI 客户端,或者您可以访问 OpenShift Container Platform Web 控制台。 根据您要存储 Kafka Connect 构建镜像的方式,您需要 registry 权限或您必须创建 ImageStream 资源:
- 要将构建镜像存储在镜像 registry 中,如 Red Hat Quay.io 或 Docker Hub
- 在 registry 中创建和管理镜像的帐户和权限。
- 将构建镜像存储为原生 OpenShift ImageStream
- ImageStream 资源已部署到集群中,以存储新的容器镜像。您必须为集群明确创建 ImageStream。镜像流默认不可用。如需有关 ImageStreams 的更多信息,请参阅在 OpenShift Container Platform 上管理镜像流。
流程
- 登录 OpenShift 集群。
为连接器创建 Debezium
KafkaConnect
自定义资源(CR),或修改现有的资源。例如,创建一个名为dbz-connect.yaml
的KafkaConnect
CR,用于指定metadata.annotations
和spec.build
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
例 5.1.
dbz-connect.yaml
文件,该文件定义包含 Debezium 连接器的KafkaConnect
自定义资源在以下示例中,自定义资源被配置为下载以下工件:
- Debezium MySQL 连接器存档。
- 红帽构建的 Apicurio Registry 存档。Apicurio Registry 是一个可选组件。只有在打算在连接器中使用 Avro 序列化时,才添加 Apicurio Registry 组件。
- Debezium 脚本 SMT 归档以及您要与 Debezium 连接器一起使用的关联脚本引擎。SMT 归档和脚本语言依赖项是可选组件。只有在打算使用 Debezium 是 基于内容的路由 SMT 或 过滤 SMT 时,才添加这些组件。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 5.24. Kafka Connect 配置设置的描述 项 描述 1
将
strimzi.io/use-connector-resources
注解设置为"true"
,以便 Cluster Operator 使用KafkaConnector
资源在此 Kafka Connect 集群中配置连接器。2
spec.build
配置指定构建镜像的位置,并列出要在镜像中包含的插件,以及插件工件的位置。3
build.output
指定存储新构建镜像的 registry。4
指定镜像输出的名称和镜像名称。
output.type
的有效值是docker
,可推送到容器 registry,如 Docker Hub 或 Quay,或将镜像推送到内部 OpenShift ImageStream的镜像流
。要使用 ImageStream,必须将 ImageStream 资源部署到集群中。有关在 KafkaConnect 配置中指定build.output
的更多信息,请参阅在 OpenShift 中配置 AMQ Streams 中的 AMQ Streams Build schema 参考。5
插件配置
列出了您要包含在 Kafka Connect 镜像中的所有连接器。对于列表中的每个条目,指定一个插件名称
,以及有关构建连接器所需的工件的信息。另外,对于每个连接器插件,您还可以包含您要与连接器一起使用的其他组件。例如,您可以添加 Service Registry 工件或 Debezium 脚本组件。6
artifacts.type
的值指定artifacts.url
中指定的工件的文件类型。有效类型是zip
、tgz
或jar
。Debezium 连接器存档以.zip
文件格式提供。type
值必须与url
字段中引用的文件类型匹配。7
artifacts.url
的值指定 HTTP 服务器的地址,如 Maven 存储库,用于存储连接器工件的文件。Debezium 连接器工件位于 Red Hat Maven 存储库中。OpenShift 集群必须有权访问指定的服务器。8
(可选)指定用于下载 Apicurio Registry 组件的工件
类型和
url
。包括 Apicurio Registry 工件,只有在您希望连接器使用 Apache Avro 与 Red Hat build of Apicurio Registry 序列化事件键和值时,而不是使用默认的 JSON converter。9
(可选)指定 Debezium 脚本 SMT 归档的工件
类型和
url
,以用于 Debezium 连接器。只有在打算使用 Debezium 基于内容的路由 SMT 或 过滤 SMT 时使用脚本 SMT 时,才包含脚本 SMT,您必须部署 JSR 223 兼容脚本实施,如 groovy。10
(可选)为 JSR 223 兼容脚本实现的 JAR 文件指定工件
类型和
url
,这是 Debezium 脚本 SMT 所需的。重要如果您使用 AMQ Streams 将连接器插件合并到 Kafka Connect 镜像中,每个所需脚本语言组件
artifacts.url
必须指定 JAR 文件的位置,而artifacts.type
的值还必须设置为jar
。无效的值会导致连接器在运行时失败。要启用使用带有脚本 SMT 的 Apache Groovy 语言,示例中的自定义资源会检索以下库的 JAR 文件:
-
groovy
-
Groovy-jsr223
(协调代理) -
Groovy-json
(用于解析 JSON 字符串的模块)
作为替代方案,Debebe 脚本 SMT 还支持使用 GraalVM JavaScript 的 JSR 223 实现。
输入以下命令将
KafkaConnect
构建规格应用到 OpenShift 集群:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据自定义资源中指定的配置,Streams Operator 会准备要部署的 Kafka Connect 镜像。
构建完成后,Operator 将镜像推送到指定的 registry 或 ImageStream,并启动 Kafka Connect 集群。您配置中列出的连接器工件在集群中可用。创建一个
KafkaConnector
资源来定义您要部署的每个连接器的实例。
例如,创建以下KafkaConnector
CR,并将它保存为mysql-inventory-connector.yaml
例 5.2. 为 Debezium 连接器定义
KafkaConnector
自定义资源的mysql-inventory-connector.yaml
文件Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 5.25. 连接器配置设置的描述 项 描述 1
使用 Kafka Connect 集群注册的连接器名称。
2
连接器类的名称。
3
可同时运行的任务数量。
4
连接器的配置。
5
主机数据库实例的地址。
6
数据库实例的端口号。
7
Debezium 用于连接到数据库的帐户名称。
8
Debezium 用于连接到数据库用户帐户的密码。
9
连接器的唯一数字 ID。
10
数据库实例或集群的主题前缀。
指定的名称只能从字母数字字符或下划线括起。
由于主题前缀用作从这个连接器接收更改事件的任何 Kafka 主题的前缀,所以名称必须在集群中的连接器之间唯一。
此命名空间也用于相关的 Kafka Connect 模式的名称,如果您将连接器与 Avro 连接器集成,则对应的 Avro 模式的命名空间也用于。11
连接器从中捕获更改事件的表列表。
运行以下命令来创建连接器资源:
oc create -n <namespace> -f <kafkaConnector>.yaml
oc create -n <namespace> -f <kafkaConnector>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc create -n debezium -f mysql-inventory-connector.yaml
oc create -n debezium -f mysql-inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 连接器注册到 Kafka Connect 集群,并开始针对
KafkaConnector
CR 中的spec.config.database.dbname
指定的数据库运行。连接器 pod 就绪后,Debezium 正在运行。
您现在已准备好 验证 Debezium MySQL 部署。
要部署 Debezium MySQL 连接器,您必须构建包含 Debezium 连接器存档的自定义 Kafka Connect 容器镜像,然后将此容器镜像推送到容器 registry。然后,您需要创建以下自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR。CR 中的image
属性指定您创建用来运行 Debezium 连接器的容器镜像的名称。您可以将此 CR 应用到部署了 Red Hat AMQ Streams 的 OpenShift 实例。AMQ Streams 提供将 Apache Kafka 引入到 OpenShift 的 operator 和镜像。 -
定义 Debezium MySQL 连接器的
KafkaConnector
CR。将此 CR 应用到应用KafkaConnect
CR 的同一 OpenShift 实例。
先决条件
- MySQL 正在运行,您完成了 设置 MySQL 以用于 Debezium 连接器 的步骤。
- AMQ Streams 部署在 OpenShift 上,并运行 Apache Kafka 和 Kafka Connect。如需更多信息,请参阅在 OpenShift 中部署和升级 AMQ Streams。
- podman 或 Docker 已安装。
-
您有在容器 registry 中创建和管理容器(如
quay.io
或docker.io
)的帐户和权限,您要向其添加将运行 Debezium 连接器的容器。
流程
为 Kafka Connect 创建 Debezium MySQL 容器:
创建一个 Dockerfile,它使用
registry.redhat.io/amq7/amq-streams-kafka-32-rhel8:2.2.0-12
作为基础镜像。例如,在终端窗口中输入以下命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
您可以指定您想要的任何文件名。
2
指定 Kafka Connect 插件目录的路径。如果您的 Kafka Connect 插件目录位于不同的位置,请将这个路径替换为您的目录的实际路径。
该命令在当前目录中创建一个名为
debezium-container-for-mysql.yaml
的 Dockerfile。从您在上一步中创建的
debezium-container-for-mysql.yaml
Docker 文件中构建容器镜像。在包含该文件的目录中,打开终端窗口并输入以下命令之一:podman build -t debezium-container-for-mysql:latest .
podman build -t debezium-container-for-mysql:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker build -t debezium-container-for-mysql:latest .
docker build -t debezium-container-for-mysql:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述命令使用名称
debezium-container-for-mysql
构建容器镜像。将自定义镜像推送到容器 registry,如
quay.io
或内部容器 registry。容器 registry 必须可供部署镜像的 OpenShift 实例使用。输入以下命令之一:podman push <myregistry.io>/debezium-container-for-mysql:latest
podman push <myregistry.io>/debezium-container-for-mysql:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker push <myregistry.io>/debezium-container-for-mysql:latest
docker push <myregistry.io>/debezium-container-for-mysql:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建新的 Debezium MySQL
KafkaConnect
自定义资源(CR)。例如,创建一个名为dbz-connect.yaml
的KafkaConnect
CR,用于指定注解和
镜像
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
metadata.annotations
表示KafkaConnector
资源用于配置在这个 Kafka Connect 集群中使用的 Cluster Operator。2
spec.image
指定您为运行 Debezium 连接器而创建的镜像名称。此属性覆盖 Cluster Operator 中的STRIMZI_DEFAULT_KAFKA_CONNECT_IMAGE
变量。输入以下命令将
KafkaConnect
CR 应用到 OpenShift Kafka Connect 环境:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令添加一个 Kafka Connect 实例,用于指定您为运行 Debezium 连接器而创建的镜像名称。
创建一个
KafkaConnector
自定义资源来配置 Debezium MySQL 连接器实例。您可以在
.yaml
文件中配置 Debezium MySQL 连接器,该文件指定连接器的配置属性。连接器配置可能会指示 Debezium 为 schema 和表的子集生成事件,或者可能会设置属性,以便 Debezium 忽略敏感、太大或不需要的指定栏中的值。以下示例配置了一个 Debezium 连接器,它连接到 MySQL 主机
192.168.99.100
,在端口 192.168.0.1 上捕获对inventory
数据库的更改。dbserver1
是服务器的逻辑名称。MySQL
inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 5.26. 连接器配置设置的描述 项 描述 1
连接器的名称。
2
任何时候只能有一个任务。由于 MySQL 连接器读取 MySQL 服务器的
binlog
,因此使用单一连接器任务可以确保正确的顺序和事件处理。Kafka Connect 服务使用连接器启动一个或多个可以正常工作的任务,并在 Kafka Connect 服务集群中自动分发运行的任务。如果有任何服务停止或崩溃,这些任务将重新分发到运行的服务。3
连接器的配置。
4
数据库主机,它是运行 MySQL 服务器的容器的名称(
mysql
)。5
连接器的唯一 ID。
6
MySQL 服务器或集群的主题前缀。此名称用作接收更改事件记录的所有 Kafka 主题的前缀。
7
连接器只捕获
inventory
表中的更改。8
此连接器用来向数据库架构历史记录主题写入和恢复 DDL 语句的 Kafka 代理列表。重启后,连接器会在连接器开始读取时恢复 binlog 中存在的数据库的模式。
9
数据库架构历史记录主题的名称。本主题仅用于内部使用,不应供消费者使用。
使用 Kafka Connect 创建连接器实例。例如,如果您将
KafkaConnector
资源保存到inventory-connector.yaml
文件中,您将运行以下命令:oc apply -f inventory-connector.yaml
oc apply -f inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述命令注册
inventory-connector
,连接器开始针对KafkaConnector
CR 中定义的inventory
数据库运行。
有关您可以为 Debezium MySQL 连接器设置的配置属性的完整列表,请参阅 MySQL 连接器配置属性。
结果
连接器启动后,它会为连接器配置 MySQL 数据库 执行一致的快照。然后,连接器开始为行级操作生成数据更改事件,并将事件记录流传输到 Kafka 主题。
5.5.4. 验证 Debezium MySQL 连接器是否正在运行 复制链接链接已复制到粘贴板!
如果连接器正确启动且没有错误,它会为每个连接器配置为捕获的表创建一个主题。下游应用程序可以订阅这些主题以检索源数据库中发生的信息事件。
要验证连接器是否正在运行,您可以从 OpenShift Container Platform Web 控制台或 OpenShift CLI 工具(oc)执行以下操作:
- 验证连接器状态。
- 验证连接器是否生成主题。
- 验证主题是否填充了每个表初始快照过程中生成的读操作("op":"r")的事件。
先决条件
- Debezium 连接器部署到 OpenShift 上的 AMQ Streams。
-
已安装 OpenShift
oc
CLI 客户端。 - 访问 OpenShift Container Platform web 控制台。
流程
使用以下方法之一检查
KafkaConnector
资源的状态:在 OpenShift Container Platform Web 控制台中:
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 以打开 Select Resource 复选框,然后键入
KafkaConnector
。 - 在 KafkaConnectors 列表中,点您要检查的连接器的名称,如 inventory-connector-mysql。
- 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc describe KafkaConnector <connector-name> -n <project>
oc describe KafkaConnector <connector-name> -n <project>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc describe KafkaConnector inventory-connector-mysql -n debezium
oc describe KafkaConnector inventory-connector-mysql -n debezium
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 5.3.
KafkaConnector
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证连接器是否已创建 Kafka 主题:
通过 OpenShift Container Platform Web 控制台。
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 打开 Select Resource 复选框,然后键入
KafkaTopic
。 -
从 KafkaTopics 列表中,点您要检查的主题的名称,例如
inventory-connector-mysql.inventory.orders--ac5e98ac6a5d91e04d8ec0dc9078a1ece439081d
。 - 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc get kafkatopics
oc get kafkatopics
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 5.4.
KafkaTopic
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
检查主题内容。
- 在终端窗口中输入以下命令:
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-mysql.inventory.products_on_hand
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-mysql.inventory.products_on_hand
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定主题名称的格式与
oc describe
命令在第 1 步中返回的格式相同,例如inventory-connector-mysql.inventory.addresses
。对于主题中的每个事件,命令会返回类似以下输出的信息:
例 5.5. Debezium 更改事件的内容
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-mysql.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-mysql.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-mysql.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.mysql.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-mysql.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"mysql","name":"inventory-connector-mysql","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"mysql-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-mysql.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-mysql.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-mysql.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.mysql.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-mysql.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"mysql","name":"inventory-connector-mysql","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"mysql-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,
有效负载
值显示连接器快照从表inventory.products_on_hand
中生成一个读取("op" ="r"
)事件。product_id
记录的"before"
状态为null
,这表示记录没有之前的值。"after"
状态对于product_id
为101
的项目的quantity
显示为3
。
5.5.5. Debezium MySQL 连接器配置属性的描述 复制链接链接已复制到粘贴板!
Debezium MySQL 连接器有许多配置属性,您可以使用它们来实现应用程序的正确连接器行为。许多属性具有默认值。有关属性的信息按如下方式进行组织:
- 所需的连接器配置属性
- 高级连接器配置属性
数据库架构历史记录配置属性,用于控制 Debezium 如何处理从数据库架构历史记录主题读取的事件。
- 控制 数据库驱动程序行为的直通数据库驱动程序属性。
除非默认值可用 , 否则需要以下配置属性。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 | 连接器的唯一名称。尝试再次使用相同的名称注册失败。所有 Kafka Connect 连接器都需要此属性。 | |
没有默认值 |
连接器的 Java 类的名称。始终为 MySQL 连接器指定 | |
| 应该为此连接器创建的最大任务数量。MySQL 连接器始终使用单个任务,因此不要使用这个值,因此始终可以接受默认值。 | |
没有默认值 | MySQL 数据库服务器的 IP 地址或主机名。 | |
| MySQL 数据库服务器的整数端口号。 | |
没有默认值 | 连接到 MySQL 数据库服务器时使用的 MySQL 用户的名称。 | |
没有默认值 | 连接到 MySQL 数据库服务器时要使用的密码。 | |
没有默认值 |
为 Debezium 捕获更改的特定 MySQL 数据库服务器/集群提供命名空间的主题前缀。主题前缀应该在所有其他连接器中唯一,因为它用作接收此连接器发送的事件的所有 Kafka 主题名称的前缀。数据库服务器逻辑名称中只能使用字母数字字符、连字符、句点和下划线。 警告 不要更改此属性的值。如果您更改了 name 值,重启后,而不是继续向原始主题发出事件,连接器会将后续事件发送到名称基于新值的主题。连接器也无法恢复其数据库架构历史记录主题。 | |
没有默认值 | 此数据库客户端的数字 ID,必须在 MySQL 集群中所有当前运行的数据库进程之间唯一。此连接器将 MySQL 数据库集群加入为另一个服务器(使用此唯一 ID),以便读取 binlog。 | |
空字符串 |
可选的、以逗号分隔的正则表达式列表,与要捕获更改的数据库的名称匹配。连接器不会捕获任何名称不在
要匹配数据库的名称,Debebe 应用 您指定的正则表达式。也就是说,指定的表达式与数据库的整个名称字符串匹配,它与数据库名称中可能存在的子字符串不匹配。 | |
空字符串 |
可选的、以逗号分隔的正则表达式列表,与您不想捕获更改的数据库名称匹配。连接器捕获名称不在
要匹配数据库的名称,Debebe 应用 您指定的正则表达式。也就是说,指定的表达式与数据库的整个名称字符串匹配,它与数据库名称中可能存在的子字符串不匹配。 | |
空字符串 |
可选的、以逗号分隔的正则表达式列表,与您要捕获更改的表的完全限定表标识符匹配。连接器不会捕获没有在
要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
空字符串 |
可选的、以逗号分隔的正则表达式列表,与您不想捕获更改的表的完全限定表标识符匹配。连接器捕获
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
空字符串 |
可选的、以逗号分隔的正则表达式列表,与列的完全限定名称匹配,以便从更改事件记录值中排除。列的完全限定域名格式为 databaseName。tableName.columnName。
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配,它与列名称中可能存在的子字符串不匹配。如果您在配置中包含此属性,不要设置 | |
空字符串 |
可选的、以逗号分隔的正则表达式列表,与更改事件记录值中包含的列的完全限定名称匹配。列的完全限定域名格式为 databaseName。tableName.columnName。
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配,它与列名称中可能存在的子字符串不匹配。 | |
不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。如果您要在一组列中超过属性名称中指定的字符数时,设置此属性。将 列的完全限定域名会观察以下格式: databaseName.tableName.columnName。要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配;表达式不匹配列名称中可能存在的子字符串。 您可以在单个配置中指定多个长度不同的属性。 | |
不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。如果您希望连接器屏蔽一组列的值,例如,如果它们包含敏感数据,则设置此属性。将 列的完全限定域名会观察以下格式: databaseName.tableName.columnName。要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配;表达式不匹配列名称中可能存在的子字符串。 您可以在单个配置中指定多个长度不同的属性。 | |
| 不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。列的完全限定域名格式为 <
一个 pseudonym,它包括了通过应用指定的 hashAlgorithm 和 salt 的结果的哈希值。根据使用的 hash 功能,会维护引用完整性,而列值则替换为伪nyms。支持的哈希功能在 Java Cryptography 架构标准算法名称文档中的 MessageDigest 部分 进行了描述。 column.mask.hash.SHA-256.with.salt.CzQMA0cB5K = inventory.orders.customerName, inventory.shipment.customerName
如有必要,伪的nym 会自动缩短到列的长度。连接器配置可以包含多个指定不同哈希算法和 salt 的属性。 |
不适用 | 可选的、以逗号分隔的正则表达式列表,它与您希望连接器发送代表列元数据的完全限定名称匹配。当设置此属性时,连接器会将以下字段添加到事件记录的架构中:
这些参数分别传播列的原始类型和长度(用于变量带宽类型)。
列的完全限定域名会观察以下格式之一: databaseName.tableName.columnName, 或 databaseName.schemaName.tableName.columnName. | |
不适用 | 可选的、以逗号分隔的正则表达式列表,用于指定为数据库列定义的数据类型的完全限定名称。当设置此属性时,对于具有匹配数据类型的列,连接器会发出事件记录,该记录在 schema 中包含以下额外字段:
这些参数分别传播列的原始类型和长度(用于变量带宽类型)。
列的完全限定域名会观察以下格式之一: databaseName.tableName.typeName, 或 databaseName.schemaName.tableName.typeName. 有关 MySQL 特定数据类型名称的列表,请查看 MySQL 数据类型映射。 | |
|
时间、日期和时间戳可以通过不同类型的精度表示,包括: | |
|
指定连接器如何处理 | |
|
指定在更改事件中应该如何表示 BIGINT UNSIGNED 列。可能的设置是: | |
| 指定连接器是否应该将数据库模式中的更改发布到与数据库服务器 ID 的名称相同的 Kafka 主题的布尔值。每个架构更改都会使用包含数据库名称且值包含 DDL 语句的键来记录。这独立于连接器内部记录数据库架构历史记录。 | |
| 指定连接器是否应该解析和发布元数据对象上的表和列注释的布尔值。启用此选项会对内存用量造成影响。逻辑架构对象的数量和大小严重影响 Debezium 连接器消耗的内存量,并为每一个字符串添加潜在的大型字符串数据可能非常昂贵。 | |
|
指定连接器是否应该包含生成更改事件的原始 SQL 查询的布尔值。 | |
|
指定连接器在对 binlog 事件进行反序列化时应如何响应异常。 | |
|
指定连接器应如何响应与内部架构表示中不存在的表相关的 binlog 事件。也就是说,内部表示与数据库不一致。 | |
| 正整数值,用于指定在每个连接器迭代过程中应处理的每个批处理事件的最大大小。默认值为 2048。 | |
|
正整数值,用于指定阻塞队列可以保存的最大记录数。当 Debezium 从数据库读取事件时,它会将事件放置在阻塞队列中,然后再将它们写入 Kafka。当连接器将消息写入 Kafka 或 Kafka 不可用时,阻塞队列可以提供从数据库读取更改事件的后端。当连接器定期记录偏移时,队列中保存的事件会被忽略。始终将 | |
|
较长的整数值,指定块队列的最大卷(以字节为单位)。默认情况下,不会为阻塞队列指定卷限制。要指定队列可以使用的字节数,请将此属性设置为正长值。 | |
| 正整数值,用于指定连接器在处理批处理事件前应该等待出现新更改事件的毫秒数。默认值为 500 毫秒,或 0.5 秒。 | |
| 一个正整数值,用于指定这个连接器在超时前应该等待的最大时间(毫秒)。默认值为 30 秒。 | |
没有默认值 |
以逗号分隔的正则表达式列表,与连接器用来在 MySQL 服务器上查找 binlog 位置的 GTID 集中的源 UUID 匹配。当设置此属性时,连接器只使用具有与指定
要匹配 GTID 的值,Debezium 应用 您指定的正则表达式。也就是说,指定的表达式与整个 UUID 字符串匹配;它与 UUID 中可能存在的子字符串不匹配。 | |
没有默认值 |
以逗号分隔的正则表达式列表,与连接器用来在 MySQL 服务器上查找 binlog 位置的 GTID 集中的源 UUID 匹配。当设置此属性时,连接器只使用具有与任何指定
要匹配 GTID 的值,Debezium 应用 您指定的正则表达式。也就是说,指定的表达式与整个 UUID 字符串匹配;它与 UUID 中可能存在的子字符串不匹配。 | |
|
控制 删除 事件是否随后是 tombstone 事件。 | |
不适用 | 指定连接器用来组成自定义消息键的表达式列表,以更改它发布到指定表的 Kafka 主题的事件记录。
默认情况下,Debezium 使用表的主键列作为它发出的记录的消息键。对于缺少主密钥的表,或者指定缺少主密钥的表的密钥,您可以根据一个或多个列配置自定义消息密钥。
每个完全限定表名称都是正则表达式,格式为: 对您用来创建自定义消息键的列数没有限制。但是,最好使用指定唯一密钥所需的最小数量。 | |
bytes |
指定在更改事件中应该如何表示 | |
none |
指定如何调整架构名称,以便与连接器使用的消息转换器兼容。可能的设置:
|
高级 MySQL 连接器配置属性
下表描述了 高级 MySQL 连接器属性。这些属性的默认值很少需要更改。因此,您不需要在连接器配置中指定它们。
属性 | 默认 | 描述 |
---|---|---|
| 指定是否应使用单独的线程来确保与 MySQL 服务器/集群的连接保持处于活动状态的布尔值。 | |
没有默认值 |
枚举连接器可以使用 的自定义转换器 实例的符号名称的逗号分隔列表。
对于您为连接器配置的每个转换器,还必须添加一个
例如, boolean.type: io.debezium.connector.mysql.converters.TinyIntOneToBooleanConverter
如果要进一步控制配置的转换器的行为,您可以添加一个或多个配置参数将值传递给转换器。要将这些额外配置参数与转换器关联,请为半语名称添加转换器的符号链接名称前缀。 boolean.selector=db1.table1.*, db1.table2.column1
| |
| 指定是否应忽略内置系统表的布尔值。无论表包含和排除列表是什么,这个适用。默认情况下,系统表不包括在捕获其变化时,在更改任何系统表时不会生成任何事件。 | |
|
指定是否使用加密的连接。可能的设置是: | |
|
指定在连接器启动时运行快照的条件。可能的设置为: | |
|
控制连接器保存全局 MySQL 读锁定的时长,这会阻止对数据库的任何更新,同时执行快照。可能的设置有: | |
|
可选的、以逗号分隔的正则表达式列表,与表的完全限定名称(< 要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
没有默认值 | 指定要包含在快照中的表行。如果您希望快照仅在表中包括行的子集,请使用此属性。此属性仅影响快照。它不适用于连接器从日志中读取的事件。
属性包含一个以逗号分隔的表名称列表,格式为 <
在包含 soft-delete 列 "snapshot.select.statement.overrides": "customer.orders", "snapshot.select.statement.overrides.customer.orders": "SELECT * FROM [customers].[orders] WHERE delete_flag = 0 ORDER BY id DESC"
在生成的快照中,连接器仅包含 | |
|
在快照过程中,连接器会查询配置连接器的每个表来捕获更改。连接器使用每个查询结果生成一个读取事件,其中包含该表中所有行的数据。此属性决定了 MySQL 连接器是否将表的结果置于内存中,但需要大量内存,或者流传输结果,但对非常大的表来说可能较慢,但不适用于非常大的表。此属性的设置指定表在连接器流结果前必须包含的最小行数。 | |
|
控制连接器将心跳信息发送到 Kafka 主题的频率。默认行为是连接器不会发送心跳信息。 | |
没有默认值 |
指定连接器发送心跳消息时连接器在源数据库上执行的查询。 | |
没有默认值 |
当 JDBC 连接(而不是读取事务日志的连接)与数据库建立时,要执行的 SQL 语句的分号分隔列表。要将分号指定为 SQL 语句中的字符而不是分隔符,请使用两个分号( | |
没有默认值 | 连接器在连接器启动时应等待的时间(毫秒)。如果您要在集群中启动多个连接器,此属性对于避免快照中断非常有用,这可能会导致连接器重新平衡。 | |
没有默认值 | 在快照中,连接器以行批处理形式读取表内容。此属性指定批处理中的最大行数。 | |
| 正整数,用于指定在执行快照时等待获取表锁定的最长时间(以毫秒为单位)。如果连接器无法在这个时间段内获取表锁定,则快照会失败。请参阅 MySQL 连接器如何执行数据库快照。 | |
|
指示连接器是否将 2 位规格转换为 4 位数字的布尔值。当转换完全委派给数据库时,设置为 | |
如果连接器配置将 | 指明是否清理字段名称以遵循 Avro 命名要求。 | |
|
以逗号分隔的操作类型列表,这些类型将在流期间跳过。操作包括: | |
没有默认值 |
用于向连接器发送信号的数据收集的完全限定名称。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#debezium-signaling-enabling-signaling | |
|
在增量快照期间允许架构更改。启用连接器时,会在增量快照期间检测模式更改,并重新选择当前的块以避免锁定 DDL。 | |
| 连接器在增量快照块期间获取并读取内存的最大行数。增加块大小可提高效率,因为快照会运行更大的快照查询。但是,较大的块大小还需要更多内存来缓冲快照数据。将块大小调整为在您的环境中提供最佳性能的值。 | |
|
确定连接器是否生成带有事务边界的事件,并使用事务元数据增强更改事件。如果您希望连接器进行此操作,请指定 | |
|
应该用来确定数据更改的主题名称、模式更改、事务、心跳事件等的 TopicNamingStrategy 类的名称,默认为 | |
|
指定主题名称的分隔符,默认为 | |
| 用于在绑定并发哈希映射中保存主题名称的大小。此缓存有助于确定与给定数据收集对应的主题名称。 | |
|
控制连接器向发送心跳消息的主题名称。主题名称具有此模式: | |
|
控制连接器向发送事务元数据消息的主题名称。主题名称具有此模式: |
Debezium 连接器数据库模式历史记录配置属性
Debezium 提供了一组 schema.history.internal114
属性,用于控制连接器如何与 schema 历史记录主题交互。
下表描述了用于配置 Debezium 连接器的 schema.history.internal
属性。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 | 连接器存储数据库架构历史记录的 Kafka 主题的完整名称。 | |
没有默认值 | 连接器用来建立到 Kafka 集群的初始连接的主机/端口对列表。此连接用于检索之前由连接器存储的数据库架构历史记录,并编写从源数据库读取的每个 DDL 语句。每个对都应该指向 Kafka Connect 进程使用的相同 Kafka 集群。 | |
| 整数值,用于指定连接器在轮询保留数据时应该等待的最大毫秒数。默认值为 100ms。 | |
| 指定连接器在使用 Kafka admin 客户端获取集群信息时应等待的最大毫秒数。 | |
| 指定连接器在使用 Kafka admin 客户端创建 kafka 历史记录主题时应等待的最大毫秒数。 | |
|
连接器在连接器恢复失败前读取保留历史记录数据的次数上限。在收到数据后等待的最长时间为 | |
|
指定连接器是否应该忽略不正确的或未知数据库语句或停止处理等布尔值,以便人可以解决这个问题。安全默认值为 | |
|
指定连接器是否应该记录所有 DDL 语句的布尔值
安全默认值为 |
直通数据库模式历史记录属性,用于配置制作者和消费者客户端
Debezium 依赖于 Kafka producer 将模式更改写入数据库架构历史记录主题。同样,它依赖于 Kafka 使用者在连接器启动时从数据库 schema 历史记录主题中读取。您可以通过将值分配给以 schema.history.internal.consumer 前缀开头的一组直通配置属性来定义 Kafka producer
和 消费者
客户端的配置。直通制作者和消费者数据库模式历史记录属性控制一系列行为,如这些客户端如何与 Kafka 代理安全连接,如下例所示:
Debezium 在将属性传递给 Kafka 客户端之前,从属性名称中分离前缀。
如需有关 Kafka producer 配置属性和 Kafka 使用者配置属性的更多详情,请参阅 Kafka 文档。
Debezium 连接器 Kafka 信号配置属性
当 MySQL 连接器配置为只读时,信号表的替代选择是信号 Kafka 主题。
Debezium 提供了一组 信号 192.168.1.0/24
属性,用于控制连接器如何与 Kafka 信号主题交互。
下表描述了 信号
属性。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 | 连接器监控用于临时信号的 Kafka 主题的名称。 | |
没有默认值 | 连接器用来建立到 Kafka 集群的初始连接的主机/端口对列表。每个对都应该指向 Kafka Connect 进程使用的相同 Kafka 集群。 | |
| 整数值,用于指定连接器在轮询信号时应等待的最大毫秒数。默认值为 100ms。 |
Debezium 连接器传递信号 Kafka 使用者客户端配置属性
Debezium 连接器提供传递配置信号 Kafka 使用者。透传信号属性以 signals.consumer.*
前缀开始。例如,连接器将 signal.consumer.security.protocol=SSL
等属性传递给 Kafka 使用者。
与 数据库架构历史记录客户端的直通属性 一样,Debebe 会将属性中的前缀从属性分离,然后再将它们传递给 Kafka 信号消费者。
Debezium 连接器传递数据库驱动程序配置属性
Debezium 连接器为数据库驱动程序的透传配置提供。直通数据库属性以前缀 驱动程序 开头
。例如,连接器将 driver.foobar=false
等属性传递给 JDBC URL。
与 数据库架构历史记录客户端的直通属性 一样,Debebe 会将属性中的前缀从属性分离,然后再将它们传递给数据库驱动程序。
5.6. 监控 Debezium MySQL 连接器性能 复制链接链接已复制到粘贴板!
Debezium MySQL 连接器除了对 Zookeeper、Kafka 和 Kafka Connect 提供的 JMX 指标的内置支持外,还提供三种类型的指标。
Debezium 监控文档 提供了有关如何使用 JMX 公开这些指标的详细信息。
5.6.1. 在 MySQL 数据库的快照期间监控 Debezium 复制链接链接已复制到粘贴板!
MBean 是 debezium.mysql:type=connector-metrics,context=snapshot,server= <mysql.server.name>
。
除非快照操作处于活跃状态,否则快照指标不会被公开,或者快照自上次连接器启动后发生。
下表列出了可用的 shapshot 指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个快照事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器从上次启动或重置后看到的事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 包括在快照中的表的总数。 | |
| 快照要复制的表数。 | |
| 快照是否启动。 | |
| 快照是否暂停。 | |
| 快照是否中止。 | |
| 快照是否完成。 | |
| 快照目前花费的秒数,即使未完成也是如此。还包括快照暂停时的时间。 | |
| 快照暂停的秒数。如果快照暂停多次,则暂停的时间会增加。 | |
| 包含快照中每个表扫描的行数的映射。表在处理期间逐步添加到映射中。更新每个 10,000 行扫描,并在完成表后更新。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
在执行增量快照时,连接器还提供以下额外快照指标:
属性 | 类型 | 描述 |
---|---|---|
| 当前快照块的标识符。 | |
| 定义当前块的主键集的下限。 | |
| 定义当前块的主密钥集的上限。 | |
| 当前快照表的主键集的下限。 | |
| 当前快照表的主键集的上限。 |
Debezium MySQL 连接器还提供 HoldingGlobalLock
自定义快照指标。此指标设置为布尔值,指示连接器当前是否包含全局或者表写入锁定。
5.6.2. 监控 Debezium MySQL 连接器记录流 复制链接链接已复制到粘贴板!
只有在启用了 binlog 事件缓冲时,事务相关的属性才可用。MBean 是 debezium.mysql:type=connector-metrics,context=streaming,server= <mysql.server.name>
。
下表列出了可用的流指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个流事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器自上次开始或指标重置以来看到的事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的创建事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的更新事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的删除事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 表示连接器当前是否连接到数据库服务器的标记。 | |
| 最后一次更改事件时间戳和连接器处理之间毫秒的数量。该值将限制运行数据库服务器和连接器的机器上时钟之间的差别。 | |
| 已提交的已处理的事务数量。 | |
| 最后一次接收的事件的协调。 | |
| 最后一次处理的事务的事务标识符。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
Debezium MySQL 连接器还提供以下额外的流指标:
属性 | 类型 | 描述 |
---|---|---|
| 连接器最近读取的 binlog 文件的名称。 | |
| 连接器读取的 binlog 中最新位置(以字节为单位)。 | |
| 表示连接器当前是否从 MySQL 服务器跟踪 GTID 的标记。 | |
| 读取 binlog 时由连接器处理的最新 GTID 集的字符串表示。 | |
| MySQL 连接器跳过的事件数。通常,事件会被跳过,因为 MySQL 的 binlog 中不正确的或未解析的事件。 | |
| MySQL 连接器断开连接的数量。 | |
| 已回滚且未流传输的已处理事务的数量。 | |
|
未符合 | |
|
不适用于 look-ahead 缓冲区的事务数量。为获得最佳性能,这个值应显著小于 |
5.6.3. 监控 Debezium MySQL 连接器模式历史记录 复制链接链接已复制到粘贴板!
MBean 是 debezium.mysql:type=connector-metrics,context=schema-history,server= <mysql.server.name>
。
下表列出了可用的模式历史记录指标。
属性 | 类型 | 描述 |
---|---|---|
|
| |
| 恢复开始的时间(以 epoch 秒为单位)。 | |
| 恢复阶段读取的更改数量。 | |
| 恢复和运行时应用的架构更改总数。 | |
| 从历史记录存储中恢复自上次更改以来的毫秒数。 | |
| 从上次更改被应用后经过的毫秒数。 | |
| 从历史记录存储中恢复最后一次更改的字符串表示。 | |
| 最后一次应用的更改的字符串表示。 |
5.7. Debezium MySQL 连接器如何处理错误和问题 复制链接链接已复制到粘贴板!
Debezium 是一个分布式系统,可捕获多个上游数据库中的所有更改,永远不会丢失或丢失事件。当系统正常运行或被仔细管理时,Debezium 会在每次更改事件记录时 完全 提供。
如果发生错误,系统将不会丢失任何事件。但是,当它从故障中恢复时,可能会重复一些更改事件。在这些异常情况下,Debebe (如 Kafka)提供 至少一次 更改事件。
详情包括在以下部分:
配置和启动错误
在以下情况下,当尝试启动时连接器会失败,在日志中报告错误或异常,并停止运行:
- 连接器的配置无效。
- 连接器无法使用指定的连接参数成功连接到 MySQL 服务器。
- 连接器试图在 binlog 中的一个位置重启,其中 MySQL 不再有可用的历史记录。
在这些情况下,错误消息包含有关此问题的详细信息,并可能会有推荐的临时解决方案。在更正配置或解决 MySQL 问题后,重启连接器。
但是,如果为高可用性 MySQL 集群启用了 GTID,您可以立即重启连接器。它将连接到集群中的不同 MySQL 服务器,找到服务器 binlog 中代表最后一个事务的位置,并开始从该特定位置读取新的服务器的 binlog。
如果没有启用 GTID,连接器会记录仅连接它的 MySQL 服务器的 binlog 位置。要从正确的 binlog 位置重启,您必须重新连接到该特定服务器。
Kafka Connect 正常停止
当 Kafka Connect 正常停止时,当 Debezium MySQL 连接器任务停止并在新的 Kafka Connect 过程中重启时,会有一个短暂的延迟。
Kafka Connect 进程崩溃
如果 Kafka Connect 崩溃,该过程会停止,并且任何 Debezium MySQL 连接器任务终止,而不记录它们最近处理的偏移量。在分布式模式中,Kafka Connect 会在其他进程中重启连接器任务。但是,MySQL 连接器从之前进程记录的最后一个偏移中恢复。这意味着,替换任务可能会在崩溃前生成一些相同的事件,从而创建重复的事件。
每个更改事件消息都包含可用于识别重复事件的源特定信息,例如:
- 事件来源
- MySQL 服务器事件时间
- binlog 文件名和位置
- GTID (如果使用)
MySQL 清除 binlog 文件
如果 Debezium MySQL 连接器停止了很长时间,MySQL 服务器会清除旧的 binlog 文件,连接器的最后位置可能会丢失。当连接器重启时,MySQL 服务器不再有起点,连接器执行另一个初始快照。如果快照被禁用,则连接器会失败,并显示错误。
有关 MySQL 连接器如何执行初始 快照的详情,请查看快照。
第 6 章 Oracle 的 Debezium Connector 复制链接链接已复制到粘贴板!
Debezium 的 Oracle 连接器捕获并记录在 Oracle 服务器上的数据库中进行的行级更改,包括连接器运行时添加的表。您可以将连接器配置为为特定 schema 和表的特定子集发出更改事件,或者在特定列中忽略、屏蔽或截断值。
有关与此连接器兼容的 Oracle 数据库版本的详情,请参考 Debezium 支持的配置页面。
Debezium 使用原生 LogMiner 数据库软件包从 Oracle 更改事件。
使用 Debezium Oracle 连接器的信息和流程进行组织,如下所示:
6.1. Debezium Oracle 连接器如何工作 复制链接链接已复制到粘贴板!
为了最佳配置和运行 Debezium Oracle 连接器,了解连接器如何执行快照、流更改事件、决定 Kafka 主题名称、使用元数据以及实施事件缓冲会很有帮助。
如需更多信息,请参阅以下主题:
6.1.1. Debezium Oracle 连接器如何执行数据库快照 复制链接链接已复制到粘贴板!
通常,Oracle 服务器上的红色日志被配置为不保留数据库的完整历史记录。因此,Debebe Oracle 连接器无法从日志检索数据库的整个历史记录。要启用连接器为数据库当前状态建立基准,连接器首次启动时,它会执行数据库的初始 一致性快照。
您可以通过设置 snapshot.mode
连接器配置属性的值来自定义连接器创建快照的方法。默认情况下,连接器的快照模式被设置为 initial
。
创建初始快照的默认连接器工作流
当快照模式被设置为默认模式时,连接器会完成以下任务来创建快照:
- 决定要捕获的表。
-
获取每个捕获表上的
ROW SHARE MODE
锁定,以防止在创建快照过程中发生结构更改。Debezium 只包含短时间的锁定。 - 从服务器的 redo 日志读取当前系统更改号(SCN)位置。
- 捕获所有相关表的结构。
- 释放在第 2 步中获取的锁定。
-
扫描所有相关数据库表和模式,使其在 SCN 位置处有效,该位置在第 3 步读取的 SCN 位置(选择
OF SCN 123
),为每行生成一个READ
事件,然后将事件记录写入特定于表的 Kafka 主题。 - 在连接器偏移中记录成功完成快照。
在快照过程开始后,如果因为连接器失败、重新平衡或其他原因导致进程中断,则进程会在连接器重启后重启。连接器完成初始快照后,它会继续从第 3 步中读取的位置进行流传输,使其不会丢失任何更新。如果连接器因为某种原因再次停止,则重启后,它会恢复之前从之前停止的流传输更改。
设置 | 描述 |
---|---|
| 在每个连接器启动时执行快照。快照完成后,连接器开始流传输事件记录以进行后续数据库更改。 |
| 连接器执行数据库快照,如 创建初始快照的默认工作流 中所述。快照完成后,连接器开始流传输事件记录以进行后续数据库更改。 |
| 连接器执行数据库快照,并在流传输任何更改事件记录前停止,不允许捕获任何后续更改事件。 |
|
连接器捕获所有相关表的结构,执行 默认快照工作流 中描述的所有步骤,但它不会创建 |
|
设置这个选项来恢复丢失或损坏的数据库模式历史记录主题。重启后,连接器运行一个快照,它会从源表中重建该主题。您还可以设置属性来定期修剪遇到意外增长的数据库架构历史记录主题。 |
如需更多信息,请参阅连接器配置属性表中的 snapshot.mode
。
6.1.1.1. 临时快照 复制链接链接已复制到粘贴板!
默认情况下,连接器仅在首次启动后运行初始快照操作。在正常情况下,遵循这个初始快照,连接器不会重复快照过程。连接器捕获的任何将来更改事件数据都仅通过流传输过程。
然而,在某些情况下,连接器在初始快照期间获取的数据可能会变得过时、丢失或不完整。为了提供总结表数据的机制,Debezium 包含一个执行临时快照的选项。数据库中的以下更改可能是执行临时快照:
- 连接器配置会被修改为捕获不同的表集合。
- Kafka 主题已删除,必须重建。
- 由于配置错误或某些其他问题导致数据损坏。
您可以通过启动所谓的 临时命令快照,为之前捕获的快照重新运行快照。临时快照需要使用 信号表。您可以通过向 Debezium 信号表发送信号请求来启动临时快照。
当您启动现有表的临时快照时,连接器会将内容附加到表已存在的主题中。如果删除了之前存在的主题,如果启用自动主题创建,Debezium 可以自动创建主题。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#customization-of-kafka-connect-automatic-topic-creation
临时快照信号指定要包含在快照中的表。快照可以捕获数据库的整个内容,或者只捕获数据库中表的子集。另外,快照也可以捕获数据库中表内容的子集。
您可以通过向信号表发送 execute-snapshot
消息来指定要捕获的表。将 execute-snapshot
信号的类型设置为增量
,并提供快照中包含的表名称,如下表所述:
字段 | 默认 | 值 |
---|---|---|
|
|
指定您要运行的快照类型。 |
| 不适用 |
包含与要快照的表的完全限定域名匹配的正则表达式的数组。 |
| 不适用 | 可选字符串,它根据表的列指定条件,用于捕获表内容的子集。 |
触发临时快照
您可以通过在信号表中添加带有 execute-snapshot
信号类型的条目来启动临时快照。连接器处理消息后,它会开始快照操作。快照过程读取第一个和最后一个主密钥值,并使用这些值作为每个表的开头和端点。根据表中的条目数量以及配置的块大小,Debezium 将表分成块,并一次为每个块进行快照。
6.1.1.2. 增量快照 复制链接链接已复制到粘贴板!
为了提供管理快照的灵活性,Debezium 包括一个补充的快照机制,称为 增量快照。增量快照依赖于 Debezium 机制 向 Debezium 连接器发送信号。
在增量快照中,而不是一次性捕获数据库的完整状态,如初始快照,Debezium 以一系列可配置的块的形式捕获每个表。您可以指定您希望快照捕获的表,以及每个块的大小。块大小决定了快照在数据库的每个获取操作期间收集的行数。增量快照的默认块大小为 1 KB。
当增量快照进行时,Debezium 使用水位线来跟踪其进度,维护它捕获的每一个表行的记录。这个阶段捕获数据的方法比标准初始快照过程提供以下优点:
- 您可以使用流化数据捕获并行运行增量快照,而不是经过发布流,直到快照完成为止。连接器会继续在整个快照过程中从更改日志捕获接近实时事件,且操作都不会阻断其他事件。
- 如果增量快照的进度中断,您可以在不丢失任何数据的情况下恢复它。在进程恢复后,快照从停止的时间开始,而不是从开始重新定义表。
-
您可以随时根据需要运行增量快照,并根据需要重复这个过程以适应数据库更新。例如,您可以在修改连接器配置后重新运行快照,以将表添加到其
table.include.list
属性中。
增量快照过程
当您运行增量快照时,Debezium 按主密钥对表进行排序,然后根据 配置的块大小 将表分成块。然后,按块使用块,然后在块中捕获每个表行。对于它捕获的每行,快照会发出 READ
事件。该事件代表了块开始快照时的行值。
当快照继续进行时,其他进程可能会继续访问数据库,从而可能会修改表记录。要反映此类更改,INSERT
、UPDATE
或 DELETE
操作会照常提交到事务日志中。同样,持续 Debezium 流过程还会继续检测这些更改事件,并将对应的更改事件记录发送到 Kafka。
Debezium 如何使用相同的主密钥解决记录间的冲突
在某些情况下,流传输进程发出的 UPDATE
或 DELETE
事件会耗尽序列。也就是说,流过程可能会发出一个事件,它会在快照捕获包含该行的 READ
事件之前修改表行。当快照最终会为行发出对应的 READ
事件时,其值已经被替换。为确保以正确的逻辑顺序处理到达序列的增量快照事件,Debezium 会使用一种缓冲区方案来解决冲突。只有在快照事件和流事件间冲突时才解决后,Debezium 会向 Kafka 发送事件记录。
快照窗口
为了帮助解决后续 READ
事件和修改同一表行的流事件之间的冲突,Debezium 采用所谓的 快照窗口。快照窗口分离了增量快照捕获指定表块的数据的时间间隔。在打开块的快照窗口前,Debebe 会遵循其常见的行为,并将事件直接从事务日志直接降级到目标 Kafka 主题。但是,从打开特定块的快照时,Debebe 会执行重复数据删除步骤,以解决具有相同主密钥的事件之间冲突。
对于每个数据收集,Debezium 会发出两种类型的事件,并将其记录存储在单个目标 Kafka 主题中。它直接从表中捕获的快照记录作为 READ
操作发出。同时,当用户继续更新数据收集中的记录,并更新事务日志以反映每个提交,Debezium 会为每个更改发出 UPDATE
或 DELETE
操作。
当快照窗口打开时,Debezium 开始处理快照块,它会将快照记录提供给内存缓冲区。在快照窗口中,缓冲区中 READ
事件的主键将与传入流事件的主键进行比较。如果没有找到匹配项,流的事件记录将直接发送到 Kafka。如果 Debezium 检测到匹配项,它会丢弃缓冲的 READ
事件,并将流的记录写入目标主题,因为流的事件逻辑地替换静态快照事件。在块的快照窗口关闭后,缓冲区仅包含没有相关事务日志事件的 READ
事件。Debezium 将这些剩余的 READ
事件发送到表的 Kafka 主题。
连接器重复每个快照块的进程。
Oracle 的 Debezium 连接器不支持增量快照运行时的模式更改。
6.1.1.3. 触发增量快照 复制链接链接已复制到粘贴板!
目前,启动增量快照的唯一方法是向源数据库上的 信号发送临时快照 信号。
您可以以 SQL INSERT
查询形式向信号表提交信号。
在 Debezium 检测到信号表中的更改后,它会读取信号,并运行请求的快照操作。
您提交的查询指定要包含在快照中的表,以及可选的指定快照操作类型。目前,快照操作的唯一有效选项是默认值 增量
。
要指定快照中包含的表,请提供一个 data-collections
数组,该数组列出了用于匹配表的表或一组正则表达式,例如:
{"data-collections": ["public.MyFirstTable", "public.MySecondTable"]}
增量快照信号的 data-collections
数组没有默认值。如果 data-collections
数组为空,Debezium 会检测到不需要任何操作,且不执行快照。
如果要包含在快照中的表名称包含数据库、模式或表名称的句点(.
),要将表添加到 data-collections
数组中,您必须用双引号转义名称的每个部分。
例如,若要包含 公共
模式中存在的表,并且名为 My.Table
,请使用以下格式:" public"."My.Table
"。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
发送 SQL 查询,将临时增量快照请求添加到信号表中:
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令中的
id
、type
和data
参数的值对应于 信号表的字段。下表描述了示例中的参数:
Expand 表 6.3. 向信号表发送增量快照信号的 SQL 命令中的字段描述 项 值 描述 1
myschema.debezium_signal
指定源数据库上信号表的完全限定名称。
2
ad-hoc-1
id
参数指定分配给信号请求的id
标识符的任意字符串。
使用此字符串来标识到信号表中条目的日志消息。Debezium 不使用此字符串。相反,在快照中,Debebe 会生成自己的id
字符串作为水位信号。3
execute-snapshot
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段所需的组件,用于指定表名称或正则表达式数组,以匹配快照中包含的表名称。
数组列出了根据完全限定名称匹配表的正则表达式,其格式与您用来指定signal.data.collection
配置属性中的连接器信号表的名称相同。5
增量
信号的
data
字段的可选类型
组件,用于指定要运行的快照操作类型。
目前,唯一有效选项是默认值增量
。
如果没有指定值,连接器将运行一个增量快照。6
additional-condition
可选字符串,它根据表的列指定条件,用于捕获表内容的子集。有关
additional-condition
参数的详情请参考带有额外条件
的临时增量快照。
带有额外条件
的临时增量快照
如果您希望快照在表中仅包含内容子集,您可以通过将 additional-condition
参数附加到快照信号来修改信号请求。
典型的快照的 SQL 查询采用以下格式:
SELECT * FROM <tableName> ....
SELECT * FROM <tableName> ....
通过添加 additional-condition
参数,您可以将 WHERE
条件附加到 SQL 查询中,如下例所示:
SELECT * FROM <tableName> WHERE <additional-condition> ....
SELECT * FROM <tableName> WHERE <additional-condition> ....
以下示例显示了向信号表发送带有额外条件的临时增量快照请求的 SQL 查询:
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
例如,假设您有一个包含以下列的产品表:
-
id
(主密钥) -
color
-
quantity
如果您希望 product 表的增量快照只包含 color=blue
的数据项,您可以使用以下 SQL 语句来触发快照:
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue"}');
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue"}');
additional-condition
参数还允许您传递基于多个列的条件。例如,使用上例中的 product 表,您可以提交查询来触发增量快照,该快照仅包含那些项目的 data =blue
和 quantity>10
:
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue AND quantity>10"}');
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue AND quantity>10"}');
以下示例显示了连接器捕获的增量快照事件的 JSON。
示例:增加快照事件信息
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定要运行的快照操作类型。 |
2 |
|
指定事件类型。 |
6.1.1.4. 停止增量快照 复制链接链接已复制到粘贴板!
您还可以通过向源数据库上的表发送信号来停止增量快照。您可以通过发送 SQL INSERT
查询,向表提交停止快照信号。
在 Debezium 检测到信号表中的更改后,它会读取信号,并在进行时停止增量快照操作。
您提交的查询指定了 增量
的快照操作,以及可选的、要删除的当前运行快照的表。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
发送 SQL 查询以停止临时增量快照到信号表:
INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<tableName>","<tableName>"],"type":"incremental"}');
INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<tableName>","<tableName>"],"type":"incremental"}');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
INSERT INTO myschema.debezium_signal (id, type, data) values ('ad-hoc-1', 'stop-snapshot', '{"data-collections": ["schema1.table1", "schema2.table2"], "type":"incremental"}');
INSERT INTO myschema.debezium_signal (id, type, data)
1 values ('ad-hoc-1',
2 'stop-snapshot',
3 '{"data-collections": ["schema1.table1", "schema2.table2"],
4 "type":"incremental"}');
5 Copy to Clipboard Copied! Toggle word wrap Toggle overflow signal 命令中的
id
、type
和data
参数的值对应于 信号表的字段。下表描述了示例中的参数:
Expand 表 6.4. 向信号表发送停止增量快照信号的 SQL 命令中的字段描述 项 值 描述 1
myschema.debezium_signal
指定源数据库上信号表的完全限定名称。
2
ad-hoc-1
id
参数指定分配给信号请求的id
标识符的任意字符串。
使用此字符串来标识到信号表中条目的日志消息。Debezium 不使用此字符串。3
stop-snapshot
指定
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段的可选组件,用于指定表名称或正则表达式数组,以匹配要从快照中删除的表名称。
数组列出了根据完全限定名称匹配表的正则表达式,其格式与您用来指定signal.data.collection
配置属性中的连接器信号表的名称相同。如果省略了data
字段的此组件,则信号将停止正在进行的整个增量快照。5
增量
信号的
data
字段所需的组件,用于指定要停止的快照操作类型。
目前,唯一有效选项是增量的
。
如果没有指定类型
值,则信号无法停止增量快照。
6.1.2. 接收 Debezium Oracle 更改事件记录的 Kafka 主题默认名称 复制链接链接已复制到粘贴板!
默认情况下,Oracle 连接器将所有 INSERT
、UPDATE
和 DELETE
操作的更改事件写入特定于该表的单个 Apache Kafka 主题。连接器使用以下惯例命名更改事件主题:
topicPrefix.schemaName.tableName
以下列表提供默认名称组件的定义:
- topicPrefix
-
由
topic.prefix
连接器配置属性指定的主题前缀。 - schemaName
- 在其中操作的 schema 的名称。
- tableName
- 操作发生的表的名称。
例如,如果 fulfillment
是服务器名称,inventory
是 schema 名称,数据库包括名为 orders
, customers
, 和 products
的表,Debezium Oracle 连接器会向以下 Kafka 主题发送事件,数据库中的每个表有一个。
fulfillment.inventory.orders fulfillment.inventory.customers fulfillment.inventory.products
fulfillment.inventory.orders
fulfillment.inventory.customers
fulfillment.inventory.products
连接器应用类似的命名约定来标记其内部数据库架构历史记录主题、架构更改主题 以及 事务元数据主题。
如果默认主题名称不满足您的要求,您可以配置自定义主题名称。要配置自定义主题名称,您可以在逻辑主题路由 SMT 中指定正则表达式。有关使用逻辑主题路由 SMT 自定义主题命名的更多信息,请参阅 主题路由。
6.1.3. Debezium Oracle 连接器如何公开数据库 schema 的变化 复制链接链接已复制到粘贴板!
您可以配置 Debezium Oracle 连接器来生成模式更改事件,这些事件描述了应用于数据库中捕获的表的结构更改。连接器将模式更改事件写入名为 < serverName>
; 的 Kafka 主题,其中 topicName
是 topic.prefix
配置属性中指定的命名空间。
每当从新表流传输数据时,Debezium 会将新消息发送到此主题。
连接器发送到 schema 更改主题的消息包含一个有效负载,也可以包含更改事件消息的 schema。模式更改事件消息的有效负载包括以下元素:
ddl
-
提供导致架构更改的 SQL
CREATE
、ALTER
或DROP
语句。 databaseName
-
将语句应用到的数据库的名称。
databaseName
的值充当 message 键。 tableChanges
-
模式更改后整个表架构的结构化表示。
tableChanges
字段包含一个数组,其中包含表中的每个列的条目。由于结构化表示以 JSON 或 Avro 格式呈现数据,因此用户可以轻松地读取消息,而无需首先通过 DDL 解析程序处理它们。
默认情况下,连接器使用 ALL_TABLES
数据库视图来识别存储在 schema 历史记录主题中的表名称。在这个视图中,连接器只能从连接到数据库的用户帐户可用的表访问数据。
您可以修改设置,以便 schema 历史记录主题存储不同的表子集。使用以下方法之一更改主题存储的表集合:
-
更改 Debezium 用于访问数据库的帐户的权限,以便在
ALL_TABLES
视图中看到不同的表集合。 -
将连接器属性
schema.history.internal.store.only.captured.tables.ddl
设置为true
。
当连接器配置为捕获表时,它会保存表架构的历史记录,不仅在架构更改主题中,也存储在内部数据库模式历史记录主题中。内部数据库架构历史记录主题仅用于连接器,它不用于直接使用应用程序。确保需要有关架构的通知的应用程序只消耗了该模式的更改主题的信息。
永不对数据库架构历史记录进行分区。要使数据库架构历史记录主题正常工作,它必须维护连接器向其发出的事件记录的一致性全局顺序。
要确保主题不在分区中分割,请使用以下方法之一为主题设置分区计数:
-
如果您手动创建数据库模式历史记录主题,请指定分区计数
1
。 -
如果您使用 Apache Kafka 代理自动创建数据库架构历史记录主题,则创建主题,将 Kafka
num.partitions
配置选项 的值设置为1
。
示例:向 Oracle 连接器 schema 更改主题发送的消息
以下示例显示了 JSON 格式的典型架构更改消息。消息包含表模式的逻辑表示。
项 | 字段名称 | 描述 |
---|---|---|
1 |
| 显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 在源对象中,ts_ms 表示数据库中更改的时间。通过将 payload.source.ts_ms 的值与 payload.ts_ms 的值进行比较,您可以确定源数据库更新和 Debezium 之间的滞后。 |
2 |
| 标识包含更改的数据库和 schema。 |
3 |
| 此字段包含负责架构更改的 DDL。 |
4 |
| 包含 DDL 命令生成的模式更改的一个或多个项目的数组。 |
5 |
|
描述更改的类型。
|
6 |
|
创建、更改或丢弃的表的完整标识符。对于表重命名,这个标识符是 < |
7 |
| 应用更改后代表表元数据。 |
8 |
| 编写表主密钥的列列表。 |
9 |
| 更改表中的每个列的元数据。 |
10 |
| 每个表更改的自定义属性元数据。 |
在连接器发送到 schema 更改主题的消息中,message 键是包含架构更改的数据库的名称。在以下示例中,payload
字段包含 databaseName
键:
6.1.4. Debezium Oracle 连接器生成的事件代表事务边界 复制链接链接已复制到粘贴板!
Debezium 可以生成代表事务元数据边界的事件,并增强数据更改事件消息。
Debezium 仅在部署连接器后为发生的事务注册并接收元数据。部署连接器前发生的事务元数据。
数据库事务由语句块表示,该块在 BEGIN
和 END
关键字之间括起。Debezium 为每个事务生成 BEGIN
和 END
分隔符的事务边界事件。事务边界事件包含以下字段:
status
-
BEGIN
或END
。 id
- 唯一事务标识符的字符串表示。
ts_ms
-
数据源上事务边界事件(
BEGIN
或END
事件)的时间。如果数据源没有向 Debezium 提供事件时间,则该字段代表 Debezium 处理事件的时间。 event_count
(用于END
事件)- 事务所设计的事件总数。
data_collections
(用于END
事件)-
data_collection
和event_count
元素的一组对,指示连接器为来自数据收集的更改发出的事件数。
以下示例显示了典型的事务边界信息:
示例:Oracle 连接器事务边界事件
除非通过 topic.transaction
选项覆盖,否则连接器会将事务事件发送到 < topic.prefix>
.transaction
主题。
6.1.4.1. Debezium Oracle 连接器如何通过事务元数据增强更改事件信息 复制链接链接已复制到粘贴板!
如果启用了事务元数据,数据消息 Envelope
会增加一个新的 transaction
字段。此字段以字段复合的形式提供有关每个事件的信息:
id
- 唯一事务标识符的字符串表示。
total_order
- 事件在事务生成的所有事件的绝对路径。
data_collection_order
- 事件在事务发送的所有事件中每个数据收集位置。
以下示例显示了典型的事务事件信息:
6.1.5. Debezium Oracle 连接器如何使用事件缓冲 复制链接链接已复制到粘贴板!
Oracle 按它们发生的顺序将所有更改写入 redo 日志,包括以后由回滚丢弃的更改。因此,来自不同事务的并发更改会被交集。当连接器首次读取更改流时,因为它无法立即决定提交或回滚哪些更改,它会临时将更改事件存储在内部缓冲区中。提交更改后,连接器会将更改事件从缓冲区写入 Kafka。连接器丢弃回滚所丢弃的更改事件。
您可以通过设置属性 log.mining.buffer.type
来配置连接器使用的缓冲机制。
heap
默认缓冲区类型使用 memory
进行配置。在默认 内存设置
下,连接器使用 JVM 进程的堆内存来分配和管理缓冲的事件记录。如果您使用 内存
缓冲区设置,请确保分配给 Java 进程的内存量可以容纳您环境中的长时间运行和大型事务。
6.1.6. Debezium Oracle 连接器如何检测 SCN 值中的差距 复制链接链接已复制到粘贴板!
当 Debezium Oracle 连接器配置为使用 LogMiner 时,它会使用基于系统更改号(SCN)的开始和结束范围从 Oracle 收集更改事件。连接器自动管理此范围,根据连接器是否可以在接近实时更改的情况下增加或减少范围,或者必须处理因为数据库中大型或批量事务卷导致更改的积压。
在某些情况下,Oracle 数据库以不高的数量为 SCN 加快 SCN,而不是以恒定率增加 SCN 值。SCN 值中的这个跳过可能会因为特定集成与数据库交互的方式发生,或者作为热备份等事件的结果。
Debezium Oracle 连接器依赖于以下配置属性来检测 SCN 差距并调整最小范围。
log.mining.scn.gap.detection.gap.size.min
- 指定最小差距大小。
log.mining.scn.gap.detection.time.interval.max.ms
- 指定最大时间间隔。
连接器首先比较当前 SCN 和当前最小范围内的最高 SCN 之间的更改数的不同。如果当前 SCN 值和最高 SCN 值之间的差别大于最小差距大小,那么连接器可能会检测到 SCN 差距。要确认是否存在差距,连接器 接下来比较当前 SCN 和之前最小范围末尾的 SCN 的时间戳。如果时间戳之间的区别小于最大时间间隔,则确认存在 SCN 差距。
当发生 SCN 差距时,Debezium 连接器会自动使用当前的 SCN 作为当前最小会话范围的端点。这允许连接器快速捕获实时事件,而不会在返回不小的范围的情况下快速捕获实时事件,因为 SCN 值被意外数字增加。当连接器执行前面的步骤以响应 SCN 差距时,它会忽略 log.mining.batch.size.max 属性指定的值。连接器完成 mining 会话并捕获到实时事件后,它会恢复最大日志减批处理大小的强制。
只有在连接器运行时发生大型 SCN 递增并处理接近实时事件时,SCN 差距检测才可用。
6.1.7. Debezium 如何管理数据库中不经常更改的偏移量 复制链接链接已复制到粘贴板!
Debezium Oracle 连接器跟踪连接器偏移中的系统更改号,以便在连接器重启时,它可以开始其停止位置。这些偏移是每个发出的更改事件的一部分;但是,当数据库更改的频率较低(几小时或天数)时,偏移可能会变得过时,并防止连接器在事务日志中不再提供系统更改数。
对于使用非CDB 模式连接到 Oracle 的连接器,您可以启用 heartbeat.interval.ms
来强制连接器定期发出心跳事件,以便偏移保持同步。
对于使用 CDB 模式连接到 Oracle 的连接器,维护同步更为复杂。不仅必须设置 heartbeat.interval.ms
,而且还需要设置 heartbeat.action.query
。需要指定这两个属性,因为在 CDB 模式中,连接器仅会专门跟踪 PDB 中的更改。需要补充机制才能从可插拔数据库内触发更改事件。定期间隔,心跳操作查询会导致连接器插入新表行,或更新可插拔数据库中的现有行。Debezium 会检测到表更改,并为它们发出更改事件,确保偏移保持同步,即使在处理经常更改的可插拔数据库中也是如此。
要使连接器使用 heartbeat.action.query
带有不是 连接器用户帐户 拥有的表,您必须授予连接器用户权限,以便在这些表上运行必要的 INSERT
或 UPDATE
查询。
6.2. Debezium Oracle 连接器数据更改事件的描述 复制链接链接已复制到粘贴板!
Oracle 连接器发出的每个数据更改事件都有一个键和值。键和值的结构取决于更改事件源自的表。有关 Debezium 如何构建主题名称的详情,请参考 主题名称。
Debezium Oracle 连接器确保所有 Kafka Connect 模式名称都 是有效的 Avro 模式名称。这意味着,逻辑服务器名称必须以字母字符或下划线([a-z,A-Z,_])以及逻辑服务器名称中的其余字符以及架构和表名称中的所有字符都必须是字母数字字符或下划线([a-z,A-Z,0-9,\_])。连接器自动将无效字符替换为下划线字符。
当多个逻辑服务器名称、模式名称或表名称之间的字符无效字符无效字符时,意外命名冲突可能会导致字符区分。
Debezium 和 Kafka Connect 围绕 事件消息的持续流 设计。但是,这些事件的结构可能会随时间而变化,这很难以处理主题。为便于处理可变事件结构,Kafka Connect 中的每个事件都是自我包含的。每个消息键和值有两个部分:schema 和 payload。schema 描述了有效负载的结构,而有效负载包含实际数据。
由 SYS
或 SYSTEM
用户帐户执行的更改不会被连接器捕获。
以下主题包含有关数据更改事件的更多详情:
6.2.1. 关于 Debezium Oracle 连接器更改事件中的键 复制链接链接已复制到粘贴板!
对于每个更改的表,更改事件键是结构化的,以便在事件创建事件时为表的主键(或唯一键约束)中有一个字段。
例如,在 inventory
数据库架构中定义的 客户
表可能有以下更改事件键:
如果 < topic.prefix&
gt;.transaction
配置属性的值设置为 server1
,则数据库表中的 customers
表中发生的每个更改事件的 JSON 表示具有以下键结构:
键的 schema
部分包含一个 Kafka Connect 模式,用于描述密钥部分的内容。在上例中,有效负载
值不是可选,其结构由名为 server1.DEBEZIUM.CUSTOMERS.Key
的 schema 定义,一个名为 id
的 name type int32
。键的 payload
字段的值表示它实际上是一个带有 id
字段的结构(在 JSON 中,是一个对象),其值为 1004
。
因此,您可以将这个键解释为 inventory.customers
表中的行(来自名为 server1
的连接器),其 id
主键列的值为 1004
。
6.2.2. 关于 Debezium Oracle 连接器更改事件中的值 复制链接链接已复制到粘贴板!
更改事件消息中的值结构反映了消息中 更改事件中的消息键 的结构,并且包含 schema 部分和 payload 部分。
更改事件值的有效负载
更改事件值的 payload 部分中的 envelope 结构包含以下字段:
op
-
包含描述操作类型的字符串值的必填字段。Oracle 连接器更改事件值有效负载中的
op
字段包含以下值之一:c
(创建或插入)、u
(update)、d
(delete)或r
(读,代表快照)。 之前
-
可选字段(如果存在)描述了事件 发生前 行的状态。该结构由
server1.INVENTORY.CUSTOMERS.Value
Kafka Connect 模式描述,server1
连接器用于inventory.customers
表中的所有行。
after
-
一个可选字段,如果存在,包含 更改后 行的状态。该结构由用于
before
字段的同一server1.INVENTORY.CUSTOMERS.Value
Kafka Connect 模式描述。 source
包含描述事件源元数据的结构的必填字段。如果是 Oracle 连接器,结构包括以下字段:
- Debezium 版本。
- 连接器名称。
- 事件是持续快照的一部分。
- 事务 ID (不包括快照)。
- 更改的 SCN。
- 指明源数据库中记录何时更改的时间戳(用于快照,时间戳指示快照何时发生)。
进行更改的用户名
提示commit_scn
字段是可选的,并描述了更改事件参与的事务提交的 SCN。
ts_ms
- 可选字段(如果存在)包含连接器处理事件的 JVM 中系统时钟的时间(基于系统时钟)。
更改事件值的 schema
事件消息值的 schema 部分包含一个 schema,用于描述有效负载的 envelope 结构及其中的嵌套字段。
有关更改事件值的更多信息,请参阅以下主题:
创建 事件
以下示例显示了 customers
表中的 create 事件值的值,如 更改事件键示例中所述 :
在上例中,注意事件如何定义以下模式:
-
envelope (
server1.DEBEZIUM.CUSTOMERS.Envelope
). -
源
结构(io.debezium.connector.oracle.Source
,它特定于 Oracle 连接器并在所有事件间重复使用。 -
用于
before
和after
字段的特定于表的模式。
before
和 after
字段的 schema 的名称的格式为 <logicalName>.<schemaName>.<tableName>.Value
, 因此完全独立与所有其他表的 schema。因此,当您使用 Avro converter 时,每个逻辑源中的表的 Avro 模式都有自己的演进和历史记录。
此事件值的 payload
部分提供有关事件的信息。它描述了创建了行(op=c
),并显示 after
字段值包含插入到行 ID
、FIRST_NAME
、LAST_NAME
和 EMAIL
列中的值。
默认情况下,事件的 JSON 表示大于它们描述的行。较大的大小是由 JSON 表示的,包括消息的 schema 和 payload 部分。您可以使用 Avro Converter 减少连接器写入 Kafka 主题的消息大小。
更新 事件
以下示例显示了连接器从上一次创建事件相同的表中的 更新 更改事件。
有效负载的结构与 创建 (插入)事件的有效负载相同,但以下值不同:
-
op
字段的值是u
,表示此行因为更新而改变。 -
before
字段显示行的前者状态,以及更新
数据库提交前存在的值。 -
after
字段显示行的更新状态,EMAIL
值现在设置为anne@example.com
。 -
source
字段的结构包含与之前相同的字段,但它们的值不同,因为连接器从红色日志中的不同位置捕获事件。 -
ts_ms
字段显示 Debezium 处理事件的时间戳。
payload
部分显示一些其他有用的信息。例如,通过比较 before
和 after
结构,我们可以确定在提交后如何更改行。源
结构提供有关 Oracle 在此变化记录相关的信息,从而提供了可追溯性。另外,当此事件与本主题和其它事件相关时,还会深入了解。它是否在与另一个事件相同的提交之前、之后或作为另一个事件的一部分发生?
更新行主/唯一键的列时,行键的值会改变。因此,Debezium 会在此类 更新后发出三个 事件:
-
DELETE
事件。 - 一个 tombstone 事件,带有行的旧键。
-
为行提供新密钥的
INSERT
事件。
删除 事件
以下示例显示了上一次 create 和 update 事件示例中显示的表的 delete 事件。delete 事件的 schema
部分与这些事件的 schema
部分相同。
与 create 或 update 事件相比,事件的 payload
部分显示了几个不同之处:
-
op
字段的值为d
,表示已删除该行。 -
before
字段显示数据库提交删除的行的前一个状态。 -
after
字段的值为null
,表示行不再存在。 -
source
字段的结构中包括了多个在 create 或 update 事件中存在的键, 但ts_ms
,scn
, 和txId
中的值不同。 -
ts_ms
显示指示 Debezium 处理此事件的时间戳。
删除 事件为消费者提供处理此行所需的信息。
Oracle 连接器的事件被设计为用于 Kafka 日志压缩,这样可允许删除一些旧的信息,只要每个键至少保留最新的消息。这允许 Kafka 在确保主题包含完整的数据集并可用于重新载入基于密钥的状态时回收存储空间。
删除行时,上例中显示的 delete 事件值仍可用于日志压缩,因为 Kafka 能够删除所有使用相同键的消息。message 值必须设置为 null
,以指示 Kafka 删除共享同一键的所有消息。为了实现此目的,默认情况下 Debezium 的 Oracle 连接器始终遵循一个 delete 事件,它有一个特殊的 tombstone 事件,其键相同但 null
值。您可以通过设置连接器属性 tombstones.on.delete
来改变默认的行为。
截断 事件
一个 截断 的更改事件信号,表示表已被截断。本例中 message 键为 null
,消息值类似如下:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
描述事件源元数据的必需字段。在 truncate 事件值中,
|
2 |
|
描述操作类型的强制字符串。 |
3 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。
|
由于 truncate 事件代表对整个表所做的更改,且没有消息键,且没有具有多个分区的主题,因此不能保证消费者收到 截断 事件和更改事件(创建、update 等等)用于表。例如,当消费者从不同分区读取事件时,可能会在收到同一表的 截断 事件后收到表 的更新 事件。只有在主题使用单个分区时,才可以保证排序。
如果您不想捕获 截断 的事件,请使用 skipped.operations
选项过滤它们。
6.3. Debezium Oracle 连接器如何映射数据类型 复制链接链接已复制到粘贴板!
当 Debezium Oracle 连接器检测到表行值的变化时,它会发出一个代表更改事件的更改事件。每个更改事件记录都与原始表相同,事件记录包含每个列值的字段。表列的数据类型决定了连接器在更改事件字段中代表列的值,如以下部分的表所示。
对于表中的每一列,Debebe 会将源数据类型映射到 字面类型,在某些情况下,在对应的事件字段中,一个 语义类型。
- 字面类型
-
描述如何代表值,使用以下 Kafka Connect 模式类型之一:
INT8
,INT16
,INT32
,INT64
,FLOAT32
,FLOAT64
,BOOLEAN
,STRING
,BYTES
, ARRAY,
MAP
, 和STRUCT
。 - 语义类型
- 描述 Kafka Connect 模式如何使用字段的名称来捕获字段 的含义。
如果默认数据类型转换无法满足您的需要,您可以为连接器 创建自定义转换器。
对于某些 Oracle 大对象(CLOB、NCLOB 和 BLOB)和数字数据类型,您可以通过更改默认配置属性设置来操作连接器执行类型映射的方式。有关 Debezium 属性如何控制这些数据类型映射的更多信息,请参阅 Binary 和 Character LOB 类型 和 Numeric 类型。
有关 Debezium 连接器如何映射 Oracle 数据类型的更多信息,请参阅以下主题:
字符类型
下表描述了连接器如何映射基本字符类型。
Oracle 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
使用带有 Debezium Oracle 连接器的 BLOB
、CLOB
和 NCLOB
只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的更多信息,请参阅 https://access.redhat.com/support/offerings/techpreview。
下表描述了连接器如何映射二进制和字符大型对象(LOB)数据类型。
Oracle 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
| 不适用 | 不支持此数据类型 |
|
|
raw 字节(默认)、base64 编码的字符串或 base64-url-safe-encoded String,或基于 |
|
| 不适用 |
| 不适用 | 不支持此数据类型。 |
| 不适用 | 不支持此数据类型。 |
|
| 不适用 |
| 不适用 | 不支持此数据类型。 |
如果 Oracle 在 SQL 语句中明确设置或更改,Oracle 只为 CLOB
、NCLOB
和 BLOB
数据类型提供列值。因此,更改事件永远不会包含未更改的 CLOB
、NCLOB
或 BLOB
列的值。相反,它们包含由 connector 属性 unavailable.value.placeholder
定义的占位符。
如果更新 CLOB
、NCLOB
或 BLOB
列的值,则新值将放置在相应更新更改事件的 after
元素中。before
元素包含不可用的值占位符。
数字类型
下表描述了 Debezium Oracle 连接器如何映射数字类型。
您可以通过更改连接器的 decimal.handling.mode 配置属性的值来修改连接器的 decimal.handling.mode
配置属性、NUMBER
、NUMERIC
和 REAL
数据类型的方法。当属性被设置为其
精确
的默认值时,连接器会将这些 Oracle 数据类型映射到 Kafka Connect org.apache.kafka.connect.data.Decimal
逻辑类型,如表所示。当属性的值设置为 double
或 string
时,连接器会对某些 Oracle 数据类型使用备用映射。如需更多信息,请参阅 下表中的 Semantic 类型和备注 列。
Oracle 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
| 不适用 |
|
| 不适用 |
|
|
当将
当将 |
|
|
|
|
|
|
|
|
|
|
|
当将
当将 |
|
|
缩放 0 的
当将
当将 |
|
|
|
|
|
当将
当将 |
|
|
|
|
|
当将
当将 |
如上所述,Oracle 允许 NUMBER
类型的负扩展。当数字表示为 Decimal
时,这可能会导致在转换为 Avro 格式时出现问题。十进制
类型包括缩放信息,但 Avro 规格 仅允许缩放的正值。根据所使用的模式 registry,可能会导致 Avro 序列化失败。要避免这个问题,您可以使用 NumberToZeroScaleConverter
,其将完全高的数字(P - S >= 19),负扩展为零)转换为 12 月类型。它可以配置如下:
converters=zero_scale zero_scale.type=io.debezium.connector.oracle.converters.NumberToZeroScaleConverter zero_scale.decimal.mode=precise
converters=zero_scale
zero_scale.type=io.debezium.connector.oracle.converters.NumberToZeroScaleConverter
zero_scale.decimal.mode=precise
默认情况下,数字转换为 Decimal
类型(zero_scale.decimal.mode=precise
),但支持完整的两种类型(双
和字符串
)。
布尔值类型
Oracle 不提供对 BOOLEAN
数据类型的原生支持。但是,常见的做法是使用具有某些语义的其他数据类型来模拟逻辑 BOOLEAN
数据类型的概念。
要允许您将源列转换为布尔值,Debezium 提供了一个 NumberOneToBooleanConverter
自定义转换器,您可以使用以下方法之一:
-
将所有
NUMBER (1)
列映射到BOOLEAN
类型。 使用以逗号分隔的正则表达式列表枚举列子集。
要使用这种转换,您必须使用selector
参数设置转换器
配置属性,如下例所示:converters=boolean boolean.type=io.debezium.connector.oracle.converters.NumberOneToBooleanConverter boolean.selector=.*MYTABLE.FLAG,.*.IS_ARCHIVED
converters=boolean boolean.type=io.debezium.connector.oracle.converters.NumberOneToBooleanConverter boolean.selector=.*MYTABLE.FLAG,.*.IS_ARCHIVED
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
临时类型
除 Oracle INTERVAL
、TIMESTAMP WITH TIME ZONE
和 TIMESTAMP WITH LOCAL TIME ZONE
数据类型外,连接器转换时类型取决于 time.precision.mode
配置属性的值。
当 time.precision.mode
配置属性被设置为 adaptive
(默认值),那么连接器根据列的数据类型定义决定 temporal 类型的字面和语义类型,以便事件 完全 表示数据库中的值:
Oracle 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
当 time.precision.mode
配置属性设为 connect
时,连接器会使用预定义的 Kafka Connect 逻辑类型。当消费者只了解内置的 Kafka Connect 逻辑类型且无法处理变量精度时间值时,这非常有用。由于 Oracle 支持的精度级别超过 Kafka Connect 支持中的逻辑类型,如果您设置了 time.precision.mode
来连接
,因此当数据库列的 fractional second precision 值大于 3 时,会丢失精度结果:
Oracle 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ROWID 类型
下表描述了连接器如何映射 ROWID (箭头地址)数据类型。
Oracle 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
| 不适用 |
| 不适用 | 不支持此数据类型。 |
用户定义的类型
Oracle 可让您定义自定义数据类型,以便在内置数据类型不满足您的要求时提供灵活性。有几种用户定义的类型,如对象类型、REF 数据类型、Varray 和 Nested Tables。目前,您不能使用带有任何这些用户定义的类型的 Debezium Oracle 连接器。
Oracle 提供的类型
Oracle 提供基于 SQL 的接口,您可以在内置或 ANSI 支持的类型不足时用来定义新类型。Oracle 提供多种常用的数据类型来满足各种目的,如 Any、XML 或 Spatial 类型。目前,您不能将 Debezium Oracle 连接器与任何这些数据类型一起使用。
默认值
如果为数据库模式中的列指定了默认值,Oracle 连接器会尝试将这个值传播到对应的 Kafka record 字段的 schema。最常见的数据类型都被支持,包括:
-
字符类型(
CHAR
,NCHAR
,VARCHAR
,VARCHAR2
,NVARCHAR
,NVARCHAR2
) -
数字类型(
INTEGER
、NUMERIC
等) -
临时类型(
DATE
、TIMESTAMP
、INTERVAL
等)
如果临时类型使用 TO_TIMESTAMP
或 TO_DATE
等函数调用来代表默认值,则连接器将通过进行额外的数据库调用来评估函数来解决默认值。例如,如果 DATE
列定义为默认值 TO_DATE ('2021-01-02', 'YYYY-MM-DD')
,则该列的默认值将是自该日期的 UNIX 日期或 18629
起的天数。
如果临时类型使用 SYSDATE
常量来代表默认值,则连接器将根据是否定义为 NOT NULL
还是 NULL
来解决此问题。如果列可为空,则不会设置默认值;但是,如果列不可为空,则默认值将解析为 0
(用于 DATE
或 TIMESTAMP(n)
数据类型)或 1970-01-01T00:00:00Z
(用于 TIMESTAMP WITH TIME ZONE
或 TIMESTAMP WITH LOCAL TIME ZONE
数据类型)。默认值类型是数字,除非列是 TIMESTAMP WITH TIME ZONE
或 TIMESTAMP WITH LOCAL TIME ZONE
,在这种情况下,它作为字符串发出。
6.4. 设置 Oracle 以使用 Debezium 复制链接链接已复制到粘贴板!
设置 Oracle 以用于 Debezium Oracle 连接器需要以下步骤。这些步骤假定将多租户配置与容器数据库和至少一个可插拔数据库一起使用。如果您不打算使用多租户配置,则可能需要调整以下步骤。
有关设置 Oracle 以用于 Debezium 连接器的详情,请查看以下部分:
6.4.1. Debezium Oracle 连接器与 Oracle 安装类型的兼容性 复制链接链接已复制到粘贴板!
Oracle 数据库可以作为独立实例安装,也可以使用 Oracle Real Application Cluster (RAC)安装。Debezium Oracle 连接器与两种类型的安装兼容。
6.4.2. 在捕获更改事件时 Debezium Oracle 连接器排除的模式 复制链接链接已复制到粘贴板!
当 Debezium Oracle 连接器捕获表时,它会自动排除以下模式的表:
-
appqossys
-
audsys
-
ctxsys
-
dvsys
-
dbsfwuser
-
dbsnmp
-
qsmadmin_internal
-
lbacsys
-
mdsys
-
ojvmsys
-
olapsys
-
orddata
-
ordsys
-
outln
-
sys
-
system
-
wmsys
-
xdb
要启用连接器从表中捕获更改,表必须使用没有在上列表中命名的模式。
6.4.3. 在捕获更改事件时 Debezium Oracle 连接器排除的表 复制链接链接已复制到粘贴板!
当 Debezium Oracle 连接器捕获表时,它会自动排除与以下规则匹配的表:
-
压缩与模式
CMP[3|4\":\"[0-9]+
匹配的 Advisor 表。 -
与
SYS_IOT_OVER_%
模式匹配的索引组织表。 -
spatial 表与模式
MDRT_%
、MDRS_%
或MDXT_%
匹配。 - 嵌套表
要启用连接器捕获带有与上述规则匹配的名称的表,您必须重命名表。
6.4.4. 准备 Oracle 数据库以用于 Debezium 复制链接链接已复制到粘贴板!
Oracle LogMiner 所需的配置
Oracle AWS RDS 不允许执行上述命令,也不允许您以 sysdba 身份登录。AWS 提供这些替代命令来配置 LogMiner。在执行这些命令前,请确保您的 Oracle AWS RDS 实例启用了备份。
要确认 Oracle 启用了备份,请首先执行以下命令。LOG_MODE 应说 ARCHIVELOG。如果没有,您可能需要重启 Oracle AWS RDS 实例。
Oracle AWS RDS LogMiner 所需的配置
SQL> SELECT LOG_MODE FROM V$DATABASE; LOG_MODE ------------ ARCHIVELOG
SQL> SELECT LOG_MODE FROM V$DATABASE;
LOG_MODE
------------
ARCHIVELOG
LOG_MODE 设置为 ARCHIVELOG 后,执行命令以完成 LogMiner 配置。第一个命令将数据库设置为 archivelogs,第二个命令会添加补充日志记录。
Oracle AWS RDS LogMiner 所需的配置
exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',24); exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',24);
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
要让 Debezium 捕获更改数据库行之前的状态,还必须为捕获的表或整个数据库启用附件日志记录。以下示例演示了如何为单个 inventory.customers
表中的所有列配置附件日志记录。
ALTER TABLE inventory.customers ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
ALTER TABLE inventory.customers ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
为所有表列启用附件日志记录会增加 Oracle redo 日志的卷。要防止日志大小的过度增长,请选择性地应用前面的配置。
在数据库级别必须启用最小补充日志记录,并可配置如下:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
6.4.5. 调整 Oracle redo 日志的大小,以适应数据字典 复制链接链接已复制到粘贴板!
根据数据库配置,红色日志的大小和数量可能不足以达到可接受的性能。设置 Debezium Oracle 连接器前,请确保 redo 日志的容量足以支持数据库。
数据库的红色日志的容量必须足够,才能存储其数据字典。通常,数据字典的大小随着数据库中表和列的数量而增加。如果 redo 日志没有足够的容量,数据库和 Debezium 连接器可能会遇到性能问题。
请咨询您的数据库管理员,评估数据库是否需要提高日志容量。
6.4.6. 为 Debezium Oracle 连接器创建 Oracle 用户 复制链接链接已复制到粘贴板!
要使 Debezium Oracle 连接器捕获更改事件,必须以具有特定权限的 Oracle LogMiner 用户身份运行。以下示例显示了在多租户数据库模型中为连接器创建 Oracle 用户帐户的 SQL。
连接器捕获了其自身 Oracle 用户帐户进行的数据库更改。但是,它不会捕获 SYS
或 SYSTEM
用户帐户所做的更改。
创建连接器的 LogMiner 用户
项 | 角色名称 | 描述 |
---|---|---|
1 | 创建会话 | 启用连接器连接到 Oracle。 |
2 | 设置容器 | 启用连接器在可插拔数据库间切换。这只有在 Oracle 安装启用了容器数据库支持(CDB)时才需要。 |
3 | SELECT ON V_$DATABASE |
启用连接器读取 |
4 | FLASHBACK ANY TABLE | 启用连接器来执行闪存查询,这是连接器如何执行数据的初始快照。 |
5 | 选择任何表 | 启用连接器读取任何表。 |
6 | SELECT_CATALOG_ROLE | 启用连接器读取 Oracle LogMiner 会话所需的数据字典。 |
7 | EXECUTE_CATALOG_ROLE | 启用连接器将数据字典写入 Oracle redo 日志,该日志需要跟踪架构更改。 |
8 | 选择任何事务 |
启用快照进程对任何事务执行闪存快照查询。当授予 |
9 | LOGMINING | 这个角色被添加到较新的 Oracle 版本中,以授予 Oracle LogMiner 及其软件包的完整访问权限。在没有此角色的旧版本 Oracle 中,您可以忽略此授权。 |
10 | 创建表 | 启用连接器在其默认表空间中创建其冲刷表。flush 表允许连接器明确控制将 LGWR 内部缓冲刷新到磁盘。 |
11 | 锁定任何表 | 启用连接器在模式快照过程中锁定表。如果通过配置显式禁用快照锁定,则可以安全地忽略此授权。 |
12 | 创建序列 | 启用连接器在其默认表空间中创建序列。 |
13 | EXECUTE ON DBMS_LOGMNR |
启用连接器在 |
14 | EXECUTE ON DBMS_LOGMNR_D |
启用连接器在 |
15 到 23 | SELECT ON V_$…. | 启用连接器读取这些表。连接器必须能够读取 Oracle redo 和 archive 日志的信息,以及当前事务状态,以准备 Oracle LogMiner 会话。如果没有这些授予,连接器就无法操作。 |
6.4.7. 支持 Oracle 备用数据库 复制链接链接已复制到粘贴板!
Debezium Oracle 连接器不能用于 Oracle 物理或者逻辑备用数据库。
6.5. 部署 Debezium Oracle 连接器 复制链接链接已复制到粘贴板!
您可以使用以下任一方法部署 Debezium Oracle 连接器:
由于许可要求,Debebe Oracle 连接器存档不包括连接器连接到 Oracle 数据库的 Oracle JDBC 驱动程序。要启用连接器访问数据库,您必须将驱动程序添加到连接器环境中。如需更多信息,请参阅 获取 Oracle JDBC 驱动程序。
6.5.1. 获取 Oracle JDBC 驱动程序 复制链接链接已复制到粘贴板!
由于许可要求,Debezium 连接到 Oracle 数据库所需的 Oracle JDBC 驱动程序文件不包含在 Debezium Oracle 连接器存档中。驱动程序可从 Maven Central 下载。根据您使用的部署方法,您可以通过向 Kafka Connect 自定义资源或您用来构建连接器镜像的 Dockerfile 来检索驱动程序。
-
如果您使用 AMQ Streams 将连接器添加到 Kafka Connect 镜像中,请将驱动程序的 Maven Central 位置添加到
KafkaConnect
自定义资源的builds.plugins.artifact.url
中,如 第 6.5.3 节 “使用 AMQ Streams 部署 Debezium Oracle 连接器” 所示。 -
如果您使用 Dockerfile 为连接器构建容器镜像,请在 Dockerfile 中插入
curl
命令以指定从 Maven Central 下载所需驱动程序文件的 URL。如需更多信息,请参阅 通过从 Dockerfile 构建自定义 Kafka Connect 容器镜像来部署 Debezium Oracle 连接器。
6.5.2. 使用 AMQ Streams 部署 Debezium Oracle 连接器 复制链接链接已复制到粘贴板!
从 Debezium 1.7 开始,部署 Debezium 连接器的首选方法是使用 AMQ Streams 来构建包含连接器插件的 Kafka Connect 容器镜像。
在部署过程中,您可以创建并使用以下自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR,并包含有关镜像中需要包含连接器工件的信息。 -
提供连接器用来访问源数据库的信息的
KafkaConnector
CR。在 AMQ Streams 启动 Kafka Connect pod 后,您可以通过应用KafkaConnector
CR 来启动连接器。
在 Kafka Connect 镜像的构建规格中,您可以指定可用于部署的连接器。对于每个连接器插件,您还可以指定您的部署可以使用的其他组件。例如,您可以添加 Apicurio Registry 工件或 Debezium 脚本组件。当 AMQ Streams 构建 Kafka Connect 镜像时,它会下载指定的工件,并将其合并到镜像中。
KafkaConnect
CR 中的 spec.build.output
参数指定存储生成的 Kafka Connect 容器镜像的位置。容器镜像可以存储在 Docker registry 中,也可以存储在 OpenShift ImageStream 中。要将镜像存储在 ImageStream 中,您必须先创建 ImageStream,然后才能部署 Kafka Connect。镜像流不会被自动创建。
如果使用 KafkaConnect
资源创建集群,之后您无法使用 Kafka Connect REST API 创建或更新连接器。您仍然可以使用 REST API 来检索信息。
其他资源
- 在 OpenShift 上使用 AMQ Streams 配置 Kafka 连接。
- 在 OpenShift 中部署和升级 AMQ Streams 中的使用 AMQ Streams 自动创建新容器镜像。
6.5.3. 使用 AMQ Streams 部署 Debezium Oracle 连接器 复制链接链接已复制到粘贴板!
使用早期版本的 AMQ Streams 时,要在 OpenShift 上部署 Debezium 连接器,首先需要为连接器构建 Kafka Connect 镜像。在 OpenShift 上部署连接器的当前首选的方法是使用 AMQ Streams 中的构建配置来自动构建 Kafka Connect 容器镜像,其中包含您要使用的 Debezium 连接器插件。
在构建过程中,AMQ Streams Operator 会将 KafkaConnect
自定义资源中的输入参数(包括 Debezium 连接器定义)转换为 Kafka Connect 容器镜像。构建从 Red Hat Maven 存储库或其他配置的 HTTP 服务器下载必要的工件。
新创建的容器被推送到 .spec.build.output
中指定的容器 registry,用于部署 Kafka Connect 集群。AMQ Streams 构建 Kafka Connect 镜像后,您可以创建 KafkaConnector
自定义资源来启动构建中包含的连接器。
先决条件
- 您可以访问安装了集群 Operator 的 OpenShift 集群。
- AMQ Streams Operator 正在运行。
- 部署 Apache Kafka 集群,如在 OpenShift 中部署和升级 AMQ Streams 所述。
- Kafka Connect 部署在 AMQ Streams 上
- 您有红帽构建的 Debezium 许可证。
-
已安装 OpenShift
oc
CLI 客户端,或者您可以访问 OpenShift Container Platform Web 控制台。 根据您要存储 Kafka Connect 构建镜像的方式,您需要 registry 权限或您必须创建 ImageStream 资源:
- 要将构建镜像存储在镜像 registry 中,如 Red Hat Quay.io 或 Docker Hub
- 在 registry 中创建和管理镜像的帐户和权限。
- 将构建镜像存储为原生 OpenShift ImageStream
- ImageStream 资源已部署到集群中,以存储新的容器镜像。您必须为集群明确创建 ImageStream。镜像流默认不可用。如需有关 ImageStreams 的更多信息,请参阅在 OpenShift Container Platform 上管理镜像流。
流程
- 登录 OpenShift 集群。
为连接器创建 Debezium
KafkaConnect
自定义资源(CR),或修改现有的资源。例如,创建一个名为dbz-connect.yaml
的KafkaConnect
CR,用于指定metadata.annotations
和spec.build
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
例 6.1.
dbz-connect.yaml
文件,该文件定义包含 Debezium 连接器的KafkaConnect
自定义资源在以下示例中,自定义资源被配置为下载以下工件:
- Debezium Oracle 连接器存档。
- 红帽构建的 Apicurio Registry 存档。Apicurio Registry 是一个可选组件。只有在打算在连接器中使用 Avro 序列化时,才添加 Apicurio Registry 组件。
- Debezium 脚本 SMT 归档以及您要与 Debezium 连接器一起使用的相关语言依赖项。SMT 归档和语言依赖项是可选组件。只有在打算使用 Debezium 是 基于内容的路由 SMT 或 过滤 SMT 时,才添加这些组件。
- Oracle JDBC 驱动程序需要连接到 Oracle 数据库,但不包含在连接器存档中。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 6.12. Kafka Connect 配置设置的描述 项 描述 1
将
strimzi.io/use-connector-resources
注解设置为"true"
,以便 Cluster Operator 使用KafkaConnector
资源在此 Kafka Connect 集群中配置连接器。2
spec.build
配置指定构建镜像的位置,并列出要在镜像中包含的插件,以及插件工件的位置。3
build.output
指定存储新构建镜像的 registry。4
指定镜像输出的名称和镜像名称。
output.type
的有效值是docker
,可推送到容器 registry,如 Docker Hub 或 Quay,或将镜像推送到内部 OpenShift ImageStream的镜像流
。要使用 ImageStream,必须将 ImageStream 资源部署到集群中。有关在 KafkaConnect 配置中指定build.output
的更多信息,请参阅在 OpenShift 中配置 AMQ Streams 中的 AMQ Streams Build schema 参考。5
插件配置
列出了您要包含在 Kafka Connect 镜像中的所有连接器。对于列表中的每个条目,指定一个插件名称
,以及有关构建连接器所需的工件的信息。另外,对于每个连接器插件,您还可以包含您要与连接器一起使用的其他组件。例如,您可以添加 Service Registry 工件或 Debezium 脚本组件。6
artifacts.type
的值指定artifacts.url
中指定的工件的文件类型。有效类型是zip
、tgz
或jar
。Debezium 连接器存档以.zip
文件格式提供。JDBC 驱动程序文件采用.jar
格式。type
值必须与url
字段中引用的文件类型匹配。7
artifacts.url
的值指定 HTTP 服务器的地址,如 Maven 存储库,用于存储连接器工件的文件。Debezium 连接器工件位于 Red Hat Maven 存储库中。OpenShift 集群必须有权访问指定的服务器。8
(可选)指定用于下载 Apicurio Registry 组件的工件
类型和
url
。包括 Apicurio Registry 工件,只有在您希望连接器使用 Apache Avro 与 Red Hat build of Apicurio Registry 序列化事件键和值时,而不是使用默认的 JSON converter。9
(可选)指定 Debezium 脚本 SMT 归档的工件
类型和
url
,以用于 Debezium 连接器。只有在打算使用 Debezium 基于内容的路由 SMT 或 过滤 SMT 时使用脚本 SMT 时,才包含脚本 SMT,您必须部署 JSR 223 兼容脚本实施,如 groovy。10
(可选)为 JSR 223 兼容脚本实现的 JAR 文件指定工件
类型和
url
,这是 Debezium 脚本 SMT 所需的。重要如果您使用 AMQ Streams 将连接器插件合并到 Kafka Connect 镜像中,每个所需脚本语言组件
artifacts.url
必须指定 JAR 文件的位置,而artifacts.type
的值还必须设置为jar
。无效的值会导致连接器在运行时失败。要启用使用带有脚本 SMT 的 Apache Groovy 语言,示例中的自定义资源会检索以下库的 JAR 文件:
-
groovy
-
Groovy-jsr223
(协调代理) -
Groovy-json
(用于解析 JSON 字符串的模块)
Debezium 脚本 SMT 还支持使用 GraalVM JavaScript 的 JSR 223 实现。
11
指定 Maven Central 中 Oracle JDBC 驱动程序的位置。所需驱动程序不包括在 Debezium Oracle 连接器存档中。
输入以下命令将
KafkaConnect
构建规格应用到 OpenShift 集群:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据自定义资源中指定的配置,Streams Operator 会准备要部署的 Kafka Connect 镜像。
构建完成后,Operator 将镜像推送到指定的 registry 或 ImageStream,并启动 Kafka Connect 集群。您配置中列出的连接器工件在集群中可用。创建一个
KafkaConnector
资源来定义您要部署的每个连接器的实例。
例如,创建以下KafkaConnector
CR,并将它保存为oracle-inventory-connector.yaml
例 6.2. 为 Debezium 连接器定义
KafkaConnector
自定义资源的 Oracle-inventory-connector.yaml
文件Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 6.13. 连接器配置设置的描述 项 描述 1
使用 Kafka Connect 集群注册的连接器名称。
2
连接器类的名称。
3
可同时运行的任务数量。
4
连接器的配置。
5
主机数据库实例的地址。
6
数据库实例的端口号。
7
Debezium 用于连接到数据库的帐户名称。
8
Debezium 用于连接到数据库用户帐户的密码。
9
要从中捕获更改的数据库名称。
10
数据库实例或集群的主题前缀。
指定的名称只能从字母数字字符或下划线括起。
由于主题前缀用作从这个连接器接收更改事件的任何 Kafka 主题的前缀,所以名称必须在集群中的连接器之间唯一。
此命名空间也用于相关的 Kafka Connect 模式的名称,如果您将连接器与 Avro 连接器集成,则对应的 Avro 模式的命名空间也用于。11
连接器从中捕获更改事件的表列表。
运行以下命令来创建连接器资源:
oc create -n <namespace> -f <kafkaConnector>.yaml
oc create -n <namespace> -f <kafkaConnector>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc create -n debezium -f {context}-inventory-connector.yaml
oc create -n debezium -f {context}-inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 连接器注册到 Kafka Connect 集群,并开始针对
KafkaConnector
CR 中的spec.config.database.dbname
指定的数据库运行。连接器 pod 就绪后,Debezium 正在运行。
您现在已准备好 验证 Debezium Oracle 部署。
要部署 Debezium Oracle 连接器,您必须构建包含 Debezium 连接器存档的自定义 Kafka Connect 容器镜像,然后将此容器镜像推送到容器 registry。然后,您需要创建以下自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR。CR 中的image
属性指定您创建用来运行 Debezium 连接器的容器镜像的名称。您可以将此 CR 应用到部署了 Red Hat AMQ Streams 的 OpenShift 实例。AMQ Streams 提供将 Apache Kafka 引入到 OpenShift 的 operator 和镜像。 -
定义 Debezium Oracle 连接器的
KafkaConnector
CR。将此 CR 应用到应用KafkaConnect
CR 的同一 OpenShift 实例。
先决条件
- Oracle 数据库正在运行,您完成了 设置 Oracle 以用于 Debezium 连接器 的步骤。
- AMQ Streams 部署在 OpenShift 上,并运行 Apache Kafka 和 Kafka Connect。如需更多信息,请参阅在 OpenShift 中部署和升级 AMQ Streams
- podman 或 Docker 已安装。
-
您有在容器 registry 中创建和管理容器(如
quay.io
或docker.io
)的帐户和权限,您要向其添加将运行 Debezium 连接器的容器。 Kafka Connect 服务器有权访问 Maven Central,以便为 Oracle 下载所需的 JDBC 驱动程序。您还可以使用驱动程序的本地副本,或者从本地 Maven 存储库或其他 HTTP 服务器提供。
如需更多信息,请参阅 获取 Oracle JDBC 驱动程序。
流程
为 Kafka Connect 创建 Debezium Oracle 容器:
创建一个 Dockerfile,它使用
registry.redhat.io/amq7/amq-streams-kafka-32-rhel8:2.2.0-12
作为基础镜像。例如,在终端窗口中输入以下命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
您可以指定您想要的任何文件名。
2
指定 Kafka Connect 插件目录的路径。如果您的 Kafka Connect 插件目录位于不同的位置,请将这个路径替换为您的目录的实际路径。
该命令在当前目录中创建一个名为
debezium-container-for-oracle.yaml
的 Dockerfile。从您在上一步中创建的
debezium-container-for-oracle.yaml
Docker 文件中构建容器镜像。在包含该文件的目录中,打开终端窗口并输入以下命令之一:podman build -t debezium-container-for-oracle:latest .
podman build -t debezium-container-for-oracle:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker build -t debezium-container-for-oracle:latest .
docker build -t debezium-container-for-oracle:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述命令使用名称
debezium-container-for-oracle
构建容器镜像。将自定义镜像推送到容器 registry,如 quay.io 或内部容器 registry。容器 registry 必须可供部署镜像的 OpenShift 实例使用。输入以下命令之一:
podman push <myregistry.io>/debezium-container-for-oracle:latest
podman push <myregistry.io>/debezium-container-for-oracle:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker push <myregistry.io>/debezium-container-for-oracle:latest
docker push <myregistry.io>/debezium-container-for-oracle:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建新的 Debezium Oracle KafkaConnect 自定义资源(CR)。例如,创建一个名为
dbz-connect.yaml
的KafkaConnect
CR,用于指定注解和
镜像
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
metadata.annotations
表示KafkaConnector
资源用于配置在这个 Kafka Connect 集群中使用的 Cluster Operator。2
spec.image
指定您为运行 Debezium 连接器而创建的镜像名称。此属性覆盖 Cluster Operator 中的STRIMZI_DEFAULT_KAFKA_CONNECT_IMAGE
变量。输入以下命令将
KafkaConnect
CR 应用到 OpenShift Kafka Connect 环境:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令添加一个 Kafka Connect 实例,用于指定您为运行 Debezium 连接器而创建的镜像名称。
创建一个
KafkaConnector
自定义资源来配置 Debezium Oracle 连接器实例。您可以在
.yaml
文件中配置 Debezium Oracle 连接器,该文件指定连接器的配置属性。连接器配置可能会指示 Debezium 为 schema 和表的子集生成事件,或者可能会设置属性,以便 Debezium 忽略敏感、太大或不需要的指定栏中的值。以下示例配置了一个 Debezium 连接器,该连接器连接到 Oracle 主机 IP 地址,在端口
1521
上。此主机有一个名为ORCLCDB
的数据库,server1
是服务器的逻辑名称。Oracle
inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 6.14. 连接器配置设置的描述 项 描述 1
在将连接器注册到 Kafka Connect 服务时,它的名称。
2
此 Oracle 连接器类的名称。
3
Oracle 实例的地址。
4
Oracle 实例的端口号。
5
Oracle 用户的名称,如 为连接器创建用户。
6
Oracle 用户的密码,如 为连接器创建用户。
7
要从中捕获更改的数据库名称。
8
连接器从中捕获更改的 Oracle 可插拔数据库的名称。仅用于容器数据库(CDB)安装。
9
主题前缀标识并提供连接器从中捕获更改的 Oracle 数据库服务器的命名空间。
10
此连接器用来将 DDL 语句写入数据库架构历史记录主题的 Kafka 代理列表。
11
连接器写入和恢复 DDL 语句的数据库架构历史记录主题的名称。本主题仅用于内部使用,不应供消费者使用。
使用 Kafka Connect 创建连接器实例。例如,如果您将
KafkaConnector
资源保存到inventory-connector.yaml
文件中,您将运行以下命令:oc apply -f inventory-connector.yaml
oc apply -f inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述命令注册
inventory-connector
,连接器开始针对KafkaConnector
CR 中定义的server1
数据库运行。
有关您可以为 Debezium Oracle 连接器设置的配置属性的完整列表,请参阅 Oracle 连接器属性。
结果
连接器启动后,它会对配置了连接器的 Oracle 数据库 执行一致的快照。然后,连接器开始为行级操作生成数据更改事件,并将更改事件记录流传输到 Kafka 主题。
6.5.5. 配置容器数据库和非容器数据库 复制链接链接已复制到粘贴板!
Oracle 数据库支持以下部署类型:
- 容器数据库(CDB)
- 包含多个可插拔数据库(PDB)的数据库。数据库客户端连接到每个 PDB,就像它是一个标准的非CDB 数据库一样。
- 非容器数据库(非 CDB)
- 标准 Oracle 数据库,它不支持创建可插拔数据库。
6.5.6. 验证 Debezium Oracle 连接器是否正在运行 复制链接链接已复制到粘贴板!
如果连接器正确启动且没有错误,它会为每个连接器配置为捕获的表创建一个主题。下游应用程序可以订阅这些主题以检索源数据库中发生的信息事件。
要验证连接器是否正在运行,您可以从 OpenShift Container Platform Web 控制台或 OpenShift CLI 工具(oc)执行以下操作:
- 验证连接器状态。
- 验证连接器是否生成主题。
- 验证主题是否填充了每个表初始快照过程中生成的读操作("op":"r")的事件。
先决条件
- Debezium 连接器部署到 OpenShift 上的 AMQ Streams。
-
已安装 OpenShift
oc
CLI 客户端。 - 访问 OpenShift Container Platform web 控制台。
流程
使用以下方法之一检查
KafkaConnector
资源的状态:在 OpenShift Container Platform Web 控制台中:
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 以打开 Select Resource 复选框,然后键入
KafkaConnector
。 - 在 KafkaConnectors 列表中,点您要检查的连接器的名称,如 inventory-connector-oracle。
- 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc describe KafkaConnector <connector-name> -n <project>
oc describe KafkaConnector <connector-name> -n <project>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc describe KafkaConnector inventory-connector-oracle -n debezium
oc describe KafkaConnector inventory-connector-oracle -n debezium
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 6.3.
KafkaConnector
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证连接器是否已创建 Kafka 主题:
通过 OpenShift Container Platform Web 控制台。
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 打开 Select Resource 复选框,然后键入
KafkaTopic
。 -
在 KafkaTopics 列表中,点您要检查的主题的名称,例如
inventory-connector-oracle.inventory.orders--ac5e98ac6a5d91e04d8ec0dc9078a1ece439081d
。 - 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc get kafkatopics
oc get kafkatopics
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 6.4.
KafkaTopic
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
检查主题内容。
- 在终端窗口中输入以下命令:
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-oracle.inventory.products_on_hand
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-oracle.inventory.products_on_hand
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定主题名称的格式与
oc describe
命令的格式在第 1 步中返回,例如inventory-connector-oracle.inventory.addresses
。对于主题中的每个事件,命令会返回类似以下输出的信息:
例 6.5. Debezium 更改事件的内容
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-oracle.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-oracle.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-oracle.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.oracle.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-oracle.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"oracle","name":"inventory-connector-oracle","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"oracle-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-oracle.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-oracle.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-oracle.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.oracle.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-oracle.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"oracle","name":"inventory-connector-oracle","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"oracle-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,
有效负载
值显示连接器快照从表inventory.products_on_hand
中生成一个读取("op" ="r"
)事件。product_id
记录的"before"
状态为null
,这表示记录没有之前的值。"after"
状态对于product_id
为101
的项目的quantity
显示为3
。
6.6. Debezium Oracle 连接器配置属性的描述 复制链接链接已复制到粘贴板!
Debezium Oracle 连接器有许多配置属性,您可以使用它们来实现应用程序的正确连接器行为。许多属性具有默认值。有关属性的信息按如下方式进行组织:
- 所需的 Debezium Oracle 连接器配置属性
数据库架构历史记录配置属性,用于控制 Debezium 如何处理从数据库架构历史记录主题读取的事件。
- 控制 数据库驱动程序行为的直通数据库驱动程序属性。
所需的 Debezium Oracle 连接器配置属性
除非默认值可用 , 否则需要以下配置属性。
属性 | 默认 | 描述 |
没有默认值 | 连接器的唯一名称。尝试再次使用相同的名称注册将失败。(所有 Kafka Connect 连接器都需要此属性。) | |
没有默认值 |
连接器的 Java 类的名称。对于 Oracle 连接器,始终使用 | |
没有默认值 |
枚举连接器可以使用 的自定义转换器 实例的符号名称的逗号分隔列表。
对于您为连接器配置的每个转换器,还必须添加一个
例如, boolean.type: io.debezium.connector.oracle.converters.NumberOneToBooleanConverter
如果要进一步控制配置的转换器的行为,您可以添加一个或多个配置参数将值传递给转换器。要将任何其他配置参数与转换器关联,请将参数名称与转换器的符号链接名称添加前缀。 boolean.selector: .*MYTABLE.FLAG,.*.IS_ARCHIVED
| |
| 为此连接器创建的最大任务数量。Oracle 连接器始终使用单个任务,因此不要使用这个值,因此始终可以接受默认值。 | |
没有默认值 | Oracle 数据库服务器的 IP 地址或主机名。 | |
没有默认值 | Oracle 数据库服务器的整数端口号。 | |
没有默认值 | 连接器用于连接 Oracle 数据库服务器的 Oracle 用户帐户的名称。 | |
没有默认值 | 连接到 Oracle 数据库服务器时要使用的密码。 | |
没有默认值 | 要连接的数据库的名称。使用 CDB + PDB 模型时,必须是 CDB 名称。 | |
没有默认值 | 指定原始数据库 JDBC URL。使用此属性提供定义数据库连接的灵活性。有效值包括原始 TNS 名称和 RAC 连接字符串。 | |
没有默认值 | 要连接的 Oracle 可插拔数据库的名称。仅将此属性用于容器数据库(CDB)安装。 | |
没有默认值 |
为连接器从中捕获更改的 Oracle 数据库服务器提供命名空间的主题前缀。您设置的值用作连接器发出的所有 Kafka 主题名称的前缀。指定 Debezium 环境中所有连接器的唯一主题前缀。以下字符有效:字母数字字符、连字符、句点和下划线。 警告 不要更改此属性的值。如果您更改了 name 值,重启后,而不是继续向原始主题发出事件,连接器会将后续事件发送到名称基于新值的主题。连接器也无法恢复其数据库架构历史记录主题。 | |
|
连接器在流数据库更改时使用的适配器实现。您可以设置以下值: | |
Initial | 指定连接器用来获取捕获表快照的模式。您可以设置以下值:
快照完成后,连接器将继续从数据库的红色日志读取更改事件,除非
如需更多信息,请参阅 | |
shared | 控制连接器保存表锁定的时长。表锁定可防止连接器执行快照时发生某些类型的更改表操作。您可以设置以下值:
| |
|
一个可选的、以逗号分隔的正则表达式列表,与表的完全限定名称(< 要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
没有默认值 | 指定要包含在快照中的表行。如果您希望快照仅在表中包括行的子集,请使用此属性。此属性仅影响快照。它不适用于连接器从日志中读取的事件。
属性包含一个以逗号分隔的表名称列表,格式为 <
在包含 soft-delete 列 "snapshot.select.statement.overrides": "customer.orders", "snapshot.select.statement.overrides.customer.orders": "SELECT * FROM [customers].[orders] WHERE delete_flag = 0 ORDER BY id DESC"
在生成的快照中,连接器仅包含 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与您要 捕获更改的模式的名称匹配。只有 POSIX 正则表达式有效。任何未包含在 schema.
要匹配架构的名称,Debezium 应用您指定的正则表达式,以 替代 的正则表达式。也就是说,指定的表达式与模式的整个名称字符串匹配,它与 schema 名称中可能存在的子字符串不匹配。 | |
| 指定连接器是否应该解析和发布元数据对象上的表和列注释的布尔值。启用此选项会对内存用量造成影响。逻辑架构对象的数量和大小严重影响 Debezium 连接器消耗的内存量,并为每一个字符串添加潜在的大型字符串数据可能非常昂贵。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与 您不想 捕获更改的模式的名称匹配。只有 POSIX 正则表达式有效。任何名称没有包含在 schema.
要匹配架构的名称,Debezium 应用您指定的正则表达式,以 替代 的正则表达式。也就是说,指定的表达式与模式的整个名称字符串匹配,它与 schema 名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的正则表达式列表,与要捕获的表的完全限定表标识符匹配。只有 POSIX 正则表达式有效。当设置此属性时,连接器只从指定的表中捕获更改。每个表标识符都使用以下格式:
要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的正则表达式列表,与要从监控中排除的表的完全限定表标识符匹配。只有 POSIX 正则表达式有效。连接器从排除列表中指定的任何表中捕获更改事件。使用以下格式为每个表指定标识符:
要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与更改事件消息值中包含的列的完全限定名称匹配。只有 POSIX 正则表达式有效。列的完全限定域名使用以下格式:
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配,它与列名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与您要从更改事件消息值中排除的列的完全限定名称匹配。只有 POSIX 正则表达式有效。完全限定列名称使用以下格式:
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配,它与列名称中可能存在的子字符串不匹配。 | |
| 不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。列的完全限定域名格式为
一个 pseudonym,它包括了通过应用指定的 hashAlgorithm 和 salt 的结果的哈希值。根据使用的 hash 功能,会维护引用完整性,而列值则替换为伪nyms。支持的哈希功能在 Java Cryptography 架构标准算法名称文档中的 MessageDigest 部分 进行了描述。 column.mask.hash.SHA-256.with.salt.CzQMA0cB5K = inventory.orders.customerName, inventory.shipment.customerName
如有必要,伪的nym 会自动缩短到列的长度。连接器配置可以包含多个指定不同哈希算法和 salt 的属性。 |
bytes |
指定二进制( | |
none |
指定如何调整架构名称,以便与连接器使用的消息转换器兼容。可能的设置:
| |
|
指定连接器如何处理
| |
|
指定连接器应该如何处理 | |
| 指定连接器在处理事件时应如何响应异常。您可以设置以下选项之一:
| |
| 一个正整数值,用于指定每个连接器迭代期间要处理的事件的最大大小。 | |
|
正整数值,用于指定阻塞队列可以保存的最大记录数。当 Debezium 从数据库读取事件时,它会将事件放置在阻塞队列中,然后再将它们写入 Kafka。当连接器将消息写入 Kafka 或 Kafka 不可用时,阻塞队列可以提供从数据库读取更改事件的后端。当连接器定期记录偏移时,队列中保存的事件会被忽略。始终将 | |
|
较长的整数值,指定块队列的最大卷(以字节为单位)。默认情况下,不会为阻塞队列指定卷限制。要指定队列可以使用的字节数,请将此属性设置为正长值。 | |
| 正整数值,用于指定连接器在每次迭代期间应该等待的毫秒数,以便显示新的更改事件。 | |
| 控制 删除 事件是否随后是 tombstone 事件。可能会有以下值:
删除源记录后,tombstone 事件(默认行为)可让 Kafka 完全删除启用了 日志压缩的主题中已删除行键的所有事件。 | |
没有默认值 | 指定连接器用来组成自定义消息键的表达式列表,以更改它发布到指定表的 Kafka 主题的事件记录。
默认情况下,Debezium 使用表的主键列作为它发出的记录的消息键。对于缺少主密钥的表,或者指定缺少主密钥的表的密钥,您可以根据一个或多个列配置自定义消息密钥。 | |
没有默认值 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。如果您希望连接器屏蔽一组列的值,例如,如果它们包含敏感数据,则设置此属性。将
列的完全限定域名会观察以下格式:< 您可以在单个配置中指定多个长度不同的属性。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,用于更改事件消息中的掩码列名称,方法是用星号替换字符(DSL)。 | |
没有默认值 | 可选的、以逗号分隔的正则表达式列表,它与您希望连接器发送代表列元数据的完全限定名称匹配。当设置此属性时,连接器会将以下字段添加到事件记录的架构中:
这些参数分别传播列的原始类型和长度(用于变量带宽类型)。
列的完全限定域名会观察以下格式之一:< | |
没有默认值 | 可选的、以逗号分隔的正则表达式列表,用于指定为数据库列定义的数据类型的完全限定名称。当设置此属性时,对于具有匹配数据类型的列,连接器会发出事件记录,该记录在 schema 中包含以下额外字段:
这些参数分别传播列的原始类型和长度(用于变量带宽类型)。
列的完全限定域名会观察以下格式之一:< 有关特定于 Oracle 的数据类型名称的列表,请查看 Oracle 数据类型映射。 | |
|
以毫秒为单位指定连接器发送消息的频率。 | |
没有默认值 |
指定连接器发送心跳消息时连接器在源数据库上执行的查询。 设置此属性并创建一个心跳表来接收心跳消息,以解决 Debezium 无法同步与高流量数据库 相同的主机上的偏移量。连接器将记录插入到配置的表中后,它可以从低流量数据库接收更改,并确认数据库中的 SCN 更改,以便偏移可与代理同步。 | |
没有默认值 |
指定连接器在创建快照前等待的时间(毫秒)。 | |
| 指定在进行快照时应从一个表中读取的最大行数。连接器以指定大小的多个批处理读取表内容。 | |
没有默认值 | 指定在给定查询的每个数据库往返时将获取的行数。默认为 JDBC 驱动程序的默认获取大小。 | |
当连接器配置明确指定使用 Avro 的 | 指定字段名称是否规范化,以符合 Avro 命名要求。如需更多信息,请参阅 Avro 命名。 | |
|
如果您希望 Debezium 生成带有事务边界的事件,并使用事务元数据增强数据事件,则将属性设置为 如需了解更多详细信息,请参阅事务元数据。 | |
|
指定最小策略,用于控制 Oracle LogMiner 构建和使用给定数据字典解析表和列 ids to name。 | |
|
缓冲区类型控制连接器如何管理缓冲区事务数据。 | |
|
在使用新会话前,LogMiner 会话可以处于活跃状态的最大毫秒数。 | |
| 此连接器尝试从 redo/archive 日志中读取的最小 SCN 间隔大小。活跃批处理大小也会根据需要增加/减少这个数量,以便调整连接器吞吐量。 | |
| 此连接器从 redo/archive 日志读取时使用的最大 SCN 间隔大小。 | |
| 连接器用于从 redo/archive 日志中读取数据的起始 SCN 间隔大小。这也服务器是调整批处理大小的方法 - 当当前 SCN 和批处理开始/结束 SCN 之间的区别大于这个值时,批处理大小会增加/降低。 | |
| 从 redo/archive 日志读取数据后连接器休眠的最短时间,并在重新读取数据前开始读取数据。值以毫秒为单位。 | |
| 连接器在从 redo/archive 日志读取数据后的最大时间,并在重新读取数据前开始读取数据。值以毫秒为单位。 | |
| 连接器在从 redo/archive 日志读取数据后休眠的时间,并在重新读取数据前开始读取数据。值以毫秒为单位。 | |
| 连接器在从 logminer 读取数据时用于调整最佳睡眠时间的最大时间。值以毫秒为单位。 | |
|
过去的小时数从 SYSDATE 到 mine 归档日志。当使用默认设置( | |
|
控制连接器是否从归档日志或在线 redo 日志和归档日志(默认)的组合中减去更改。 | |
|
连接器在轮询之间休眠的毫秒数,以确定启动系统更改号是否在归档日志中。如果没有启用 | |
|
正整数值,用于指定在 redo 日志交换机之间保留长时间运行的事务的小时数。当设置为 LogMiner 适配器维护所有正在运行的事务的内存缓冲。因为所有作为事务一部分的 DML 操作都会被缓冲,直到检测到提交或回滚,所以应该避免长时间运行的事务来溢出该缓冲区。任何超过此配置值的事务都会完全丢弃,连接器不会为属于事务的操作发出任何消息。 | |
没有默认值 |
指定在使用 LogMiner 最小归档日志时要使用的 Oracle 归档目的地。 | |
没有默认值 | 要从 LogMiner 查询中排除的数据库用户列表。如果您希望捕获过程始终排除特定用户所做的更改,则设置此属性非常有用。 | |
|
指定连接器与当前和之前的 SCN 值之间的区别进行比较的值,以确定是否存在 SCN 差距。如果 SCN 值之间的区别大于指定的值,且时间差大于 | |
|
指定一个值(以毫秒为单位),连接器与当前和之前的 SCN 时间戳之间的区别进行比较,以确定是否存在 SCN 差距。如果时间戳之间的区别小于指定的值,并且 SCN delta 大于 | |
|
控制是否在更改事件时发送大型对象(CLOB 或 BLOB)列值。 注意 使用大型对象数据类型是一个技术预览功能。 | |
| 指定连接器提供的常量,以指示原始值保持不变,且不由数据库提供。 | |
没有默认值 | 以逗号分隔的 Oracle Real Application Clusters (RAC)节点主机名或地址列表。需要此字段才能与 Oracle RAC 部署兼容。 使用以下方法之一指定 RAC 节点列表:
如果您使用 | |
| 您希望连接器在流期间跳过的操作类型的逗号分隔列表。您可以配置连接器来跳过以下类型的操作:
默认情况下,仅跳过截断操作。 | |
没有默认值 |
用于向连接器发送信号的数据收集的完全限定名称。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#debezium-signaling-enabling-signaling当您将此属性与 Oracle 可插拔数据库(PDB)搭配使用时,将其值设为 root 数据库的名称。 | |
| 连接器在增量快照块期间获取并读取内存的最大行数。增加块大小可提高效率,因为快照会运行更大的快照查询。但是,较大的块大小还需要更多内存来缓冲快照数据。将块大小调整为在您的环境中提供最佳性能的值。 | |
|
应该用来决定数据更改的主题名称、模式更改、事务、心跳事件等的 TopicNamingStrategy 类的名称,默认为 | |
|
指定主题名称的分隔符,默认为 | |
| 用于在绑定并发哈希映射中保存主题名称的大小。此缓存有助于确定与给定数据收集对应的主题名称。 | |
|
控制连接器向发送心跳消息的主题名称。主题名称具有此模式: | |
|
控制连接器向发送事务元数据消息的主题名称。主题名称具有此模式: |
Debezium Oracle 连接器数据库模式历史记录配置属性
Debezium 提供了一组 schema.history.internal114
属性,用于控制连接器如何与 schema 历史记录主题交互。
下表描述了用于配置 Debezium 连接器的 schema.history.internal
属性。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 | 连接器存储数据库架构历史记录的 Kafka 主题的完整名称。 | |
没有默认值 | 连接器用来建立到 Kafka 集群的初始连接的主机/端口对列表。此连接用于检索之前由连接器存储的数据库架构历史记录,并编写从源数据库读取的每个 DDL 语句。每个对都应该指向 Kafka Connect 进程使用的相同 Kafka 集群。 | |
| 整数值,用于指定连接器在轮询保留数据时应该等待的最大毫秒数。默认值为 100ms。 | |
| 指定连接器在使用 Kafka admin 客户端获取集群信息时应等待的最大毫秒数。 | |
| 指定连接器在使用 Kafka admin 客户端创建 kafka 历史记录主题时应等待的最大毫秒数。 | |
|
连接器在连接器恢复失败前读取保留历史记录数据的次数上限。在收到数据后等待的最长时间为 | |
|
指定连接器是否应该忽略不正确的或未知数据库语句或停止处理等布尔值,以便人可以解决这个问题。安全默认值为 | |
|
指定连接器是否应该记录所有 DDL 语句的布尔值
安全默认值为 |
直通数据库模式历史记录属性,用于配置制作者和消费者客户端
Debezium 依赖于 Kafka producer 将模式更改写入数据库架构历史记录主题。同样,它依赖于 Kafka 使用者在连接器启动时从数据库 schema 历史记录主题中读取。您可以通过将值分配给以 schema.history.internal.consumer 前缀开头的一组直通配置属性来定义 Kafka producer
和 消费者
客户端的配置。直通制作者和消费者数据库模式历史记录属性控制一系列行为,如这些客户端如何与 Kafka 代理安全连接,如下例所示:
Debezium 在将属性传递给 Kafka 客户端之前,从属性名称中分离前缀。
如需有关 Kafka producer 配置属性和 Kafka 使用者配置属性的更多详情,请参阅 Kafka 文档。
Debezium Oracle 连接器直通数据库驱动程序配置属性
Debezium 连接器为数据库驱动程序的透传配置提供。直通数据库属性以前缀 驱动程序 开头
。例如,连接器将 driver.foobar=false
等属性传递给 JDBC URL。
与 数据库架构历史记录客户端的直通属性 一样,Debebe 会将属性中的前缀从属性分离,然后再将它们传递给数据库驱动程序。
6.7. 监控 Debezium Oracle 连接器性能 复制链接链接已复制到粘贴板!
除了对 Apache Zookeeper、Apache Kafka 和 Kafka Connect 的 JMX 指标的内置支持外,Debezium Oracle 连接器还提供三种指标类型。
有关如何通过 JMX 公开这些指标的详细信息,请参阅监控 文档。
6.7.1. Debezium Oracle 连接器快照指标 复制链接链接已复制到粘贴板!
MBean 是 debezium.oracle:type=connector-metrics,context=snapshot,server= <oracle.server.name>
。
除非快照操作处于活跃状态,否则快照指标不会被公开,或者快照自上次连接器启动后发生。
下表列出了可用的 shapshot 指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个快照事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器从上次启动或重置后看到的事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 包括在快照中的表的总数。 | |
| 快照要复制的表数。 | |
| 快照是否启动。 | |
| 快照是否暂停。 | |
| 快照是否中止。 | |
| 快照是否完成。 | |
| 快照目前花费的秒数,即使未完成也是如此。还包括快照暂停时的时间。 | |
| 快照暂停的秒数。如果快照暂停多次,则暂停的时间会增加。 | |
| 包含快照中每个表扫描的行数的映射。表在处理期间逐步添加到映射中。更新每个 10,000 行扫描,并在完成表后更新。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
在执行增量快照时,连接器还提供以下额外快照指标:
6.7.2. Debezium Oracle 连接器流指标 复制链接链接已复制到粘贴板!
MBean 是 debezium.oracle:type=connector-metrics,context=streaming,server= <oracle.server.name>
。
下表列出了可用的流指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个流事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器自上次开始或指标重置以来看到的事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的创建事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的更新事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的删除事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 表示连接器当前是否连接到数据库服务器的标记。 | |
| 最后一次更改事件时间戳和连接器处理之间毫秒的数量。该值将限制运行数据库服务器和连接器的机器上时钟之间的差别。 | |
| 已提交的已处理的事务数量。 | |
| 最后一次接收的事件的协调。 | |
| 最后一次处理的事务的事务标识符。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
Debezium Oracle 连接器还提供以下额外的流指标:
属性 | 类型 | 描述 |
---|---|---|
| 已处理的最新系统更改号。 | |
| 事务缓冲区中最旧的系统更改数。 | |
| 最后提交的系统会更改事务缓冲区中的数字。 | |
| 系统更改号当前写入连接器的偏移量。 | |
| 当前被设置的日志文件的数组。 | |
| 为任何 LogMiner 会话指定的最小日志数。 | |
| 为任何 LogMiner 会话指定的最大日志数。 | |
|
每个最小日志文件的当前状态数组,格式为 | |
| 数据库在最后一天执行日志交换机的次数。 | |
| 最后一次 LogMiner 会话查询中观察到的 DML 操作数量。 | |
| 处理单个 LogMiner 会话查询时观察到的最大 DML 操作数。 | |
| 观察到 DML 操作总数。 | |
| 执行的 LogMiner 会话查询(也称为批处理)的总数。 | |
| 最后一次 LogMiner 会话查询的持续时间,以毫秒为单位获取。 | |
| 任何 LogMiner 会话查询的最长持续时间(以毫秒为单位)。 | |
| 处理最后的 LogMiner 查询批处理持续时间会导致毫秒。 | |
| 解析 DML 事件 SQL 语句的时间(毫秒)。 | |
| 启动最后一次 LogMiner 会话的时间(毫秒)。 | |
| 启动 LogMiner 会话的最长时间(毫秒)。 | |
| 连接器启动 LogMiner 会话所消耗的总持续时间(毫秒)。 | |
| 来自单个 LogMiner 会话的处理结果的最短持续时间(毫秒)。 | |
| 来自单个 LogMiner 会话的处理结果的最大持续时间(毫秒)。 | |
| 来自 LogMiner 会话的处理结果的总持续时间(毫秒)。 | |
| JDBC 驱动程序从日志最小视图获取下一个行所花费的总持续时间(毫秒)。 | |
| 在所有会话中的日志最小视图中处理的行总数。 | |
| 日志减去每个数据库往返查询所获取的条目数。 | |
| 从日志 mining 视图获取另一批处理结果前,连接器睡眠的毫秒。 | |
| 从日志减视图处理的最大行/秒数。 | |
| 从日志减上处理的平均行/秒数。 | |
| 从最后一个批处理的日志最小视图中处理的平均行/秒数。 | |
| 检测到的连接问题数量。 | |
|
连接器的内存中缓冲区保留的小时数,而不在丢弃前提交或回滚。如需了解更多详细信息,请参阅 | |
| 事务缓冲区中当前活动事务的数量。 | |
| 事务缓冲区中的提交事务数量。 | |
| 事务缓冲区中回滚事务的数量。 | |
| 事务缓冲区中每秒提交事务的平均数量。 | |
| 事务缓冲区中注册的 DML 操作数量。 | |
| 在事务日志中发生变化及其添加到事务缓冲区时的时间差,以毫秒为单位。 | |
| 当在事务日志中发生更改时以及添加到事务缓冲区时之间的最大时间差(以毫秒为单位)。 | |
| 当在事务日志中发生更改时以及添加到事务缓冲区时,最小时间差(毫秒)。 | |
|
最近加带的事务标识符的数组会因为其年龄从事务缓冲区中删除。详情请参阅 | |
| 已最小化并回滚事务缓冲区中的最新事务标识符的数组。 | |
| 最后一次事务缓冲区提交操作的持续时间,以毫秒为单位。 | |
| 最长事务缓冲区提交操作的持续时间,以毫秒为单位。 | |
| 检测到的错误数量。 | |
| 检测到的警告数量。 | |
|
系统更改号被检查的时间,并保持不变。高值表示长时间运行的事务正在持续,并阻止连接器将最近处理的系统更改号刷新到连接器的偏移量。当条件最佳时,该值应接近或等于 | |
|
已检测到但无法通过 DDL 解析解析器解析的 DDL 记录数量。这应该始终为 | |
| 当前最小会话的用户全局区域(UGA)内存消耗(以字节为单位)。 | |
| 在所有最小会话中,最大最小会话的用户全局区域(UGA)内存消耗(以字节为单位)。 | |
| 当前最小会话的进程全局区域(PGA)内存消耗(以字节为单位)。 | |
| 最大最小会话的进程全局区域(PGA)内存消耗(以字节为单位)。 |
6.7.3. Debezium Oracle 连接器模式历史记录指标 复制链接链接已复制到粘贴板!
MBean 是 debezium.oracle:type=connector-metrics,context=schema-history,server= <oracle.server.name>
。
下表列出了可用的模式历史记录指标。
属性 | 类型 | 描述 |
---|---|---|
|
| |
| 恢复开始的时间(以 epoch 秒为单位)。 | |
| 恢复阶段读取的更改数量。 | |
| 恢复和运行时应用的架构更改总数。 | |
| 从历史记录存储中恢复自上次更改以来的毫秒数。 | |
| 从上次更改被应用后经过的毫秒数。 | |
| 从历史记录存储中恢复最后一次更改的字符串表示。 | |
| 最后一次应用的更改的字符串表示。 |
6.8. Oracle 连接器常见问题 复制链接链接已复制到粘贴板!
- Oracle 11g 是否受支持?
- 不支持 Oracle 11g,但是,我们以最佳的方式与 Oracle 11g 向后兼容。我们依赖社区与 Oracle 11g 通信兼容性,并在识别回归时提供程序错误修复。
- 是否弃用 Oracle LogMiner?
- 否,Oracle 在 Oracle 12c 中只弃用了 Oracle LogMiner 的持续最小选项,并删除从 Oracle 19c 开始的选项。Debezium Oracle 连接器不依赖于这个选项才能正常工作,因此可以安全地用于较新的 Oracle 版本,而不影响。
- 如何更改偏移中的位置?
Debezium Oracle 连接器在偏移中维护两个关键值,即名为
scn
的字段,另一个名为commit_scn
。scn
字段是一个字符串,代表捕获更改时使用的连接器的低水位开始位置。-
找到包含连接器偏移的主题名称。这根据设为
offset.storage.topic
配置属性的值进行配置。 找到连接器的最后一个偏移量,在其中存储的密钥并标识用于存储偏移的分区。这可以通过 Kafka 代理安装提供的
kafkacat
工具脚本来完成。一个示例可能类似如下:kafkacat -b localhost -C -t my_connect_offsets -f 'Partition(%p) %k %s\n' Partition(11) ["inventory-connector",{"server":"server1"}] {"scn":"324567897", "commit_scn":"324567897: 0x2832343233323:1"}
kafkacat -b localhost -C -t my_connect_offsets -f 'Partition(%p) %k %s\n' Partition(11) ["inventory-connector",{"server":"server1"}] {"scn":"324567897", "commit_scn":"324567897: 0x2832343233323:1"}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow inventory-connector
的键是["inventory-connector",{"server":"server1"}]
,分区是11
,最后一个偏移是 key 的内容。要回到以前的偏移量,应该停止连接器,且必须发出以下命令:
echo '["inventory-connector",{"server":"server1"}]|{"scn":"3245675000","commit_scn":"324567500"}' | \ kafkacat -P -b localhost -t my_connect_offsets -K \| -p 11
echo '["inventory-connector",{"server":"server1"}]|{"scn":"3245675000","commit_scn":"324567500"}' | \ kafkacat -P -b localhost -t my_connect_offsets -K \| -p 11
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会写入
my_connect_offsets
的分区11
,主题给定的键和偏移值。在这个示例中,我们将连接器重新遍历回 SCN3245675000
而不是324567897
。
-
找到包含连接器偏移的主题名称。这根据设为
- 如果连接器无法找到给定偏移 SCN 的日志,则会出现什么情况?
Debezium 连接器在连接器偏移中维护低和高 - 水位线 SCN 值。低水位线 SCN 代表启动位置,必须存在于可用的在线红色或归档日志中,以便连接器成功启动。当连接器报告它无法找到这个偏移 SCN 时,这表示仍然可用的日志不包含 SCN,因此连接器无法从其中停止更改。
发生这种情况时,有两个选项。首先是删除连接器的历史记录主题和偏移量,并重启连接器,如建议进行新的快照。这将保证不会给任何主题用户发生数据丢失。第二个是手动操作偏移,将 SCN 贡献红色或存档日志中可用的位置。这会导致旧 SCN 值和新提供的 SCN 值间发生的更改丢失且不写入主题。不建议这样做。
- 不同最小策略之间的区别是什么?
Debezium Oracle 连接器为
log.mining.strategy
提供了两个选项。默认值为
redo_in_catalog
,这指示连接器在每次检测到日志交换机时将 Oracle 数据字典写入 redo 日志。对于 Oracle LogMiner,在解析红色和归档日志时,需要此数据字典来跟踪架构更改。这个选项将生成超过常见的归档日志数,但允许实时操作表,而不影响捕获数据更改。这个选项通常需要更多 Oracle 数据库内存,并会导致 Oracle LogMiner 会话和进程在每个日志交换机后启动稍长的时间。替代选项
online_catalog
不会将数据字典写入红色日志。相反,Oracle LogMiner 始终使用包含表结构当前状态的在线数据字典。这也意味着,如果表的结构改变,且不再与在线数据字典匹配,如果表的结构改变,Oracle LogMiner 将无法解析表或列名称。如果捕获的表经常更改,则不应使用此减策略选项。务必要确保所有数据更改都被架构更改锁定,以便所有更改都已从表的日志捕获,停止连接器,应用模式更改,然后重新启动连接器并在表中恢复数据更改。这个选项需要较少的 Oracle 数据库内存和 Oracle LogMiner 会话,因为数据字典不需要由 LogMiner 进程加载或控制。- 为什么 SYS 或 SYSTEM 用户没有捕获的变化?
-
Oracle 数据库使用
SYS
和SYSTEM
用户帐户在 redo 日志中执行多内部操作,这对更改数据捕获并不重要。当 Debezium Oracle 连接器从 Oracle LogMiner 读取更改时,由这两个用户帐户所做的更改会自动过滤掉。因此,如果您使用这两个用户帐户之一且没有看到更改事件,这就是为什么不会捕获这些用户所做的更改。您应该使用指定的非系统用户帐户来执行您要捕获的所有更改。 - 为什么连接器会出现在 AWS 上停止捕获更改的原因?
由于 AWS 网关 Load Balancer 上的固定闲置超时 350 秒,需要超过 350 秒的 JDBC 调用可能会无限期挂起。
如果调用 Oracle LogMiner API 需要超过 350 秒才能完成,可以触发超时,从而导致 AWS 网关负载均衡器挂起。例如,当 LogMiner 会话处理与 Oracle 的定期检查点任务同时运行大量数据时,可能会发生此类超时。
要防止 AWS 网关负载均衡器上发生超时,请启用来自 Kafka Connect 环境的 keep-alive 数据包,以 root 或超级用户执行以下步骤:
在终端中运行以下命令:
sysctl -w net.ipv4.tcp_keepalive_time=60
sysctl -w net.ipv4.tcp_keepalive_time=60
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑
/etc/sysctl.conf
并设置以下变量的值,如下所示:net.ipv4.tcp_keepalive_time=60
net.ipv4.tcp_keepalive_time=60
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新配置 Oracle 连接器的 Debezium 以使用
database.url
属性而不是database.hostname
,并添加(ENABLE=broken)
Oracle 连接字符串描述符,如下例所示:database.url=jdbc:oracle:thin:username/password!@(DESCRIPTION=(ENABLE=broken)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=hostname)(Port=port)))(CONNECT_DATA=(SERVICE_NAME=serviceName)))
database.url=jdbc:oracle:thin:username/password!@(DESCRIPTION=(ENABLE=broken)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=hostname)(Port=port)))(CONNECT_DATA=(SERVICE_NAME=serviceName)))
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
前面的步骤将 TCP 网络堆栈配置为每 60 秒发送 keep-alive 数据包。因此,当 JDBC 对 LogMiner API 调用完成的时间超过 350 秒时,AWS Gateway Load Balancer 不会超时,以便连接器继续从数据库的事务日志中读取更改。
- ORA-01555 的原因以及如何处理它?
当初始快照阶段执行时,Debezium Oracle 连接器使用闪存查询。闪存查询是一种特殊类型的查询,它依赖于闪存区域,由数据库的
UNDO_RETENTION
数据库参数维护,根据表内容在给定时间或给定 SCN 时返回查询的结果。默认情况下,Oracle 通常仅维护大约 15 分钟的撤销或闪存区域,除非数据库管理员已增加或减少。对于捕获大型表的配置,可能需要超过 15 分钟或您配置的UNDO_RETENTION
执行初始快照,这会导致这个异常:ORA-01555: snapshot too old: rollback segment number 12345 with name "_SYSSMU11_1234567890$" too small
ORA-01555: snapshot too old: rollback segment number 12345 with name "_SYSSMU11_1234567890$" too small
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 处理此例外的第一个方法是与数据库管理员合作,并查看它们是否可以临时增加
UNDO_RETENTION
数据库参数。这不需要重启 Oracle 数据库,因此可以在不影响数据库可用性的情况下在线完成此操作。但是,如果表空间没有足够空间来存储必要的撤销数据,则更改可能仍然会导致上述异常或"快照太老"异常。处理此异常的第二个方法是完全依赖初始快照,将
snapshot.mode
设置为schema_only
,然后依赖增量快照。增量快照不依赖于闪存查询,因此不会受到 ORA-01555 异常。- ORA-04036 的原因以及如何处理它?
当数据库更改时,Debebe Oracle 连接器可能会报告 ORA-04036 异常。Oracle LogMiner 会话启动并重新使用,直到检测到日志交换机为止。会话被重新使用,因为它为 Oracle LogMiner 提供最佳性能利用率,但应该发生长时间运行的最小会话,这可能会导致过量 PGA 内存用量,从而导致以下例外:
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过指定 Oracle 切换 redo 日志的频率或 Debezium Oracle 连接器可以重复使用最小的会话,来避免此异常。Debezium Oracle 连接器提供了一个配置选项
log.mining.session.max.ms
,它控制当前 Oracle LogMiner 会话在关闭和新会话启动前可以重新使用多久。这允许数据库资源保持检查,而不超过数据库允许的 PGA 内存。- ORA-01882 的原因以及如何处理它?
在连接到 Oracle 数据库时,Debebe Oracle 连接器可能会报告以下异常:
ORA-01882: timezone region not found
ORA-01882: timezone region not found
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当 JDBC 驱动程序无法正确解析时区信息时会出现这种情况。为了解决这个问题,需要告知驱动程序不使用区域解析时区详情。这可以通过使用 driver.
oracle.jdbc.timezoneAsRegion=false 指定驱动程序
通过属性来实现。- ORA-25191 的原因以及如何处理它?
Debezium Oracle 连接器自动忽略索引组织化表(IOT),因为它们不被 Oracle LogMiner 支持。但是,如果抛出 ORA-25191 异常,这可能是因为此类映射的唯一情况,并且可能需要额外规则来自动排除这些异常。ORA-25191 异常示例可能类似如下:
ORA-25191: cannot reference overflow table of an index-organized table
ORA-25191: cannot reference overflow table of an index-organized table
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果抛出 ORA-25191 异常,请引发一个 JIRA 问题,其中包含有关表的详细信息,以及映射、与其他父表相关的映射等。作为临时解决方案,可以调整 include/exclude 配置选项,以防止连接器访问此类表。
第 7 章 PostgreSQL 的 Debezium 连接器 复制链接链接已复制到粘贴板!
Debezium PostgreSQL 连接器捕获 PostgreSQL 数据库的架构中的行级更改。有关与连接器兼容的 PostgreSQL 版本的详情,请参考 Debezium 支持的配置页面。
第一次连接到 PostgreSQL 服务器或集群时,连接器会获取所有模式的一致性快照。完成该快照后,连接器会持续捕获插入、更新和删除数据库内容并提交到 PostgreSQL 数据库的行级更改。连接器生成数据更改事件记录,并将其流传输到 Kafka 主题。对于每个表,默认行为是连接器将所有生成的事件流传输到那个表的独立 Kafka 主题。应用程序和服务消耗该主题中的数据更改事件记录。
使用 Debezium PostgreSQL 连接器的信息和流程进行组织,如下所示:
- 第 7.1 节 “Debezium PostgreSQL 连接器概述”
- 第 7.2 节 “Debezium PostgreSQL 连接器的工作方式”
- 第 7.3 节 “Debezium PostgreSQL 连接器数据更改事件的描述”
- 第 7.4 节 “Debezium PostgreSQL 连接器如何映射数据类型”
- 第 7.5 节 “设置 PostgreSQL 以运行 Debezium 连接器”
- 第 7.6 节 “部署 Debezium PostgreSQL 连接器”
- 第 7.7 节 “监控 Debezium PostgreSQL 连接器性能”
- 第 7.8 节 “Debezium PostgreSQL 连接器如何处理错误和问题”
7.1. Debezium PostgreSQL 连接器概述 复制链接链接已复制到粘贴板!
PostgreSQL 的逻辑解码 功能在版本 9.4 中引进。这是一个机制,允许提取提交到事务日志的更改,以及通过 输出插件 的帮助以用户友好的方式处理这些更改。output 插件可让客户端消耗更改。
PostgreSQL 连接器包含两个主要部分,它们一起用于读取和处理数据库更改:
连接器会为捕获的每行级别的插入、更新和删除操作生成更改事件,并在单独的 Kafka 主题中为每个表发送更改事件记录。客户端应用程序读取与感兴趣的数据库表对应的 Kafka 主题,并可响应他们从这些主题收到的每行级事件。
PostgreSQL 通常会在一段时间后清除 write-ahead 日志(WAL)片段。这意味着连接器没有对数据库所做的任何更改的完整历史记录。因此,当 PostgreSQL 连接器第一次连接到特定的 PostgreSQL 数据库时,它首先会对每个数据库模式执行 一致的快照。连接器完成快照后,它会继续从进行快照的确切点进行更改。这样,连接器从所有数据的一致性视图开始,且不会省略执行快照时所做的任何更改。
连接器可以容错失败。当连接器读取更改并生成事件时,它会记录每个事件的 WAL 位置。如果连接器因任何原因而停止(包括通信失败、网络问题或崩溃),重启连接器将继续读取最后一次关闭的 WAL。这包括快照。如果连接器在快照过程中停止,连接器会在重启时开始一个新的快照。
连接器依赖于并反映 PostgreSQL 逻辑解码功能,它有以下限制:
- 逻辑解码不支持 DDL 更改。这意味着连接器无法向消费者报告 DDL 更改事件。
-
只有在
主服务器中
只支持逻辑解码复制插槽。当 PostgreSQL 服务器有集群时,连接器只能在活跃的主服务器中
运行。它无法在热
或温
备用副本上运行。如果主服务器
失败或降级,连接器将停止。在主服务器
恢复后,您可以重启连接器。如果不同的 PostgreSQL 服务器已提升到主服务器
,请在重启连接器前调整连接器配置。
出错时的行为 描述了连接器在出现问题时如何响应。
Debezium 目前仅支持使用 UTF-8 字符编码的数据库。使用单个字节字符编码时,无法正确处理包含扩展 ASCII 代码字符的字符串。
7.2. Debezium PostgreSQL 连接器的工作方式 复制链接链接已复制到粘贴板!
为了最佳配置和运行 Debezium PostgreSQL 连接器,了解连接器如何执行快照、流更改事件、决定 Kafka 主题名称以及使用元数据会很有帮助。
详情包括在以下主题中:
7.2.1. PostgreSQL 连接器的安全性 复制链接链接已复制到粘贴板!
要使用 Debezium 连接器从 PostgreSQL 数据库流更改,连接器必须使用数据库中的特定特权进行操作。虽然授予所需特权的一种方法是为用户授予 超级用户特权
的一种方法,但这样做可能会公开您的 PostgreSQL 数据到未授权的访问。最好创建一个您授予特定特权的专用 Debezium 复制用户,而不是为 Debezium 用户授予过量特权。
有关为 Debezium PostgreSQL 用户配置特权的更多信息,请参阅 设置权限。有关 PostgreSQL 逻辑复制安全性的更多信息,请参阅 PostgreSQL 文档。
7.2.2. Debezium PostgreSQL 连接器如何执行数据库快照 复制链接链接已复制到粘贴板!
大多数 PostgreSQL 服务器都配置为在 WAL 段中保留数据库的完整历史记录。这意味着 PostgreSQL 连接器无法通过读取 WAL 来查看数据库的整个历史记录。因此,连接器首次启动时,它会执行数据库的初始 一致性快照。执行快照的默认行为由以下步骤组成。您可以通过将 snapshot.mode
连接器配置属性设置为 初始
以外的值来更改此行为。
-
使用 SERIALIZABLE、READ ONLY、DEFERRABLE 隔离级别启动事务,以确保后续事务中的读取是针对数据的单个一致版本。由于后续
INSERT
、UPDATE
和DELETE
操作而对数据的任何更改都对这个事务不可见。 - 阅读服务器事务日志中的当前位置。
-
扫描数据库表和模式,为每个行生成
READ
事件,并将事件写入适当的表特定的 Kafka 主题。 - 提交事务。
- 在连接器偏移中记录成功完成快照。
如果连接器失败,会在步骤 1 开始后重新平衡或停止,但在重启连接器开始新快照前。连接器完成其初始快照后,PostgreSQL 连接器将继续从第 2 步中读取的位置流。这样可确保连接器不会丢失任何更新。如果连接器因为某种原因再次停止,则连接器会在之前离开的地方继续流传输更改。
选项 | 描述 |
---|---|
|
连接器总是在启动时执行快照。快照完成后,连接器将继续在上述序列中从第 3 步进行流传输更改。这个模式在以下情况下很有用:
|
|
连接器永远不会执行快照。当连接器以这种方式配置时,其行为如下。如果 Kafka offsets 主题中存在之前存储的 LSN,则连接器将继续从该位置流更改。如果没有存储 LSN,则连接器在服务器上创建 PostgreSQL 逻辑复制插槽时从点开始流更改。只有在您知道所关注的所有数据仍然反映在 WAL 中时, |
| 连接器执行数据库快照,并在流传输任何更改事件记录前停止。如果连接器已启动但没有在停止前完成快照,则连接器会重启快照进程并在快照完成后停止。 |
| 弃用,所有模式都锁定。 |
7.2.2.1. 临时快照 复制链接链接已复制到粘贴板!
默认情况下,连接器仅在首次启动后运行初始快照操作。在正常情况下,遵循这个初始快照,连接器不会重复快照过程。连接器捕获的任何将来更改事件数据都仅通过流传输过程。
然而,在某些情况下,连接器在初始快照期间获取的数据可能会变得过时、丢失或不完整。为了提供总结表数据的机制,Debezium 包含一个执行临时快照的选项。数据库中的以下更改可能是执行临时快照:
- 连接器配置会被修改为捕获不同的表集合。
- Kafka 主题已删除,必须重建。
- 由于配置错误或某些其他问题导致数据损坏。
您可以通过启动所谓的 临时命令快照,为之前捕获的快照重新运行快照。临时快照需要使用 信号表。您可以通过向 Debezium 信号表发送信号请求来启动临时快照。
当您启动现有表的临时快照时,连接器会将内容附加到表已存在的主题中。如果删除了之前存在的主题,如果启用自动主题创建,Debezium 可以自动创建主题。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#customization-of-kafka-connect-automatic-topic-creation
临时快照信号指定要包含在快照中的表。快照可以捕获数据库的整个内容,或者只捕获数据库中表的子集。另外,快照也可以捕获数据库中表内容的子集。
您可以通过向信号表发送 execute-snapshot
消息来指定要捕获的表。将 execute-snapshot
信号的类型设置为增量
,并提供快照中包含的表名称,如下表所述:
字段 | 默认 | 值 |
---|---|---|
|
|
指定您要运行的快照类型。 |
| 不适用 |
包含与要快照的表的完全限定域名匹配的正则表达式的数组。 |
| 不适用 | 可选字符串,它根据表的列指定条件,用于捕获表内容的子集。 |
触发临时快照
您可以通过在信号表中添加带有 execute-snapshot
信号类型的条目来启动临时快照。连接器处理消息后,它会开始快照操作。快照过程读取第一个和最后一个主密钥值,并使用这些值作为每个表的开头和端点。根据表中的条目数量以及配置的块大小,Debezium 将表分成块,并一次为每个块进行快照。
7.2.2.2. 增量快照 复制链接链接已复制到粘贴板!
为了提供管理快照的灵活性,Debezium 包括一个补充的快照机制,称为 增量快照。增量快照依赖于 Debezium 机制 向 Debezium 连接器发送信号。
在增量快照中,而不是一次性捕获数据库的完整状态,如初始快照,Debezium 以一系列可配置的块的形式捕获每个表。您可以指定您希望快照捕获的表,以及每个块的大小。块大小决定了快照在数据库的每个获取操作期间收集的行数。增量快照的默认块大小为 1 KB。
当增量快照进行时,Debezium 使用水位线来跟踪其进度,维护它捕获的每一个表行的记录。这个阶段捕获数据的方法比标准初始快照过程提供以下优点:
- 您可以使用流化数据捕获并行运行增量快照,而不是经过发布流,直到快照完成为止。连接器会继续在整个快照过程中从更改日志捕获接近实时事件,且操作都不会阻断其他事件。
- 如果增量快照的进度中断,您可以在不丢失任何数据的情况下恢复它。在进程恢复后,快照从停止的时间开始,而不是从开始重新定义表。
-
您可以随时根据需要运行增量快照,并根据需要重复这个过程以适应数据库更新。例如,您可以在修改连接器配置后重新运行快照,以将表添加到其
table.include.list
属性中。
增量快照过程
当您运行增量快照时,Debezium 按主密钥对表进行排序,然后根据 配置的块大小 将表分成块。然后,按块使用块,然后在块中捕获每个表行。对于它捕获的每行,快照会发出 READ
事件。该事件代表了块开始快照时的行值。
当快照继续进行时,其他进程可能会继续访问数据库,从而可能会修改表记录。要反映此类更改,INSERT
、UPDATE
或 DELETE
操作会照常提交到事务日志中。同样,持续 Debezium 流过程还会继续检测这些更改事件,并将对应的更改事件记录发送到 Kafka。
Debezium 如何使用相同的主密钥解决记录间的冲突
在某些情况下,流传输进程发出的 UPDATE
或 DELETE
事件会耗尽序列。也就是说,流过程可能会发出一个事件,它会在快照捕获包含该行的 READ
事件之前修改表行。当快照最终会为行发出对应的 READ
事件时,其值已经被替换。为确保以正确的逻辑顺序处理到达序列的增量快照事件,Debezium 会使用一种缓冲区方案来解决冲突。只有在快照事件和流事件间冲突时才解决后,Debezium 会向 Kafka 发送事件记录。
快照窗口
为了帮助解决后续 READ
事件和修改同一表行的流事件之间的冲突,Debezium 采用所谓的 快照窗口。快照窗口分离了增量快照捕获指定表块的数据的时间间隔。在打开块的快照窗口前,Debebe 会遵循其常见的行为,并将事件直接从事务日志直接降级到目标 Kafka 主题。但是,从打开特定块的快照时,Debebe 会执行重复数据删除步骤,以解决具有相同主密钥的事件之间冲突。
对于每个数据收集,Debezium 会发出两种类型的事件,并将其记录存储在单个目标 Kafka 主题中。它直接从表中捕获的快照记录作为 READ
操作发出。同时,当用户继续更新数据收集中的记录,并更新事务日志以反映每个提交,Debezium 会为每个更改发出 UPDATE
或 DELETE
操作。
当快照窗口打开时,Debezium 开始处理快照块,它会将快照记录提供给内存缓冲区。在快照窗口中,缓冲区中 READ
事件的主键将与传入流事件的主键进行比较。如果没有找到匹配项,流的事件记录将直接发送到 Kafka。如果 Debezium 检测到匹配项,它会丢弃缓冲的 READ
事件,并将流的记录写入目标主题,因为流的事件逻辑地替换静态快照事件。在块的快照窗口关闭后,缓冲区仅包含没有相关事务日志事件的 READ
事件。Debezium 将这些剩余的 READ
事件发送到表的 Kafka 主题。
连接器重复每个快照块的进程。
PostgreSQL 的 Debezium 连接器不支持增量快照运行时的 schema 更改。如果在增量快照启动前执行模式更改,但在发送信号 后,passthrough 配置选项 database.autosave
被设置为 conservative
以正确处理架构更改。
7.2.2.3. 触发增量快照 复制链接链接已复制到粘贴板!
目前,启动增量快照的唯一方法是向源数据库上的 信号发送临时快照 信号。
您可以以 SQL INSERT
查询形式向信号表提交信号。
在 Debezium 检测到信号表中的更改后,它会读取信号,并运行请求的快照操作。
您提交的查询指定要包含在快照中的表,以及可选的指定快照操作类型。目前,快照操作的唯一有效选项是默认值 增量
。
要指定快照中包含的表,请提供一个 data-collections
数组,该数组列出了用于匹配表的表或一组正则表达式,例如:
{"data-collections": ["public.MyFirstTable", "public.MySecondTable"]}
增量快照信号的 data-collections
数组没有默认值。如果 data-collections
数组为空,Debezium 会检测到不需要任何操作,且不执行快照。
如果要包含在快照中的表名称包含数据库、模式或表名称的句点(.
),要将表添加到 data-collections
数组中,您必须用双引号转义名称的每个部分。
例如,若要包含 公共
模式中存在的表,并且名为 My.Table
,请使用以下格式:" public"."My.Table
"。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
发送 SQL 查询,将临时增量快照请求添加到信号表中:
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令中的
id
、type
和data
参数的值对应于 信号表的字段。下表描述了示例中的参数:
Expand 表 7.3. 向信号表发送增量快照信号的 SQL 命令中的字段描述 项 值 描述 1
myschema.debezium_signal
指定源数据库上信号表的完全限定名称。
2
ad-hoc-1
id
参数指定分配给信号请求的id
标识符的任意字符串。
使用此字符串来标识到信号表中条目的日志消息。Debezium 不使用此字符串。相反,在快照中,Debebe 会生成自己的id
字符串作为水位信号。3
execute-snapshot
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段所需的组件,用于指定表名称或正则表达式数组,以匹配快照中包含的表名称。
数组列出了根据完全限定名称匹配表的正则表达式,其格式与您用来指定signal.data.collection
配置属性中的连接器信号表的名称相同。5
增量
信号的
data
字段的可选类型
组件,用于指定要运行的快照操作类型。
目前,唯一有效选项是默认值增量
。
如果没有指定值,连接器将运行一个增量快照。6
additional-condition
可选字符串,它根据表的列指定条件,用于捕获表内容的子集。有关
additional-condition
参数的详情请参考带有额外条件
的临时增量快照。
带有额外条件
的临时增量快照
如果您希望快照在表中仅包含内容子集,您可以通过将 additional-condition
参数附加到快照信号来修改信号请求。
典型的快照的 SQL 查询采用以下格式:
SELECT * FROM <tableName> ....
SELECT * FROM <tableName> ....
通过添加 additional-condition
参数,您可以将 WHERE
条件附加到 SQL 查询中,如下例所示:
SELECT * FROM <tableName> WHERE <additional-condition> ....
SELECT * FROM <tableName> WHERE <additional-condition> ....
以下示例显示了向信号表发送带有额外条件的临时增量快照请求的 SQL 查询:
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
例如,假设您有一个包含以下列的产品表:
-
id
(主密钥) -
color
-
quantity
如果您希望 product 表的增量快照只包含 color=blue
的数据项,您可以使用以下 SQL 语句来触发快照:
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue"}');
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue"}');
additional-condition
参数还允许您传递基于多个列的条件。例如,使用上例中的 product 表,您可以提交查询来触发增量快照,该快照仅包含那些项目的 data =blue
和 quantity>10
:
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue AND quantity>10"}');
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue AND quantity>10"}');
以下示例显示了连接器捕获的增量快照事件的 JSON。
示例:增加快照事件信息
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定要运行的快照操作类型。 |
2 |
|
指定事件类型。 |
7.2.2.4. 停止增量快照 复制链接链接已复制到粘贴板!
您还可以通过向源数据库上的表发送信号来停止增量快照。您可以通过发送 SQL INSERT
查询,向表提交停止快照信号。
在 Debezium 检测到信号表中的更改后,它会读取信号,并在进行时停止增量快照操作。
您提交的查询指定了 增量
的快照操作,以及可选的、要删除的当前运行快照的表。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
发送 SQL 查询以停止临时增量快照到信号表:
INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<tableName>","<tableName>"],"type":"incremental"}');
INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<tableName>","<tableName>"],"type":"incremental"}');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
INSERT INTO myschema.debezium_signal (id, type, data) values ('ad-hoc-1', 'stop-snapshot', '{"data-collections": ["schema1.table1", "schema2.table2"], "type":"incremental"}');
INSERT INTO myschema.debezium_signal (id, type, data)
1 values ('ad-hoc-1',
2 'stop-snapshot',
3 '{"data-collections": ["schema1.table1", "schema2.table2"],
4 "type":"incremental"}');
5 Copy to Clipboard Copied! Toggle word wrap Toggle overflow signal 命令中的
id
、type
和data
参数的值对应于 信号表的字段。下表描述了示例中的参数:
Expand 表 7.4. 向信号表发送停止增量快照信号的 SQL 命令中的字段描述 项 值 描述 1
myschema.debezium_signal
指定源数据库上信号表的完全限定名称。
2
ad-hoc-1
id
参数指定分配给信号请求的id
标识符的任意字符串。
使用此字符串来标识到信号表中条目的日志消息。Debezium 不使用此字符串。3
stop-snapshot
指定
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段的可选组件,用于指定表名称或正则表达式数组,以匹配要从快照中删除的表名称。
数组列出了根据完全限定名称匹配表的正则表达式,其格式与您用来指定signal.data.collection
配置属性中的连接器信号表的名称相同。如果省略了data
字段的此组件,则信号将停止正在进行的整个增量快照。5
增量
信号的
data
字段所需的组件,用于指定要停止的快照操作类型。
目前,唯一有效选项是增量的
。
如果没有指定类型
值,则信号无法停止增量快照。
7.2.3. Debezium PostgreSQL 连接器流更改事件记录 复制链接链接已复制到粘贴板!
PostgreSQL 连接器通常占用从 PostgreSQL 服务器连接到的大多数时间流更改。这种机制依赖于 PostgreSQL 的复制协议。此协议可让客户端在服务器的特定位置(称为 Log Sequence Numbers (LSN)在服务器事务日志中提交时从服务器接收更改。
每当服务器提交事务时,单独的服务器进程都会从 逻辑解码插件中调用回调功能。此功能处理事务的更改,将其转换为特定格式(在 Debezium 插件时为Protobuf 或 JSON),并在输出流上写入它们,然后客户端可以消耗它。
Debezium PostgreSQL 连接器充当 PostgreSQL 客户端。当连接器收到更改时,它会将事件转换为 Debezium 的 create, update, 或 delete 事件,包含该事件的 LSN 的事件。PostgreSQL 连接器将记录中的这些更改事件转发到 Kafka Connect 框架,该框架在同一进程中运行。Kafka Connect 进程异步写入更改事件记录,其顺序与生成到适当的 Kafka 主题的顺序相同。
Kafka Connect 会在另一个 Kafka 主题中记录最新的 偏移量。offset 表示 Debezium 包含在每个事件中的特定于源的位置信息。对于 PostgreSQL 连接器,每次更改事件中记录的 LSN 是偏移。
当 Kafka Connect 正常关闭时,它会停止连接器,将所有事件记录刷新到 Kafka,并记录从每个连接器接收的最后偏移。当 Kafka Connect 重启时,它会读取每个连接器的最后记录的偏移量,并在最后记录的偏移后启动每个连接器。当连接器重启时,它会向 PostgreSQL 服务器发送请求,以便在该位置后才启动事件。
PostgreSQL 连接器检索模式信息,作为逻辑解码插件发送的事件的一部分。但是,连接器不会检索有关哪些列组成主密钥的信息。连接器从 JDBC 元数据(频道)获取此信息。如果表的主键定义有变化(通过添加、删除或重命名主键列),则当 JDBC 的主密钥信息没有与逻辑解码插件生成的更改事件不同步时,会有一个小的时间。在这个小时间内,可以使用不一致的密钥结构来创建消息。要防止这个问题不一致,请更新主键结构,如下所示:
- 将数据库或应用程序置于只读模式。
- 让 Debezium 处理所有剩余的事件。
- 停止 Debezium。
- 更新相关表中的主密钥定义。
- 将数据库或应用程序置于读/写模式。
- 重启 Debezium。
PostgreSQL 10+ 逻辑解码支持(pgoutput
)
从 PostgreSQL 10+ 开始,有一个逻辑复制流模式,称为 pgoutput
,它被 PostgreSQL 原生支持。这意味着 Debezium PostgreSQL 连接器可以消耗该复制流,而无需额外的插件。对于不支持或不允许安装插件的环境,这尤其重要。
如需更多信息,请参阅设置 PostgreSQL。
7.2.4. 接收 Debezium PostgreSQL 更改事件记录的 Kafka 主题默认名称 复制链接链接已复制到粘贴板!
默认情况下,PostgreSQL 连接器将所有 INSERT
、UPDATE
和 DELETE
操作的更改事件写入特定于该表的单个 Apache Kafka 主题。连接器使用以下惯例命名更改事件主题:
topicPrefix.schemaName.tableName
以下列表提供默认名称组件的定义:
- topicPrefix
-
由
topic.prefix
配置属性指定的主题前缀。 - schemaName
- 发生更改事件的数据库模式的名称。
- tableName
- 发生更改事件的数据库表的名称。
例如,假设 fulfillment
是连接器中的逻辑服务器名称,该连接器捕获 PostgreSQL 安装中的更改,该安装具有一个 postgres
数据库和一个 inventory
schem,它包含四个表:products
, products_on_hand
, customers
, 和 orders
连接器会将记录流传输到这四个 Kafka 主题:
-
fulfillment.inventory.products
-
fulfillment.inventory.products_on_hand
-
fulfillment.inventory.customers
-
fulfillment.inventory.orders
现在假设表不是特定模式的一部分,而是在默认 公共
PostgreSQL 模式中创建。Kafka 主题的名称将是:
-
fulfillment.public.products
-
fulfillment.public.products_on_hand
-
fulfillment.public.customers
-
fulfillment.public.orders
连接器应用类似的命名约定来标记其 事务元数据主题。
如果默认主题名称不满足您的要求,您可以配置自定义主题名称。要配置自定义主题名称,您可以在逻辑主题路由 SMT 中指定正则表达式。有关使用逻辑主题路由 SMT 自定义主题命名的更多信息,请参阅 主题路由。
7.2.5. Debezium PostgreSQL 连接器生成的事件代表事务边界 复制链接链接已复制到粘贴板!
Debezium 可以生成代表事务边界的事件,并增强数据更改事件消息。
Debezium 仅在部署连接器后为发生的事务注册并接收元数据。部署连接器前发生的事务元数据。
对于每个事务 BEGIN
和 END
,Debezium 生成一个包含以下字段的事件:
status
-
BEGIN
或END
。 id
-
由 Postgres 事务 ID 本身和给定操作的 LSN 组成的唯一事务标识符的字符串表示,即
txID:LSN
。 ts_ms
-
数据源上事务边界事件(
BEGIN
或END
事件)的时间。如果数据源没有向 Debezium 提供事件时间,则该字段代表 Debezium 处理事件的时间。 event_count
(用于END
事件)- 事务所设计的事件总数。
data_collections
(用于END
事件)-
data_collection
和event_count
元素的一组对,指示连接器为来自数据收集的更改发出的事件数。
示例
除非通过 topic.transaction
选项覆盖,否则事务事件将写入名为 <topic. prefix>
。
.transaction
的主题
更改数据事件增强
当启用事务元数据时,可通过新的 事务
字段增强数据消息 Envelope
。此字段以字段复合的形式提供有关每个事件的信息:
id
- 唯一事务标识符的字符串表示。
total_order
- 事件在事务生成的所有事件的绝对路径。
data_collection_order
- 事件在事务发送的所有事件中每个数据收集位置。
以下是消息的示例:
7.3. Debezium PostgreSQL 连接器数据更改事件的描述 复制链接链接已复制到粘贴板!
Debezium PostgreSQL 连接器会为每行级别 INSERT
、UPDATE
和 DELETE
操作生成数据更改事件。每个事件都包含一个键和值。键和值的结构取决于更改的表。
Debezium 和 Kafka Connect 围绕 事件消息的持续流 设计。但是,这些事件的结构可能会随时间而变化,而用户很难处理这些事件。要解决这个问题,每个事件都包含其内容的 schema,或者如果您使用 schema registry,则消费者可以从 registry 获取 schema 的模式 ID。这使得每个事件都可以自我包含。
以下框架 JSON 显示更改事件的基本四个部分。但是,如何配置在应用程序中使用的 Kafka Connect converter 决定了更改事件中的这四个部分的表示。只有当您将转换器配置为生成它时,schema
字段才处于更改事件中。同样,只有在将转换器配置为生成它时,才会发生更改事件中的事件密钥和事件有效负载。如果您使用 JSON 转换器,并将其配置为生成所有四个基本更改事件部分,则更改事件具有此结构:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
第一个 |
2 |
|
第一个 |
3 |
|
第二个 |
4 |
|
第二个 |
默认情况下,连接器流将事件记录更改为 名称与事件原始表相同的名称的主题。
从 Kafka 0.10 开始,Kafka 可以使用创建消息 的时间戳 (由制作者记录)或由 Kafka 写入日志来记录事件键和值。
PostgreSQL 连接器确保所有 Kafka Connect 模式名称都遵循 Avro 模式名称格式。这意味着,逻辑服务器名称必须以拉丁或下划线开头,即 a-z、A-Z 或 _。逻辑服务器名称中的每个剩余的字符以及模式和表名称中的每个字符都必须是一个字母、数字或下划线,即 a-z、A-Z、0-9 或 \_。如果存在无效的字符,它将替换为下划线字符。
如果逻辑服务器名称、模式名称或表名称包含无效字符,且区分另一个名称的唯一字符无效,则可能会导致意外冲突,因此替换为下划线。
详情包括在以下主题中:
7.3.1. 关于 Debezium PostgreSQL 更改事件中的键 复制链接链接已复制到粘贴板!
对于给定表,更改事件的密钥具有结构,其中包含创建事件时表的主键中的每个列的字段。或者,如果表将 REPLICA IDENTITY
设置为 FULL
或 USING INDEX
,则每个唯一键约束都有一个字段。
考虑在 公共
数据库模式中定义的 客户
表,以及该表的更改事件密钥示例。
表示例
更改事件键示例
如果 topic.prefix
连接器配置属性的值为 PostgreSQL_server
,而 客户
表的每个更改事件都有相同的密钥结构,在 JSON 中类似如下:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
键的 schema 部分指定一个 Kafka Connect 模式,它描述了密钥 |
2 |
|
定义密钥有效负载结构的 schema 名称。这个模式描述了更改的表的主键的结构。键架构名称的格式为 connector-name.database-name.table-name.
|
3 |
|
指明 event 键必须在其 |
4 |
|
指定 |
5 |
|
包含生成此更改事件的行的键。在本例中,键包含一个 |
虽然 column.exclude.list
和 column.include.list
连接器配置属性只允许您只捕获表列的子集,但主或唯一键中的所有列始终包含在事件键中。
如果表没有主键或唯一键,则更改事件的密钥为 null。没有主或唯一键约束的表中的行无法唯一标识。
7.3.2. 关于 Debezium PostgreSQL 更改事件中的值 复制链接链接已复制到粘贴板!
更改事件中的值比键稍微复杂。与键一样,该值具有 schema
部分和 payload
部分。schema
部分包含描述 payload
部分的 Envelope
结构的 schema,包括其嵌套字段。更改创建、更新或删除数据的事件,并且具有 envelope 结构的值有效负载。
考虑用于显示更改事件键示例的相同示例:
对这个表的更改事件的值部分因 REPLICA IDENTITY
设置和事件所针对的操作而异。
以下部分详细如下:
副本身份
REPLICA IDENTITY 是特定于 PostgreSQL 的表级设置,它决定了 UPDATE
和 DELETE
事件的逻辑解码插件可用的信息量。更具体地说,当发生 UPDATE
或 DELETE
事件时,设置 REPLICA IDENTITY
控制哪些(若有)信息用于之前涉及的表列的值。
REPLICA IDENTITY
有 4 个可能的值:
DEFAULT
- 如果该表有主密钥,则默认行为是UPDATE
和DELETE
事件包含表的主键列的以前的值。对于UPDATE
事件,只有带有更改值的主键列会被存在。如果表没有主密钥,则连接器不会为该表发出
UPDATE
或DELETE
事件。对于没有主密钥的表,连接器只发出 创建事件。通常,没有主键的表用于将消息附加到表末尾,这意味着UPDATE
和DELETE
事件不可用。-
NOTHING
-UPDATE
和DELETE
操作的事件不包含任何表列之前值的任何信息。 -
FULL
- Emitted events forUPDATE
和DELETE
操作包含表中所有列的先前值。 -
INDEX
index-name - Emitted events forUPDATE
和DELETE
操作包含指定索引中包含的列的以前的值。UPDATE
事件还包含带有更新值的索引列。
创建 事件
以下示例显示了连接器为在 customer 表中创建数据的操作生成的更改事件的值部分:
项 | 字段名称 | 描述 |
---|---|---|
1 |
| 值的 schema,用于描述值有效负载的结构。每次连接器为特定表生成的更改时,更改事件的值模式都是相同的。 |
2 |
|
在 |
3 |
|
|
4 |
|
|
5 |
|
值的实际数据。这是更改事件提供的信息。 |
6 |
|
指定事件发生前行状态的可选字段。当 注意
此字段是否取决于每个表的 |
7 |
|
指定事件发生后行状态的可选字段。在本例中, |
8 |
| 描述事件源元数据的必需字段。此字段包含可用于将此事件与其他事件进行比较的信息,以及事件的来源、事件发生的顺序,以及事件是否为同一事务的一部分。源元数据包括:
|
9 |
|
描述导致连接器生成事件的操作类型的必要字符串。在本例中,
|
10 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
更新 事件
示例 customer 表中更新的更改事件值与该表的 create 事件相同。同样,事件的 payload 具有相同的结构。但是,事件值 payload 在更新 事件中包含不同的值。以下是连接器在
customers
表中为更新生成的更改事件值示例:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
包含数据库提交前行中的值的可选字段。在本例中,只有主键列 |
2 |
|
指定事件发生后行状态的可选字段。在本例中, |
3 |
|
描述事件源元数据的必需字段。
|
4 |
|
描述操作类型的强制字符串。在 update 事件值中, |
5 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
更新行的主/唯一键的列会更改行键的值。当键更改时,Debebe 会输出 三个 事件: DELETE
事件和带有行的旧键的 tombstone 事件,后跟带有行的新键的事件。下一小节中提供了详细信息。
主密钥更新
更改行主密钥字段的 UPDATE
操作被称为主密钥更改。对于主键更改,为了发送 UPDATE
事件记录,连接器会为旧密钥和新(更新)密钥的 CREATE
事件记录发送 DELETE
事件记录。这些事件具有常见的结构和内容,以及每个事件都有一个与主密钥更改相关的消息标头:
-
DELETE
事件记录具有__debezium.newkey
作为消息标头。此标头的值是更新行的新主密钥。 -
CREATE
事件记录具有__debezium.oldkey
作为消息标头。此标头的值是更新的行具有的先前(旧的)主密钥。
删除 事件
delete 更改事件中的值与为同一表的 create 和 update 事件相同的 schema
部分。示例 customer
表的 delete 事件中 payload
部分类似如下:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定事件发生前行状态的可选字段。在 delete 事件值中, |
2 |
|
指定事件发生后行状态的可选字段。在 delete 事件值中, |
3 |
|
描述事件源元数据的必需字段。在一个 delete 事件值中,
|
4 |
|
描述操作类型的强制字符串。 |
5 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
删除 更改事件记录为消费者提供处理此行删除所需的信息。
对于消费者能够处理为没有主密钥的表生成的 删除 事件,请将表的 REPLICA IDENTITY
设置为 FULL
。当表没有主密钥,并且表的 REPLICA IDENTITY
被设置为 DEFAULT
或 NOTHING
时,删除 事件没有 before
字段。
PostgreSQL 连接器事件旨在用于 Kafka 日志压缩。只要每个密钥至少保留最新的消息,日志压缩就可以删除一些旧的消息。这可让 Kafka 回收存储空间,同时确保主题包含完整的数据集,并可用于重新载入基于密钥的状态。
tombstone 事件
删除行时,delete 事件值仍可用于日志压缩,因为 Kafka 您可以删除具有相同键的所有之前信息。但是,如果 Kafka 删除具有相同键的所有消息,消息值必须是 null
。为了实现此目的,PostgreSQL 连接器遵循一个 delete 事件,其中包含一个特殊的tombstone 事件,它有相同的键但值为 null
。
截断 事件
一个 截断 的更改事件信号,表示表已被截断。本例中 message 键为 null
,消息值类似如下:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
描述事件源元数据的必需字段。在 truncate 事件值中,
|
2 |
|
描述操作类型的强制字符串。 |
3 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
如果单个 TRUNCATE
语句应用到多个表,则会发出每个截断表的截断更改事件记录。
请注意,由于 truncate 事件代表对整个表所做的更改,且没有消息键,除非您正在使用单个分区的主题,否则不会排序与表相关的更改事件(创建、更新 等)和 截断 事件。例如,当这些事件从不同的分区读取时,消费者只能在该表的 truncate 事件后收到 update 事件。
此事件类型只支持 Postgres 14+ 上的 pgoutput
插件(Postgres Documentation)
消息 事件信号,一个通用逻辑解码消息已被直接插入到 WAL 中,通常使用 pg_logical_emit_message
函数。message 键是一个 Struct
,本例中为一个名为 prefix
的单个字段,在插入消息时指定前缀。message 值类似如下用于事务消息:
与其他事件类型不同,非事务消息将不会有任何关联的 BEGIN
或 END
事务事件。对于非事务消息,Message 值类似如下:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
描述事件源元数据的必需字段。在 message 事件值中,
|
2 |
|
描述操作类型的强制字符串。 |
3 |
|
显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。
对于非事务 消息 事件, |
4 |
| 包含消息元数据的字段
|
7.4. Debezium PostgreSQL 连接器如何映射数据类型 复制链接链接已复制到粘贴板!
PostgreSQL 连接器代表对带有类似行存在的表的事件的行的更改。event 包含每个列值的字段。该值在事件中如何代表取决于该列的 PostgreSQL 数据类型。以下小节描述了连接器如何将 PostgreSQL 数据类型映射到事件 字段中的字面 类型和语义类型。
-
literal type 代表值如何被代表,使用 Kafka Connect schema 类型:
INT8
,INT16
,INT32
,INT64
,FLOAT32
,FLOAT64
,BOOLEAN
,STRING
,BYTES
,ARRAY
,MAP
, 和STRUCT
。 - 语义类型 描述了 Kafka Connect 模式如何使用字段名称来捕获字段 的含义。
如果默认数据类型转换无法满足您的需要,您可以为连接器 创建自定义转换器。
详情包括在以下部分:
基本类型
下表描述了连接器如何映射基本类型。
PostgreSQL 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
| 不适用 |
|
| 不适用 |
|
|
|
|
|
|
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N/A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 不适用 |
|
| 不适用 |
|
|
N/A |
|
|
N/A |
|
|
N/A |
|
|
N/A |
|
|
N/A |
|
|
N/A |
|
|
|
临时类型
除 PostgreSQL 的 TIMESTAMPTZ
和 TIMETZ
数据类型之外,它包含时区信息,如何映射 temporal 类型取决于 time.precision.mode
连接器配置属性的值。以下小节描述了这些映射:
time.precision.mode=adaptive
当 time.precision.mode
属性设置为 adaptive
时,默认连接器根据列的数据类型定义决定字面类型和语义类型。这样可确保事件 完全 表示数据库中的值。
PostgreSQL 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
time.precision.mode=adaptive_time_microseconds
当 time.precision.mode
配置属性被设置为 adaptive_time_microseconds
时,连接器根据列的数据类型定义决定 temporal 类型的字面类型和语义类型。这样可确保事件 精确 表示数据库中的值,但所有 TIME
字段都被捕获为微秒。
PostgreSQL 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
time.precision.mode=connect
当 time.precision.mode
配置属性设为 connect
时,连接器将使用 Kafka Connect 逻辑类型。当消费者只能处理内置的 Kafka Connect 逻辑类型且无法处理变量精度时间值时,这很有用。但是,因为 PostgreSQL 支持微秒精度,因此带有 连接
时间精度模式的连接器 生成的事件会导致 数据库列的 fractional second 精度 值大于 3 时丢失精度。
PostgreSQL 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
|
|
|
TIMESTAMP 类型
TIMESTAMP
类型代表没有时区信息的时间戳。这些列根据 UTC 转换为等同的 Kafka Connect 值。例如,当 time.precision.mode
没有设置为 connect
时,TIMESTAMP
值 "2018-06-20 15:13:16.945104" 由一个带有值 "1529507596945104" 的 io.debezium.time.MicroTimestamp
代表。
运行 Kafka Connect 和 Debezium 的 JVM 的时区不会影响这个转换。
PostgreSQL 支持在 TIMESTAMP
列中使用 +/-infinite
值。这些特殊的值转换为时间戳,在正无限循环的情况下值为 9223372036825200000
,在负无限循环的情况值为 -9223372036832400000
。这个行为模拟 PostgreSQL JDBC 驱动程序的标准行为。有关参考,请参阅 org.postgresql.PGStatement
接口。
十进制类型
PostgreSQL 连接器配置属性 decimal.handling.mode
的设置决定了连接器如何映射十进制类型。
当将 decimal.handling.mode
属性设置为 精确
时,连接器为所有 DECIMAL
、NUMERIC
和 MONEY
列使用 Kafka Connect org.apache.kafka.connect.data.Decimal
逻辑类型。这是默认的模式。
PostgreSQL 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
|
|
|
此规则有一个例外。当在没有扩展限制的情况下使用 NUMERIC
或 DECIMAL
类型时,来自数据库的值为每个值具有不同的(variable)扩展。在这种情况下,连接器使用 io.debezium.data.VariableScaleDecimal
,其中包含值以及传输值的规模。
PostgreSQL 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
当将 decimal.handling.mode
属性设置为 double
时,连接器表示所有 DECIMAL
、NUMERIC
和 MONEY
值作为 Java double 值,并将它们编码,如下表所示。
PostgreSQL 数据类型 | 字面类型(架构类型) | 语义类型(架构名称) |
---|---|---|
|
| |
|
| |
|
|
decimal.handling.mode
配置属性的最后可能设置是 字符串
。在这种情况下,连接器代表 DECIMAL
、NUMERIC
和 MONEY
值作为其格式的字符串表示,并将它们编码,如下表所示。
PostgreSQL 数据类型 | 字面类型(架构类型) | 语义类型(架构名称) |
---|---|---|
|
| |
|
| |
|
|
PostgreSQL 支持 NaN
(不是数字)作为在 decimal.handling.mode
设置为 string
或 double
时存储在 DECIMAL
/NUMERIC
值的特殊值。在这种情况下,连接器将 NaN
编码为 Double.NaN
或字符串常量 NAN
。
HSTORE 类型
PostgreSQL 连接器配置属性 hstore.handling.mode
的设置决定了连接器如何映射 HSTORE
值。
当 dhstore.handling.mode
属性设置为 json
(默认值),连接器表示 HSTORE
值作为 JSON 值的字符串表示,并将它们编码,如下表所示。当 hstore.handling.mode
属性设置为 map
时,连接器将 MAP
模式类型用于 HSTORE
值。
PostgreSQL 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
N/A |
域类型
PostgreSQL 支持基于其他底层类型的用户定义的类型。当使用此类列类型时,Debezium 会根据完整类型层次结构公开列的表示。
捕获使用 PostgreSQL 域类型的列中的更改需要特殊考虑。当将列定义为扩展其中一个默认数据库类型的域类型,并且 domain 类型定义了自定义长度或缩放时,生成的架构继承了定义长度或缩放。
当将列定义为一个域类型来扩展定义自定义长度或缩放的另一个域类型时,生成的架构 不会继承 定义的长度或缩放,因为 PostgreSQL 驱动程序列元数据中没有这些信息。
网络地址类型
PostgreSQL 具有可存储 IPv4、IPv6 和 MAC 地址的数据类型。最好使用这些类型而不是纯文本类型来存储网络地址。网络地址类型提供输入错误检查以及特殊的运算符和功能。
PostgreSQL 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
N/A |
|
|
N/A |
|
|
N/A |
|
|
N/A |
PostGIS 类型
PostgreSQL 连接器支持所有 PostGIS 数据类型。
PostGIS 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
有关格式详情,请参阅 Open Geospatial Consortium Simple features Access 规格。 |
|
|
有关格式详情,请参阅 Open Geospatial Consortium Simple features Access 规格。 |
粘贴的值
PostgreSQL 对页面大小具有硬性限制。这意味着,需要使用 TOAST 存储存储 超过 8 KB 的值。这会影响来自数据库的复制消息。使用 TOAST 机制存储且尚未更改的值不会包含在消息中,除非它们是表的副本身份的一部分。Debezium 无法直接从数据库中读取缺失的值,因为这可能导致竞争条件。因此,Debebe 会遵循这些规则来处理粘贴的值:
-
带有
REPLICA IDENTITY FULL
- TOAST 列值的表是更改事件中的before
和after
字段的一部分,就像任何其他列一样。 -
带有
REPLICA IDENTITY DEFAULT
的表 - 当从数据库接收UPDATE
事件时,任何没有更改的 TOAST 列值都不会包含在事件中。同样,当收到DELETE
事件时,在before
字段中没有 TOAST 列。由于 Debezium 无法安全地提供列值,因此连接器会返回一个占位符值,如连接器配置属性unavailable.value.placeholder
定义。
默认值
如果为数据库模式中的列指定了默认值,PostgreSQL 连接器将尽可能尝试将这个值传播到 Kafka 模式。最常见的数据类型都被支持,包括:
-
布尔值
-
数字类型(
INT
、FLOAT
、NUMERIC
等) -
文本类型(
CHAR
、VARCHAR
、TEXT
等) -
temporal 类型(
DATE
,TIME
,INTERVAL
,TIMESTAMP
,TIMESTAMPTZ
) -
JSON
、JSONB
、XML
-
UUID
请注意,对于临时类型,默认值解析由 PostgreSQL 库提供;因此,PostgreSQL 通常支持的任何字符串表示都应被连接器支持。
如果默认值由函数生成,而不是直接指定,则连接器将为给定的数据类型导出等效的 0
。这些值包括:
-
FALSE
forBOOLEAN
-
0,
带有适当的精度,对于数字类型 - 文本/XML 类型的空字符串
-
JSON 类型
{}
-
1970-01-01
用于DATE
,TIMESTAMP
,TIMESTAMPTZ
类型 -
00:00
代表TIME
-
E114H
forINTERVAL
-
00000000-0000-0000-0000-000000000000
用于UUID
这个支持目前只扩展为明确使用功能。例如,CURRENT_TIMESTAMP (6)
支持括号,但 CURRENT_TIMESTAMP
不支持。
在将 PostgreSQL 连接器与强制实施架构版本间兼容性的模式 registry 搭配使用时,对默认值的传播主要存在允许安全模式演进。由于这个主要关注,以及不同插件的刷新行为,Kafka 模式中的默认值无法保证始终与数据库模式中的默认值同步。
- 默认值可能会在 Kafka 模式中出现 'late',具体取决于给定插件触发对内存模式的刷新。如果默认值在刷新中多次更改,则值不会在 Kafka 模式中显示/跳过
- 如果在连接器有等待处理的记录时触发了模式刷新,则默认值可能会在 Kafka 模式中出现"early"。这是因为在刷新时从数据库读取列元数据,而不是在复制消息中存在。如果连接器位于后,并且发生刷新,或者在更新继续写入源数据库时停止连接器时启动连接器。
此行为可能是意外的,但仍然是安全的。只有架构定义会受到影响,但消息中存在的实际值与写入源数据库的内容保持一致。
7.5. 设置 PostgreSQL 以运行 Debezium 连接器 复制链接链接已复制到粘贴板!
这个 Debezium 发行版本只支持原生 pgoutput
逻辑复制流。要设置 PostgreSQL 以便使用 pgoutput
插件,您必须启用复制插槽,并配置具有足够特权的用户来执行复制。
详情包括在以下主题中:
7.5.1. 为 Debezium pgoutput 插件配置复制插槽 复制链接链接已复制到粘贴板!
PostgreSQL 的逻辑解码使用复制插槽。要配置复制插槽,请在 postgresql.conf
文件中指定以下内容:
wal_level=logical max_wal_senders=1 max_replication_slots=1
wal_level=logical
max_wal_senders=1
max_replication_slots=1
这些设置指示 PostgreSQL 服务器,如下所示:
-
wal_level
- 使用带有 write-ahead 日志的逻辑解码。 -
max_wal_senders
- 使用最多一个独立进程来处理 WAL 更改。 -
max_replication_slots
- 允许创建最多一个复制插槽来流传输 WAL 更改。
复制插槽可以保证保留 Debezium 所需的所有 WAL 条目,即使在 Debezium 中断期间也是如此。因此,务必要密切监控复制插槽以避免:
- 磁盘消耗太多
- 任何条件,如目录 bloat,当复制插槽的用时过长时可能会发生。
如需更多信息,请参阅有关 复制插槽的 PostgreSQL 文档。
熟悉 PostgreSQL write-ahead 日志 的机制和配置有助于使用 Debezium PostgreSQL 连接器。
7.5.2. 为 Debezium 连接器设置 PostgreSQL 权限 复制链接链接已复制到粘贴板!
将 PostgreSQL 服务器设置为运行 Debezium 连接器需要能够执行复制的数据库用户。复制只能由具有适当权限的数据库用户执行,并且仅对配置的主机执行。
虽然默认情况下,超级用户具有必要的 REPLICATION
和 LOGIN
角色,如 安全 所述,最好不要为 Debezium 复制用户提供升级的特权。相反,创建一个具有最低所需特权的 Debezium 用户。
先决条件
- PostgreSQL 管理权限。
流程
要为用户提供复制权限,请定义一个 至少具有
REPLICATION
和LOGIN
权限的 PostgreSQL 角色,然后将该角色授予该用户。例如:CREATE ROLE <name> REPLICATION LOGIN;
CREATE ROLE <name> REPLICATION LOGIN;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.5.3. 设置特权,使 Debezium 能够创建 PostgreSQL 出版物 复制链接链接已复制到粘贴板!
来自为表创建的 publications 的 PostgreSQL 源表的 Debezium 流改变事件。出版物包含从一个或多个表生成的一组已过滤的更改事件。每个发布中的数据会根据发布规格过滤。规格可由 PostgreSQL 数据库管理员或 Debezium 连接器创建。要允许 Debezium PostgreSQL 连接器创建发布并指定要复制到它们的数据,连接器必须使用数据库中的特定权限进行操作。
有几个选项可用于确定如何创建发布。通常,最好在设置连接器前为您要捕获的表手动创建发布。但是,您可以以允许 Debezium 自动创建发布的方式配置您的环境,并指定添加到它们中的数据。
Debezium 使用 list 和 exclude list 属性来指定在发布中插入数据的方式。有关启用 Debezium 创建发布选项的更多信息,请参阅 publication.autocreate.mode
。
要使 Debezium 创建 PostgreSQL 发布,它必须以具有以下权限的用户运行:
- 在数据库中复制特权,将表添加到发布中。
-
数据库的
CREATE
特权来添加发布。 -
对表的
SELECT
特权,以复制初始表数据。表所有者自动具有表的SELECT
权限。
要为发布添加表,用户必须是表的所有者。但是,由于源表已存在,您需要一种与原始所有者共享所有权的机制。要启用共享所有权,您可以创建一个 PostgreSQL 复制组,然后将现有的表所有者和复制用户添加到组中。
流程
创建复制组。
CREATE ROLE <replication_group>;
CREATE ROLE <replication_group>;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将表的原始所有者添加到组中。
GRANT REPLICATION_GROUP TO <original_owner>;
GRANT REPLICATION_GROUP TO <original_owner>;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 Debezium 复制用户添加到组中。
GRANT REPLICATION_GROUP TO <replication_user>;
GRANT REPLICATION_GROUP TO <replication_user>;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将表的所有权传送到 <
replication_group>
。ALTER TABLE <table_name> OWNER TO REPLICATION_GROUP;
ALTER TABLE <table_name> OWNER TO REPLICATION_GROUP;
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要使 Debezium 指定捕获配置,必须将 publication.autocreate.mode
的值设置为 filtered
。
7.5.4. 配置 PostgreSQL 以允许使用 Debezium 连接器主机复制 复制链接链接已复制到粘贴板!
要启用 Debezium 复制 PostgreSQL 数据,您必须配置数据库,以允许与运行 PostgreSQL 连接器的主机进行复制。要指定允许使用数据库复制的客户端,请在基于 PostgreSQL 主机的身份验证文件 pg_hba.conf
中添加条目。有关 pg_hba.conf
文件的更多信息,请参阅 PostgreSQL 文档。
流程
在
pg_hba.conf
文件中添加条目,以指定可通过数据库主机复制的 Debezium 连接器主机。例如,pg_hba.conf
文件示例:local replication <youruser> trust host replication <youruser> 127.0.0.1/32 trust host replication <youruser> ::1/128 trust
local replication <youruser> trust
1 host replication <youruser> 127.0.0.1/32 trust
2 host replication <youruser> ::1/128 trust
3 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
- 指示服务器在本地允许 <
youruser&
gt; 复制,即在服务器机器上进行复制。 - 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
- 指示服务器允许
localhost
上的 <youruser
> 使用IPV4
接收复制更改。 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
- 指示服务器允许
localhost
上的 <youruser
> 使用IPV6
接收复制更改。
有关网络掩码的更多信息,请参阅 PostgreSQL 文档。
7.5.5. 配置 PostgreSQL 来管理 Debezium WAL 磁盘空间消耗 复制链接链接已复制到粘贴板!
在某些情况下,WAL 文件消耗的 PostgreSQL 磁盘空间可能会激增或增加通常的比例。这种情况有几个可能的原因:
连接器已接收数据的 LSN 位于服务器的
pg_replication_slots
视图的confirmed_flush_lsn
列中。比这个 LSN 旧的数据不再可用,数据库负责回收磁盘空间。另外,在
pg_replication_slots
视图中,restart_lsn
列包含连接器可能需要的最旧的 WAL 的 LSN。如果定期增加confirmed_flush_lsn
的值,并且restart_lsn
lags 的值,则数据库需要回收空间。数据库通常在批处理块中回收磁盘空间。这是预期的行为,用户不需要操作。
-
数据库中有多个正在跟踪的更新,但只有少量更新与连接器捕获更改的表和模式相关。这种情况可以通过定期心跳事件轻松解决。设置
heartbeat.interval.ms
连接器配置属性。 PostgreSQL 实例包含多个数据库,其中一个是高流量数据库。与其他数据库相比,Debezium 捕获另一个数据库中的更改。然后 Debezium 无法确认 LSN 作为复制插槽可以按数据库工作,并且不会调用 Debezium。由于 WAL 由所有数据库共享,使用的数量往往会增大,直到事件由 Debezium 捕获更改的数据库发出。要解决这个问题,需要:
-
使用
heartbeat.interval.ms
连接器配置属性启用定期心跳记录生成。 - 从捕获更改的数据库定期发出更改事件。
然后,单独的进程会通过插入新行或重复更新同一行来定期更新表。然后,PostgreSQL 调用 Debezium,它会确认最新的 LSN,并允许数据库回收 WAL 空间。此任务可以通过
heartbeat.action.query
连接器配置属性自动执行。-
使用
7.6. 部署 Debezium PostgreSQL 连接器 复制链接链接已复制到粘贴板!
您可以使用以下任一方法部署 Debezium PostgreSQL 连接器:
7.6.1. 使用 AMQ Streams 部署 PostgreSQL 连接器 复制链接链接已复制到粘贴板!
从 Debezium 1.7 开始,部署 Debezium 连接器的首选方法是使用 AMQ Streams 来构建包含连接器插件的 Kafka Connect 容器镜像。
在部署过程中,您可以创建并使用以下自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR,并包含有关镜像中需要包含连接器工件的信息。 -
提供连接器用来访问源数据库的信息的
KafkaConnector
CR。在 AMQ Streams 启动 Kafka Connect pod 后,您可以通过应用KafkaConnector
CR 来启动连接器。
在 Kafka Connect 镜像的构建规格中,您可以指定可用于部署的连接器。对于每个连接器插件,您还可以指定您的部署可以使用的其他组件。例如,您可以添加 Apicurio Registry 工件或 Debezium 脚本组件。当 AMQ Streams 构建 Kafka Connect 镜像时,它会下载指定的工件,并将其合并到镜像中。
KafkaConnect
CR 中的 spec.build.output
参数指定存储生成的 Kafka Connect 容器镜像的位置。容器镜像可以存储在 Docker registry 中,也可以存储在 OpenShift ImageStream 中。要将镜像存储在 ImageStream 中,您必须先创建 ImageStream,然后才能部署 Kafka Connect。镜像流不会被自动创建。
如果使用 KafkaConnect
资源创建集群,之后您无法使用 Kafka Connect REST API 创建或更新连接器。您仍然可以使用 REST API 来检索信息。
其他资源
- 在 OpenShift 上使用 AMQ Streams 配置 Kafka 连接。
- 在 OpenShift 中部署和升级 AMQ Streams 中的使用 AMQ Streams 自动创建新容器镜像。
7.6.2. 使用 AMQ Streams 部署 Debezium PostgreSQL 连接器 复制链接链接已复制到粘贴板!
使用早期版本的 AMQ Streams 时,要在 OpenShift 上部署 Debezium 连接器,首先需要为连接器构建 Kafka Connect 镜像。在 OpenShift 上部署连接器的当前首选的方法是使用 AMQ Streams 中的构建配置来自动构建 Kafka Connect 容器镜像,其中包含您要使用的 Debezium 连接器插件。
在构建过程中,AMQ Streams Operator 会将 KafkaConnect
自定义资源中的输入参数(包括 Debezium 连接器定义)转换为 Kafka Connect 容器镜像。构建从 Red Hat Maven 存储库或其他配置的 HTTP 服务器下载必要的工件。
新创建的容器被推送到 .spec.build.output
中指定的容器 registry,用于部署 Kafka Connect 集群。AMQ Streams 构建 Kafka Connect 镜像后,您可以创建 KafkaConnector
自定义资源来启动构建中包含的连接器。
先决条件
- 您可以访问安装了集群 Operator 的 OpenShift 集群。
- AMQ Streams Operator 正在运行。
- 部署 Apache Kafka 集群,如在 OpenShift 中部署和升级 AMQ Streams 所述。
- Kafka Connect 部署在 AMQ Streams 上
- 您有红帽构建的 Debezium 许可证。
-
已安装 OpenShift
oc
CLI 客户端,或者您可以访问 OpenShift Container Platform Web 控制台。 根据您要存储 Kafka Connect 构建镜像的方式,您需要 registry 权限或您必须创建 ImageStream 资源:
- 要将构建镜像存储在镜像 registry 中,如 Red Hat Quay.io 或 Docker Hub
- 在 registry 中创建和管理镜像的帐户和权限。
- 将构建镜像存储为原生 OpenShift ImageStream
- ImageStream 资源已部署到集群中,以存储新的容器镜像。您必须为集群明确创建 ImageStream。镜像流默认不可用。如需有关 ImageStreams 的更多信息,请参阅在 OpenShift Container Platform 上管理镜像流。
流程
- 登录 OpenShift 集群。
为连接器创建 Debezium
KafkaConnect
自定义资源(CR),或修改现有的资源。例如,创建一个名为dbz-connect.yaml
的KafkaConnect
CR,用于指定metadata.annotations
和spec.build
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
例 7.1.
dbz-connect.yaml
文件,该文件定义包含 Debezium 连接器的KafkaConnect
自定义资源在以下示例中,自定义资源被配置为下载以下工件:
- Debezium PostgreSQL 连接器存档。
- 红帽构建的 Apicurio Registry 存档。Apicurio Registry 是一个可选组件。只有在打算在连接器中使用 Avro 序列化时,才添加 Apicurio Registry 组件。
- Debezium 脚本 SMT 归档以及您要与 Debezium 连接器一起使用的关联脚本引擎。SMT 归档和脚本语言依赖项是可选组件。只有在打算使用 Debezium 是 基于内容的路由 SMT 或 过滤 SMT 时,才添加这些组件。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 7.23. Kafka Connect 配置设置的描述 项 描述 1
将
strimzi.io/use-connector-resources
注解设置为"true"
,以便 Cluster Operator 使用KafkaConnector
资源在此 Kafka Connect 集群中配置连接器。2
spec.build
配置指定构建镜像的位置,并列出要在镜像中包含的插件,以及插件工件的位置。3
build.output
指定存储新构建镜像的 registry。4
指定镜像输出的名称和镜像名称。
output.type
的有效值是docker
,可推送到容器 registry,如 Docker Hub 或 Quay,或将镜像推送到内部 OpenShift ImageStream的镜像流
。要使用 ImageStream,必须将 ImageStream 资源部署到集群中。有关在 KafkaConnect 配置中指定build.output
的更多信息,请参阅在 OpenShift 中配置 AMQ Streams 中的 AMQ Streams Build schema 参考。5
插件配置
列出了您要包含在 Kafka Connect 镜像中的所有连接器。对于列表中的每个条目,指定一个插件名称
,以及有关构建连接器所需的工件的信息。另外,对于每个连接器插件,您还可以包含您要与连接器一起使用的其他组件。例如,您可以添加 Service Registry 工件或 Debezium 脚本组件。6
artifacts.type
的值指定artifacts.url
中指定的工件的文件类型。有效类型是zip
、tgz
或jar
。Debezium 连接器存档以.zip
文件格式提供。type
值必须与url
字段中引用的文件类型匹配。7
artifacts.url
的值指定 HTTP 服务器的地址,如 Maven 存储库,用于存储连接器工件的文件。Debezium 连接器工件位于 Red Hat Maven 存储库中。OpenShift 集群必须有权访问指定的服务器。8
(可选)指定用于下载 Apicurio Registry 组件的工件
类型和
url
。包括 Apicurio Registry 工件,只有在您希望连接器使用 Apache Avro 与 Red Hat build of Apicurio Registry 序列化事件键和值时,而不是使用默认的 JSON converter。9
(可选)指定 Debezium 脚本 SMT 归档的工件
类型和
url
,以用于 Debezium 连接器。只有在打算使用 Debezium 基于内容的路由 SMT 或 过滤 SMT 时使用脚本 SMT 时,才包含脚本 SMT,您必须部署 JSR 223 兼容脚本实施,如 groovy。10
(可选)为 JSR 223 兼容脚本实现的 JAR 文件指定工件
类型和
url
,这是 Debezium 脚本 SMT 所需的。重要如果您使用 AMQ Streams 将连接器插件合并到 Kafka Connect 镜像中,每个所需脚本语言组件
artifacts.url
必须指定 JAR 文件的位置,而artifacts.type
的值还必须设置为jar
。无效的值会导致连接器在运行时失败。要启用使用带有脚本 SMT 的 Apache Groovy 语言,示例中的自定义资源会检索以下库的 JAR 文件:
-
groovy
-
Groovy-jsr223
(协调代理) -
Groovy-json
(用于解析 JSON 字符串的模块)
作为替代方案,Debebe 脚本 SMT 还支持使用 GraalVM JavaScript 的 JSR 223 实现。
输入以下命令将
KafkaConnect
构建规格应用到 OpenShift 集群:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据自定义资源中指定的配置,Streams Operator 会准备要部署的 Kafka Connect 镜像。
构建完成后,Operator 将镜像推送到指定的 registry 或 ImageStream,并启动 Kafka Connect 集群。您配置中列出的连接器工件在集群中可用。创建一个
KafkaConnector
资源来定义您要部署的每个连接器的实例。
例如,创建以下KafkaConnector
CR,并将它保存为postgresql-inventory-connector.yaml
例 7.2. 为 Debezium 连接器定义
KafkaConnector
自定义资源的postgresql-inventory-connector.yaml
文件Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 7.24. 连接器配置设置的描述 项 描述 1
使用 Kafka Connect 集群注册的连接器名称。
2
连接器类的名称。
3
可同时运行的任务数量。
4
连接器的配置。
5
主机数据库实例的地址。
6
数据库实例的端口号。
7
Debezium 用于连接到数据库的帐户名称。
8
Debezium 用于连接到数据库用户帐户的密码。
9
要从中捕获更改的数据库名称。
10
数据库实例或集群的主题前缀。
指定的名称只能从字母数字字符或下划线括起。
由于主题前缀用作从这个连接器接收更改事件的任何 Kafka 主题的前缀,所以名称必须在集群中的连接器之间唯一。
此命名空间也用于相关的 Kafka Connect 模式的名称,如果您将连接器与 Avro 连接器集成,则对应的 Avro 模式的命名空间也用于。11
连接器从中捕获更改事件的表列表。
运行以下命令来创建连接器资源:
oc create -n <namespace> -f <kafkaConnector>.yaml
oc create -n <namespace> -f <kafkaConnector>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc create -n debezium -f {context}-inventory-connector.yaml
oc create -n debezium -f {context}-inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 连接器注册到 Kafka Connect 集群,并开始针对
KafkaConnector
CR 中的spec.config.database.dbname
指定的数据库运行。连接器 pod 就绪后,Debezium 正在运行。
现在,您已准备好 验证 Debezium PostgreSQL 部署。
要部署 Debezium PostgreSQL 连接器,您需要构建包含 Debezium 连接器存档的自定义 Kafka Connect 容器镜像,并将此容器镜像推送到容器 registry。然后,您需要创建两个自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR。CR 中的image
属性指定您创建用来运行 Debezium 连接器的容器镜像的名称。您可以将此 CR 应用到部署了 Red Hat AMQ Streams 的 OpenShift 实例。AMQ Streams 提供将 Apache Kafka 引入到 OpenShift 的 operator 和镜像。 -
定义 Debezium Db2 连接器的
KafkaConnector
CR。将此 CR 应用到应用KafkaConnect
CR 的相同 OpenShift 实例。
先决条件
- PostgreSQL 正在运行,并执行 了设置 PostgreSQL 来运行 Debezium 连接器 的步骤。
- AMQ Streams 部署在 OpenShift 上,并运行 Apache Kafka 和 Kafka Connect。如需更多信息,请参阅在 OpenShift 中部署和升级 AMQ Streams。
- podman 或 Docker 已安装。
-
您有在容器 registry 中创建和管理容器(如
quay.io
或docker.io
)的帐户和权限,您要向其添加将运行 Debezium 连接器的容器。
流程
为 Kafka Connect 创建 Debezium PostgreSQL 容器:
创建一个 Dockerfile,它使用
registry.redhat.io/amq7/amq-streams-kafka-32-rhel8:2.2.0-12
作为基础镜像。例如,在终端窗口中输入以下命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
您可以指定您想要的任何文件名。
2
指定 Kafka Connect 插件目录的路径。如果您的 Kafka Connect 插件目录位于不同的位置,请将这个路径替换为您的目录的实际路径。
该命令在当前目录中创建一个名为
debezium-container-for-postgresql.yaml
的 Dockerfile。从您在上一步中创建的
debezium-container-for-postgresql.yaml
Docker 文件中构建容器镜像。在包含该文件的目录中,打开终端窗口并输入以下命令之一:podman build -t debezium-container-for-postgresql:latest .
podman build -t debezium-container-for-postgresql:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker build -t debezium-container-for-postgresql:latest .
docker build -t debezium-container-for-postgresql:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow build
命令构建名为debezium-container-for-postgresql
的容器镜像。将自定义镜像推送到容器 registry,如
quay.io
或内部容器 registry。容器 registry 必须可供部署镜像的 OpenShift 实例使用。输入以下命令之一:podman push <myregistry.io>/debezium-container-for-postgresql:latest
podman push <myregistry.io>/debezium-container-for-postgresql:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker push <myregistry.io>/debezium-container-for-postgresql:latest
docker push <myregistry.io>/debezium-container-for-postgresql:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建新的 Debezium PostgreSQL
KafkaConnect
自定义资源(CR)。例如,创建一个名为dbz-connect.yaml
的KafkaConnect
CR,用于指定注解和
镜像
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
metadata.annotations
表示KafkaConnector
资源用于配置在这个 Kafka Connect 集群中使用的 Cluster Operator。2
spec.image
指定您为运行 Debezium 连接器而创建的镜像名称。此属性覆盖 Cluster Operator 中的STRIMZI_DEFAULT_KAFKA_CONNECT_IMAGE
变量。运行以下命令,将
KafkaConnect
CR 应用到 OpenShift Kafka 实例:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会更新 OpenShift 中的 Kafka Connect 环境,以添加 Kafka Connector 实例,用于指定您为运行 Debezium 连接器而创建的镜像名称。
创建一个
KafkaConnector
自定义资源来配置 Debezium PostgreSQL 连接器实例。您可以在
.yaml
文件中配置 Debezium PostgreSQL 连接器,该文件指定连接器的配置属性。连接器配置可能会指示 Debezium 为 schema 和表的子集生成事件,或者可能会设置属性,以便 Debezium 忽略敏感、太大或不需要的指定栏中的值。有关您可以为 Debezium PostgreSQL 连接器设置的配置属性的完整列表,请参阅 PostgreSQL 连接器属性。以下示例显示了一个自定义资源的摘录,该资源在端口
5432
上配置 Debezium 连接器,连接到 PostgreSQL 服务器主机192.168.99.100
。此主机有一个名为sampledb
的数据库,名为public
的模式,inventory-connector-postgresql
是服务器的逻辑名称。inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1 1 1 1 1
- 连接器的名称。
- 2 2 2 2 2
- 任何时候只能有一个任务。由于 PostgreSQL 连接器读取 PostgreSQL 服务器的
binlog
,因此使用单一连接器任务可以确保正确的顺序和事件处理。Kafka Connect 服务使用连接器启动一个或多个可以正常工作的任务,并在 Kafka Connect 服务集群中自动分发运行的任务。如果有任何服务停止或崩溃,这些任务将重新分发到运行的服务。 - 3 3 3
- 连接器的配置。
- 4 4 4
- 运行 PostgreSQL 服务器的数据库主机的名称。在本例中,数据库主机名为
192.168.99.100
。 - 5 5 5
- 唯一的主题前缀。服务器名称是 PostgreSQL 服务器或服务器集群的逻辑标识符。此名称用作接收更改事件记录的所有 Kafka 主题的前缀。
- 6 6 6
- 连接器只捕获
公共
模式中的更改。可以配置连接器来捕获您选择的表中的更改。如需更多信息,请参阅table.include.list
。 - 7 7 7
- 在 PostgreSQL 服务器上安装 PostgreSQL 逻辑解码插件的名称。虽然 PostgreSQL 10 及更新版本唯一支持的值是
pgoutput
,但您必须将plugin.name
明确设置为pgoutput
。
使用 Kafka Connect 创建连接器实例。例如,如果您将
KafkaConnector
资源保存到inventory-connector.yaml
文件中,您将运行以下命令:oc apply -f inventory-connector.yaml
oc apply -f inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会注册
inventory-connector
,连接器开始针对KafkaConnector
CR 中定义的sampledb
数据库运行。
结果
连接器启动后,它会对配置了连接器的 PostgreSQL 服务器数据库 执行一致的快照。然后,连接器开始为行级操作生成数据更改事件,并将事件记录流传输到 Kafka 主题。
7.6.4. 验证 Debezium PostgreSQL 连接器是否正在运行 复制链接链接已复制到粘贴板!
如果连接器正确启动且没有错误,它会为每个连接器配置为捕获的表创建一个主题。下游应用程序可以订阅这些主题以检索源数据库中发生的信息事件。
要验证连接器是否正在运行,您可以从 OpenShift Container Platform Web 控制台或 OpenShift CLI 工具(oc)执行以下操作:
- 验证连接器状态。
- 验证连接器是否生成主题。
- 验证主题是否填充了每个表初始快照过程中生成的读操作("op":"r")的事件。
先决条件
- Debezium 连接器部署到 OpenShift 上的 AMQ Streams。
-
已安装 OpenShift
oc
CLI 客户端。 - 访问 OpenShift Container Platform web 控制台。
流程
使用以下方法之一检查
KafkaConnector
资源的状态:在 OpenShift Container Platform Web 控制台中:
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 以打开 Select Resource 复选框,然后键入
KafkaConnector
。 - 在 KafkaConnectors 列表中,点您要检查的连接器的名称,如 inventory-connector-postgresql。
- 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc describe KafkaConnector <connector-name> -n <project>
oc describe KafkaConnector <connector-name> -n <project>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc describe KafkaConnector inventory-connector-postgresql -n debezium
oc describe KafkaConnector inventory-connector-postgresql -n debezium
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 7.3.
KafkaConnector
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证连接器是否已创建 Kafka 主题:
通过 OpenShift Container Platform Web 控制台。
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 打开 Select Resource 复选框,然后键入
KafkaTopic
。 -
在 KafkaTopics 列表中,点您要检查的主题的名称,例如
inventory-connector-postgresql.inventory.orders--ac5e98ac6a5d91e04d8ec0dc9078a1ece439081d
。 - 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc get kafkatopics
oc get kafkatopics
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 7.4.
KafkaTopic
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
检查主题内容。
- 在终端窗口中输入以下命令:
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-postgresql.inventory.products_on_hand
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-postgresql.inventory.products_on_hand
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定主题名称的格式与
oc describe
命令的格式在第 1 步中返回,例如inventory-connector-postgresql.inventory.addresses
。对于主题中的每个事件,命令会返回类似以下输出的信息:
例 7.5. Debezium 更改事件的内容
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-postgresql.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-postgresql.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-postgresql.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.postgresql.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-postgresql.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"postgresql","name":"inventory-connector-postgresql","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"postgresql-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-postgresql.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-postgresql.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-postgresql.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.postgresql.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-postgresql.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"postgresql","name":"inventory-connector-postgresql","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"postgresql-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,
有效负载
值显示连接器快照从表inventory.products_on_hand
中生成一个读取("op" ="r"
)事件。product_id
记录的"before"
状态为null
,这表示记录没有之前的值。"after"
状态对于product_id
为101
的项目的quantity
显示为3
。
7.6.5. Debezium PostgreSQL 连接器配置属性的描述 复制链接链接已复制到粘贴板!
Debezium PostgreSQL 连接器有许多配置属性,您可以使用它们来实现应用程序的正确连接器行为。许多属性具有默认值。有关属性的信息按如下方式进行组织:
除非默认值可用 , 否则需要以下配置属性。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 | 连接器的唯一名称。尝试再次使用相同的名称注册将失败。所有 Kafka Connect 连接器都需要此属性。 | |
没有默认值 |
连接器的 Java 类的名称。对于 PostgreSQL 连接器,始终使用 | |
| 应该为此连接器创建的最大任务数量。PostgreSQL 连接器始终使用单个任务,因此不要使用这个值,因此始终可以接受默认值。 | |
| 在 PostgreSQL 服务器上安装 PostgreSQL 逻辑解码插件的名称。
唯一支持的值是 | |
| 为特定数据库/架构的特定插件创建的 PostgreSQL 逻辑解码插槽的名称。服务器使用此插槽将事件流传输到您要配置的 Debezium 连接器。 插槽名称必须符合 PostgreSQL 复制插槽命名规则,它的状态:"每个复制插槽都有一个名称,可以包含小写字母、数字和下划线字符"。 | |
| 当连接器以安全、预期的方式停止时,是否删除逻辑复制插槽。默认行为是,当连接器停止时,复制插槽仍然为连接器配置。当连接器重启时,具有相同的复制插槽可让连接器在离开的地方开始处理。
仅在测试或开发环境中设置为 | |
|
使用 如果尚未存在且 包含所有表,则在启动时会创建此发布。然后,Debezium 应用自己的 include/exclude 列表过滤(如果已配置),以限制发布以更改感兴趣的事件。连接器用户必须有超级用户权限才能创建此发布,因此通常会在首次启动连接器前创建发布。 如果发布已存在,对于所有表,或配置了表子集,Debezium 会使用其定义发布。 | |
没有默认值 | PostgreSQL 数据库服务器的 IP 地址或主机名。 | |
| PostgreSQL 数据库服务器的整数端口号。 | |
没有默认值 | 用于连接到 PostgreSQL 数据库服务器的 PostgreSQL 数据库用户的名称。 | |
没有默认值 | 连接到 PostgreSQL 数据库服务器时要使用的密码。 | |
没有默认值 | 要从中流传输更改的 PostgreSQL 数据库的名称。 | |
没有默认值 |
为 Debezium 捕获更改的特定 PostgreSQL 数据库服务器或集群提供命名空间的主题前缀。前缀在所有其他连接器中应该是唯一的,因为它用作从这个连接器接收记录的所有 Kafka 主题的主题名称前缀。数据库服务器逻辑名称中只能使用字母数字字符、连字符、句点和下划线。 警告 不要更改此属性的值。如果您更改了 name 值,重启后,而不是继续向原始主题发出事件,连接器会将后续事件发送到名称基于新值的主题。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与您要 捕获更改的模式的名称匹配。任何未包含在 schema.
要匹配架构的名称,Debezium 应用您指定的正则表达式,以 替代 的正则表达式。也就是说,指定的表达式与架构的完整标识符匹配,它与 schema 名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与 您不想 捕获更改的模式的名称匹配。任何名称没有包含在 schema.
要匹配架构的名称,Debezium 应用您指定的正则表达式,以 替代 的正则表达式。也就是说,指定的表达式与架构的完整标识符匹配,它与 schema 名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与您要捕获更改的表的完全限定表标识符匹配。当设置此属性时,连接器只从指定的表中捕获更改。每个标识符的格式都是 schemaName。tableName。默认情况下,连接器捕获捕获更改的每个模式中的每个非系统表中的更改。
要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个标识符匹配;它与表名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与您不想捕获更改的表的完全限定表标识符匹配。每个标识符的格式都是 schemaName。tableName。当设置此属性时,连接器会捕获您指定的每个表中的更改。
要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个标识符匹配;它与表名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与应包含在更改事件记录值中的列的完全限定名称匹配。列的完全限定域名格式为 schemaName。tableName.columnName。
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,表达式用于匹配列的整个名称字符串;它与列名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与应该从更改事件记录值中排除的列的完全限定名称匹配。列的完全限定域名格式为 schemaName。tableName.columnName。
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,表达式用于匹配列的整个名称字符串;它与列名称中可能存在的子字符串不匹配。 | |
|
时间、日期和时间戳可以通过不同类型的精度表示: | |
|
指定连接器应该如何处理 | |
|
指定连接器应该如何处理 | |
|
指定连接器应该如何处理 | |
|
是否使用加密连接到 PostgreSQL 服务器。选项包括: | |
没有默认值 | 包含客户端的 SSL 证书的文件的路径。如需更多信息 ,请参阅 PostgreSQL 文档。 | |
没有默认值 | 包含客户端 SSL 私钥的文件的路径。如需更多信息 ,请参阅 PostgreSQL 文档。 | |
没有默认值 |
从 | |
没有默认值 | 包含服务器验证的根证书的文件路径。如需更多信息 ,请参阅 PostgreSQL 文档。 | |
| 启用 TCP keep-alive 探测以验证数据库连接是否仍然处于活动状态。如需更多信息 ,请参阅 PostgreSQL 文档。 | |
|
控制 删除 事件是否随后是 tombstone 事件。 | |
不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。如果您要在一组列中超过属性名称中指定的字符数时,设置此属性。将
列的完全限定域名会观察以下格式:< 您可以在单个配置中指定多个长度不同的属性。 | |
不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。如果您希望连接器屏蔽一组列的值,例如,如果它们包含敏感数据,则设置此属性。将 列的完全限定域名会观察以下格式: schemaName.tableName.columnName。要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配;表达式不匹配列名称中可能存在的子字符串。 您可以在单个配置中指定多个长度不同的属性。 | |
| 不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。列的完全限定域名格式为 < schemaName>。<tableName & gt; . <columnName>。
一个 pseudonym,它包括了通过应用指定的 hashAlgorithm 和 salt 的结果的哈希值。根据使用的 hash 功能,会维护引用完整性,而列值则替换为伪nyms。支持的哈希功能在 Java Cryptography 架构标准算法名称文档中的 MessageDigest 部分 进行了描述。 column.mask.hash.SHA-256.with.salt.CzQMA0cB5K = inventory.orders.customerName, inventory.shipment.customerName
如有必要,伪的nym 会自动缩短到列的长度。连接器配置可以包含多个指定不同哈希算法和 salt 的属性。 |
不适用 | 可选的、以逗号分隔的正则表达式列表,它与您希望连接器发送代表列元数据的完全限定名称匹配。当设置此属性时,连接器会将以下字段添加到事件记录的架构中:
这些参数分别传播列的原始类型和长度(用于变量带宽类型)。
列的完全限定域名会观察以下格式之一: databaseName.tableName.columnName, 或 databaseName.schemaName.tableName.columnName. | |
不适用 | 可选的、以逗号分隔的正则表达式列表,用于指定为数据库列定义的数据类型的完全限定名称。当设置此属性时,对于具有匹配数据类型的列,连接器会发出事件记录,该记录在 schema 中包含以下额外字段:
这些参数分别传播列的原始类型和长度(用于变量带宽类型)。
列的完全限定域名会观察以下格式之一: databaseName.tableName.typeName, 或 databaseName.schemaName.tableName.typeName. 有关 PostgreSQL 特定数据类型名称的列表,请查看 PostgreSQL 数据类型映射。 | |
空字符串 | 指定连接器用来组成自定义消息键的表达式列表,以更改它发布到指定表的 Kafka 主题的事件记录。
默认情况下,Debezium 使用表的主键列作为它发出的记录的消息键。对于缺少主密钥的表,或者指定缺少主密钥的表的密钥,您可以根据一个或多个列配置自定义消息密钥。
每个完全限定表名称都是正则表达式,格式为: 对您用来创建自定义消息键的列数没有限制。但是,最好使用指定唯一密钥所需的最小数量。 | |
all_tables |
仅在使用 | |
bytes |
指定二进制( | |
none |
指定如何调整架构名称,以便与连接器使用的消息转换器兼容。可能的设置:
| |
|
指定在将 Postgres 领导类型转换为 | |
没有默认值 | 可选的、以逗号分隔的正则表达式列表,与您希望连接器捕获的逻辑解码消息前缀的名称匹配。默认情况下,连接器捕获所有逻辑解码信息。当设置此属性时,连接器只捕获具有属性指定的前缀的逻辑解码消息。所有其他逻辑解码信息都会被排除。 要匹配消息前缀的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与整个消息前缀长度匹配;表达式与前缀中可能存在的子字符串不匹配。
如果您在配置中包含此属性,不要设置 有关 消息 事件结构及其排序语义的信息,请参考 消息 事件。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,它与您不想连接器捕获的逻辑解码消息前缀的名称匹配。当设置此属性时,连接器不会捕获使用指定前缀的逻辑解码消息。所有其他消息都会被捕获。 要匹配消息前缀的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与整个消息前缀长度匹配;表达式与前缀中可能存在的子字符串不匹配。
如果您在配置中包含此属性,不要设置 有关 消息 事件结构及其排序语义的信息,请参考 消息 事件。 |
以下 高级配置 属性具有在大多数情况下工作的默认值,因此很少需要在连接器配置中指定。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 |
枚举连接器可以使用 的自定义转换器 实例的符号名称的逗号分隔列表。例如,
您必须设置
对于您为连接器配置的每个转换器,还必须添加一个
例如, isbn.type: io.debezium.test.IsbnConverter
如果要进一步控制配置的转换器的行为,您可以添加一个或多个配置参数将值传递给转换器。要将任何其他配置参数与转换器关联,请将参数名称与转换器的符号链接名称添加前缀。 isbn.schema.name: io.debezium.postgresql.type.Isbn
| |
|
指定在连接器启动时执行快照的条件: | |
|
可选的、以逗号分隔的正则表达式列表,与表的完全限定名称(< 要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
| 正整数值,用于指定在执行快照时等待获取表锁定的最长时间(以毫秒为单位)。如果连接器无法在这个时间段内获取表锁定,则快照会失败。连接器如何提供快照 提供详情。 | |
没有默认值 | 指定要包含在快照中的表行。如果您希望快照仅在表中包括行的子集,请使用此属性。此属性仅影响快照。它不适用于连接器从日志中读取的事件。
属性包含一个以逗号分隔的表名称列表,格式为 <
在包含 soft-delete 列 "snapshot.select.statement.overrides": "customer.orders", "snapshot.select.statement.overrides.customer.orders": "SELECT * FROM [customers].[orders] WHERE delete_flag = 0 ORDER BY id DESC"
在生成的快照中,连接器仅包含 | |
|
指定连接器在处理事件过程中应如何响应异常: | |
| 正整数值,用于指定连接器进程每个批处理的最大大小。 | |
|
正整数值,用于指定阻塞队列可以保存的最大记录数。当 Debezium 从数据库读取事件时,它会将事件放置在阻塞队列中,然后再将它们写入 Kafka。当连接器将消息写入 Kafka 或 Kafka 不可用时,阻塞队列可以提供从数据库读取更改事件的后端。当连接器定期记录偏移时,队列中保存的事件会被忽略。始终将 | |
|
较长的整数值,指定块队列的最大卷(以字节为单位)。默认情况下,不会为阻塞队列指定卷限制。要指定队列可以使用的字节数,请将此属性设置为正长值。 | |
| 正整数值,用于指定连接器在处理批处理事件前应该等待出现新更改事件的毫秒数。默认值为 500 毫秒。 | |
|
当连接器遇到数据类型未知的字段时,指定连接器行为。默认行为是连接器从更改事件省略字段并记录警告。 注意
当 | |
没有默认值 |
连接器建立与数据库的 JDBC 连接时执行的、以逗号分隔的 SQL 语句列表。要将分号用作字符而不是分隔符,请指定两个连续分号 | |
|
以毫秒为单位向服务器发送复制连接状态更新的频率。 | |
|
控制连接器将心跳信息发送到 Kafka 主题的频率。默认行为是连接器不会发送心跳信息。 | |
没有默认值 |
指定连接器发送心跳消息时连接器在源数据库上执行的查询。 | |
|
指定为表触发刷新内存模式的条件。 | |
没有默认值 | 连接器在连接器启动时应等待的时间(毫秒)。如果您要在集群中启动多个连接器,此属性对于避免快照中断非常有用,这可能会导致连接器重新平衡。 | |
| 在快照中,连接器以行批处理形式读取表内容。此属性指定批处理中的最大行数。 | |
没有默认值 |
用于传递给配置的逻辑解码插件的参数的分号分隔列表。例如, | |
如果连接器配置将
如果没有,则为 | 指明是否清理字段名称以遵循 Avro 命名要求。 | |
| 如果连接到复制插槽失败,这是连续尝试连接的最大次数。 | |
| 连接器无法连接到复制插槽时重试尝试之间等待的时间。 | |
|
指定连接器提供的常量值,以指示原始值是不是由数据库提供的粘贴值。如果 | |
|
确定连接器是否生成带有事务边界的事件,并使用事务元数据增强更改事件。如果您希望连接器进行此操作,请指定 | |
|
确定连接器是否应该提交源 postgres 数据库中已处理的记录的 LSN,以便删除 WAL 日志。如果您不希望连接器进行此操作,请指定 | |
10000 (10 秒) | 在发生可分配错误后重启连接器前要等待的毫秒数量。 | |
|
以逗号分隔的操作类型列表,这些类型将在流期间跳过。操作包括: | |
没有默认值 |
用于向连接器发送信号的数据收集的完全限定名称。 | |
1024 | 连接器在增量快照块期间获取并读取内存的最大行数。增加块大小可提高效率,因为快照会运行更大的快照查询。但是,较大的块大小还需要更多内存来缓冲快照数据。将块大小调整为在您的环境中提供最佳性能的值。 | |
|
从复制插槽中读取 XMIN 的频率(以毫秒为单位)。XMIN 值提供从其开始新复制插槽的下限。默认值为 | |
|
应该用来决定数据更改的主题名称、模式更改、事务、心跳事件等的 TopicNamingStrategy 类的名称,默认为 | |
|
指定主题名称的分隔符,默认为 | |
| 用于在绑定并发哈希映射中保存主题名称的大小。此缓存有助于确定与给定数据收集对应的主题名称。 | |
|
控制连接器向发送心跳消息的主题名称。主题名称具有此模式: | |
|
控制连接器向发送事务元数据消息的主题名称。主题名称具有此模式: |
直通连接器配置属性
连接器还支持在创建 Kafka producer 和消费者时使用的 直通 配置属性。
请务必查阅 Kafka 文档,了解 Kafka 生成者和消费者的所有配置属性。PostgreSQL 连接器 使用新的消费者配置属性。
7.7. 监控 Debezium PostgreSQL 连接器性能 复制链接链接已复制到粘贴板!
Debezium PostgreSQL 连接器除了对 Zookeeper、Kafka 和 Kafka Connect 提供的 JMX 指标的内置支持外,还提供两种类型的指标。
Debezium 监控文档 提供了有关如何使用 JMX 公开这些指标的详细信息。
7.7.1. 在 PostgreSQL 数据库的快照期间监控 Debezium 复制链接链接已复制到粘贴板!
MBean 是 debezium.postgres:type=connector-metrics,context=snapshot,server= <postgresql.server.name>
。
除非快照操作处于活跃状态,否则快照指标不会被公开,或者快照自上次连接器启动后发生。
下表列出了可用的 shapshot 指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个快照事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器从上次启动或重置后看到的事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 包括在快照中的表的总数。 | |
| 快照要复制的表数。 | |
| 快照是否启动。 | |
| 快照是否暂停。 | |
| 快照是否中止。 | |
| 快照是否完成。 | |
| 快照目前花费的秒数,即使未完成也是如此。还包括快照暂停时的时间。 | |
| 快照暂停的秒数。如果快照暂停多次,则暂停的时间会增加。 | |
| 包含快照中每个表扫描的行数的映射。表在处理期间逐步添加到映射中。更新每个 10,000 行扫描,并在完成表后更新。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
在执行增量快照时,连接器还提供以下额外快照指标:
7.7.2. 监控 Debezium PostgreSQL 连接器记录流 复制链接链接已复制到粘贴板!
MBean 是 debezium.postgres:type=connector-metrics,context=streaming,server= <postgresql.server.name>
。
下表列出了可用的流指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个流事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器自上次开始或指标重置以来看到的事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的创建事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的更新事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的删除事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 表示连接器当前是否连接到数据库服务器的标记。 | |
| 最后一次更改事件时间戳和连接器处理之间毫秒的数量。该值将限制运行数据库服务器和连接器的机器上时钟之间的差别。 | |
| 已提交的已处理的事务数量。 | |
| 最后一次接收的事件的协调。 | |
| 最后一次处理的事务的事务标识符。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
7.8. Debezium PostgreSQL 连接器如何处理错误和问题 复制链接链接已复制到粘贴板!
Debezium 是一个分布式系统,可捕获多个上游数据库中的所有更改,永远不会丢失或丢失事件。当系统正常运行或被仔细管理时,Debezium 会在每次更改事件记录时 完全 提供。
如果发生错误,系统将不会丢失任何事件。但是,当它从故障中恢复时,可能会重复一些更改事件。在这些异常情况下,Debebe (如 Kafka)提供 至少一次 更改事件。
详情包括在以下部分:
配置和启动错误
在以下情况下,当尝试启动时连接器会失败,在日志中报告错误/过期,并停止运行:
- 连接器的配置无效。
- 连接器无法使用指定的连接参数成功连接到 PostgreSQL。
- 连接器从 PostgreSQL WAL 中的之前记录的位置(使用 LSN)重启,PostgreSQL 不再有该历史记录可用。
在这些情况下,错误消息包含有关此问题的详细信息,并可能会有推荐的临时解决方案。在更正配置或解决 PostgreSQL 问题后,重启连接器。
外部 PostgreSQL 连接器以 PostgreSQL LSN 的形式存储最后处理的偏移量。连接器重启并连接到服务器实例后,连接器与服务器通信,以继续从该特定偏移流。只要 Debezium 复制插槽保持不变,这个偏移就可用。永远不会在主服务器上丢弃复制插槽,否则您将丢失数据。有关删除插槽的故障问题单的详情,请查看下一部分。
集群故障
自版本 12 起,PostgreSQL 只能在主服务器中进行 逻辑复制插槽。这意味着您可以将 Debezium PostgreSQL 连接器指向数据库集群的活动的主服务器。另外,复制插槽本身不会传播到副本。如果主服务器停机,则必须提升新的主服务器。
一些管理的 PostgresSQL 服务(例如,AWS RDS 和 GCP CloudSQL)通过磁盘复制将复制实施到备用状态。这意味着复制插槽将复制,并在故障切换后仍然可用。
新的主插槽必须有一个复制插槽,该插槽被配置为由 pgoutput
插件和您要捕获更改的数据库使用。只有然后您只能将连接器指向新的服务器并重启连接器。
发生故障转移时需要考虑重要注意事项,您应该暂停 Debezium,直到您验证是否有没有丢失数据的不完整的复制插槽。故障转移后:
- 在允许应用程序 写入新 主前,必须有一个重新创建 Debezium 复制插槽的进程。这很重要。如果没有此过程,您的应用程序可能会丢失更改事件。
- 您可能需要验证 Debezium 是否能够 在旧主失败前读取插槽中的所有更改。
恢复和验证是否存在任何更改的可靠方法是,在失败前马上将故障主到点的备份恢复。虽然这在管理上比较困难,但它允许您检查复制插槽是否有任何未恢复的更改。
Kafka Connect 进程安全停止
假设 Kafka Connect 在分布式模式下运行,并且 Kafka Connect 进程安全停止。在关闭此过程前,Kafka Connect 会将进程的连接器任务迁移到该组中的另一个 Kafka Connect 进程。新的连接器任务开始处理之前的任务停止的位置。处理会有一个短暂的延迟,同时连接器任务安全停止并在新进程中重启。
Kafka Connect 进程崩溃
如果 Kafka Connector 进程意外停止,则其运行的任何连接器任务会在不记录最近处理的偏移量的情况下终止。当 Kafka Connect 以分布式模式运行时,Kafka Connect 会在其他进程中重启这些连接器任务。但是,PostgreSQL 连接器会从之前进程 记录 的最后一个偏移中恢复。这意味着,新替换任务可能会生成一些在崩溃前处理的相同更改事件。重复事件的数量取决于偏移清除周期,以及数据在崩溃前更改的卷。
由于某些事件在从故障中恢复过程中可能会重复,因此消费者应始终预计一些重复事件。Debezium 更改是幂等的,因此一系列事件总会产生相同的状态。
在每个更改事件记录中,Debezium 连接器都会插入有关事件来源的特定于源的信息,包括 PostgreSQL 服务器事件的时间、服务器事务的 ID,以及写入事务更改的位置。消费者可以跟踪此信息,特别是 LSN,以确定事件是否是重复的。
连接器在持续时间内停止
如果连接器安全停止,可以使用数据库。所有更改都会记录在 PostgreSQL WAL 中。当连接器重启时,它会恢复流更改。也就是说,它为连接器停止时所做的所有数据库更改生成更改事件记录。
正确配置的 Kafka 集群可以处理大量吞吐量。Kafka Connect 根据 Kafka 最佳实践编写,并有足够的资源处理大量数据库更改事件。因此,在停止一段时间后,当 Debezium 连接器重启时,可能会捕获到数据库更改,这在停止时发生。发生这种情况的速度取决于 Kafka 的功能和性能以及 PostgreSQL 中对数据所做的更改卷。
第 8 章 SQL Server 的 Debezium 连接器 复制链接链接已复制到粘贴板!
Debezium SQL Server 连接器捕获 SQL Server 数据库架构中发生的行级更改。
有关与此连接器兼容的 SQL Server 版本的详情,请参考 Debezium 支持的配置页面。
有关 Debezium SQL Server 连接器及其用法的详情,请查看以下主题:
- 第 8.1 节 “Debezium SQL Server 连接器概述”
- 第 8.2 节 “Debezium SQL Server 连接器如何工作”
- 第 8.2.7 节 “Debezium SQL Server 连接器数据更改事件的描述”
- 第 8.2.9 节 “Debezium SQL Server 连接器如何映射数据类型”
- 第 8.3 节 “设置 SQL Server 以运行 Debezium 连接器”
- 第 8.4 节 “部署 Debezium SQL Server 连接器”
- 第 8.5 节 “在模式更改后刷新捕获表”
- 第 8.6 节 “监控 Debezium SQL Server 连接器性能”
Debezium SQL Server 连接器第一次连接到 SQL Server 数据库或集群时,它会对数据库中的架构进行一致的快照。完成初始快照后,连接器持续捕获到为 CDC 启用的 SQL Server 数据库的 INSERT
、UPDATE
或 DELETE
操作的行级更改。连接器为每个数据更改操作生成事件,并将其流传输到 Kafka 主题。连接器将表的所有事件流传输到专用 Kafka 主题。然后,应用程序和服务可能会消耗该主题中的数据更改事件记录。
8.1. Debezium SQL Server 连接器概述 复制链接链接已复制到粘贴板!
Debezium SQL Server 连接器基于 SQL Server 2016 Service Pack 1 (SP1)以及后续 标准版本或企业版本 中的更改数据捕获 功能。SQL Server 捕获进程监控指定的数据库和表,并将更改存储在特定创建的 change tables 中。
要启用 Debezium SQL Server 连接器来捕获数据库操作的更改事件记录,您必须首先在 SQL Server 数据库上启用更改数据捕获。在数据库和您要捕获的每个表中都必须启用 CDC。在源数据库上设置 CDC 后,连接器可以捕获数据库中发生的行级 INSERT
、UPDATE
和 DELETE
操作。连接器将每个源表的事件记录写入特定于该表的 Kafka 主题。每个捕获的表都有一个主题。客户端应用程序读取它们遵循的数据库表的 Kafka 主题,并可响应他们从这些主题使用的行级事件。
连接器第一次连接到 SQL Server 数据库或集群时,它会为它配置的所有表生成一致的快照来捕获更改,并将此状态流传输到 Kafka。快照完成后,连接器会持续捕获发生的后续行级更改。通过首先建立所有数据的一致性视图,连接器可以继续读取,而不会丢失快照发生时所做的任何更改。
Debezium SQL Server 连接器容错失败。当连接器读取更改并生成事件时,它会定期记录数据库日志中事件的位置(LSN / Log Sequence Number)。如果连接器因任何原因而停止(包括通信失败、网络问题或崩溃),在重启连接器从它读取的最后一个时间点上读取 SQL Server CDC 表。
偏移会定期提交。它们不会在发生更改事件时提交。因此,可能会在中断后生成重复的事件。
容错也适用于快照。也就是说,如果连接器在快照过程中停止,连接器会在重启时开始新的快照。
8.2. Debezium SQL Server 连接器如何工作 复制链接链接已复制到粘贴板!
为了最佳配置和运行 Debezium SQL Server 连接器,了解连接器如何执行快照、流更改事件、决定 Kafka 主题名称以及使用元数据会很有帮助。
有关连接器如何工作的详情,请查看以下部分:
8.2.1. Debezium SQL Server 连接器如何执行数据库快照 复制链接链接已复制到粘贴板!
SQL Server CDC 不设计存储数据库更改的完整历史记录。对于 Debezium SQL Server 连接器,为数据库当前状态建立基准,它使用名为 snapshotting 的进程。
您可以配置连接器如何创建快照。默认情况下,连接器的快照模式被设置为 initial
。根据这个 初始
快照模式,连接器首次启动时,它会执行数据库的初始 一致性快照。此初始快照捕获了与为连接器配置的 include
和 exclude
属性定义的任何表的结构和数据(例如 table.include.list
、column.include.list
、table.exclude.list
等)。
当连接器创建快照时,它会完成以下任务:
- 决定要捕获的表。
-
获取启用 CDC 的 SQL Server 表上的锁定,以防止在创建快照时发生结构更改。锁定的级别由
snapshot.isolation.mode
配置选项决定。 - 在服务器的事务日志中读取最大日志序列号(LSN)位置。
- 捕获所有相关表的结构。
- 释放在第 2 步中获取的锁定(如果需要)。在大多数情况下,锁定只会保留短时间内。
-
根据在第 3 步中读取的 LSN 位置扫描 SQL Server 源表和模式,为表中的每一行生成一个
READ
事件,并将事件写入表的 Kafka 主题。 - 在连接器偏移中记录成功完成快照。
生成的初始快照捕获为 CDC 启用的表中的每行的当前状态。在这个基准状态中,连接器会捕获后续更改。
8.2.1.1. 临时快照 复制链接链接已复制到粘贴板!
默认情况下,连接器仅在首次启动后运行初始快照操作。在正常情况下,遵循这个初始快照,连接器不会重复快照过程。连接器捕获的任何将来更改事件数据都仅通过流传输过程。
然而,在某些情况下,连接器在初始快照期间获取的数据可能会变得过时、丢失或不完整。为了提供总结表数据的机制,Debezium 包含一个执行临时快照的选项。数据库中的以下更改可能是执行临时快照:
- 连接器配置会被修改为捕获不同的表集合。
- Kafka 主题已删除,必须重建。
- 由于配置错误或某些其他问题导致数据损坏。
您可以通过启动所谓的 临时命令快照,为之前捕获的快照重新运行快照。临时快照需要使用 信号表。您可以通过向 Debezium 信号表发送信号请求来启动临时快照。
当您启动现有表的临时快照时,连接器会将内容附加到表已存在的主题中。如果删除了之前存在的主题,如果启用自动主题创建,Debezium 可以自动创建主题。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#customization-of-kafka-connect-automatic-topic-creation
临时快照信号指定要包含在快照中的表。快照可以捕获数据库的整个内容,或者只捕获数据库中表的子集。另外,快照也可以捕获数据库中表内容的子集。
您可以通过向信号表发送 execute-snapshot
消息来指定要捕获的表。将 execute-snapshot
信号的类型设置为增量
,并提供快照中包含的表名称,如下表所述:
字段 | 默认 | 值 |
---|---|---|
|
|
指定您要运行的快照类型。 |
| 不适用 |
包含与要快照的表的完全限定域名匹配的正则表达式的数组。 |
| 不适用 | 可选字符串,它根据表的列指定条件,用于捕获表内容的子集。 |
触发临时快照
您可以通过在信号表中添加带有 execute-snapshot
信号类型的条目来启动临时快照。连接器处理消息后,它会开始快照操作。快照过程读取第一个和最后一个主密钥值,并使用这些值作为每个表的开头和端点。根据表中的条目数量以及配置的块大小,Debezium 将表分成块,并一次为每个块进行快照。
8.2.1.2. 增量快照 复制链接链接已复制到粘贴板!
为了提供管理快照的灵活性,Debezium 包括一个补充的快照机制,称为 增量快照。增量快照依赖于 Debezium 机制 向 Debezium 连接器发送信号。
在增量快照中,而不是一次性捕获数据库的完整状态,如初始快照,Debezium 以一系列可配置的块的形式捕获每个表。您可以指定您希望快照捕获的表,以及每个块的大小。块大小决定了快照在数据库的每个获取操作期间收集的行数。增量快照的默认块大小为 1 KB。
当增量快照进行时,Debezium 使用水位线来跟踪其进度,维护它捕获的每一个表行的记录。这个阶段捕获数据的方法比标准初始快照过程提供以下优点:
- 您可以使用流化数据捕获并行运行增量快照,而不是经过发布流,直到快照完成为止。连接器会继续在整个快照过程中从更改日志捕获接近实时事件,且操作都不会阻断其他事件。
- 如果增量快照的进度中断,您可以在不丢失任何数据的情况下恢复它。在进程恢复后,快照从停止的时间开始,而不是从开始重新定义表。
-
您可以随时根据需要运行增量快照,并根据需要重复这个过程以适应数据库更新。例如,您可以在修改连接器配置后重新运行快照,以将表添加到其
table.include.list
属性中。
增量快照过程
当您运行增量快照时,Debezium 按主密钥对表进行排序,然后根据 配置的块大小 将表分成块。然后,按块使用块,然后在块中捕获每个表行。对于它捕获的每行,快照会发出 READ
事件。该事件代表了块开始快照时的行值。
当快照继续进行时,其他进程可能会继续访问数据库,从而可能会修改表记录。要反映此类更改,INSERT
、UPDATE
或 DELETE
操作会照常提交到事务日志中。同样,持续 Debezium 流过程还会继续检测这些更改事件,并将对应的更改事件记录发送到 Kafka。
Debezium 如何使用相同的主密钥解决记录间的冲突
在某些情况下,流传输进程发出的 UPDATE
或 DELETE
事件会耗尽序列。也就是说,流过程可能会发出一个事件,它会在快照捕获包含该行的 READ
事件之前修改表行。当快照最终会为行发出对应的 READ
事件时,其值已经被替换。为确保以正确的逻辑顺序处理到达序列的增量快照事件,Debezium 会使用一种缓冲区方案来解决冲突。只有在快照事件和流事件间冲突时才解决后,Debezium 会向 Kafka 发送事件记录。
快照窗口
为了帮助解决后续 READ
事件和修改同一表行的流事件之间的冲突,Debezium 采用所谓的 快照窗口。快照窗口分离了增量快照捕获指定表块的数据的时间间隔。在打开块的快照窗口前,Debebe 会遵循其常见的行为,并将事件直接从事务日志直接降级到目标 Kafka 主题。但是,从打开特定块的快照时,Debebe 会执行重复数据删除步骤,以解决具有相同主密钥的事件之间冲突。
对于每个数据收集,Debezium 会发出两种类型的事件,并将其记录存储在单个目标 Kafka 主题中。它直接从表中捕获的快照记录作为 READ
操作发出。同时,当用户继续更新数据收集中的记录,并更新事务日志以反映每个提交,Debezium 会为每个更改发出 UPDATE
或 DELETE
操作。
当快照窗口打开时,Debezium 开始处理快照块,它会将快照记录提供给内存缓冲区。在快照窗口中,缓冲区中 READ
事件的主键将与传入流事件的主键进行比较。如果没有找到匹配项,流的事件记录将直接发送到 Kafka。如果 Debezium 检测到匹配项,它会丢弃缓冲的 READ
事件,并将流的记录写入目标主题,因为流的事件逻辑地替换静态快照事件。在块的快照窗口关闭后,缓冲区仅包含没有相关事务日志事件的 READ
事件。Debezium 将这些剩余的 READ
事件发送到表的 Kafka 主题。
连接器重复每个快照块的进程。
SQL Server 的 Debezium 连接器不支持增量快照运行时的 schema 更改。
8.2.1.3. 触发增量快照 复制链接链接已复制到粘贴板!
目前,启动增量快照的唯一方法是向源数据库上的 信号发送临时快照 信号。
您可以以 SQL INSERT
查询形式向信号表提交信号。
在 Debezium 检测到信号表中的更改后,它会读取信号,并运行请求的快照操作。
您提交的查询指定要包含在快照中的表,以及可选的指定快照操作类型。目前,快照操作的唯一有效选项是默认值 增量
。
要指定快照中包含的表,请提供一个 data-collections
数组,该数组列出了用于匹配表的表或一组正则表达式,例如:
{"data-collections": ["public.MyFirstTable", "public.MySecondTable"]}
增量快照信号的 data-collections
数组没有默认值。如果 data-collections
数组为空,Debezium 会检测到不需要任何操作,且不执行快照。
如果要包含在快照中的表名称包含数据库、模式或表名称的句点(.
),要将表添加到 data-collections
数组中,您必须用双引号转义名称的每个部分。
例如,若要包含 公共
模式中存在的表,并且名为 My.Table
,请使用以下格式:" public"."My.Table
"。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
发送 SQL 查询,将临时增量快照请求添加到信号表中:
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令中的
id
、type
和data
参数的值对应于 信号表的字段。下表描述了示例中的参数:
Expand 表 8.2. 向信号表发送增量快照信号的 SQL 命令中的字段描述 项 值 描述 1
myschema.debezium_signal
指定源数据库上信号表的完全限定名称。
2
ad-hoc-1
id
参数指定分配给信号请求的id
标识符的任意字符串。
使用此字符串来标识到信号表中条目的日志消息。Debezium 不使用此字符串。相反,在快照中,Debebe 会生成自己的id
字符串作为水位信号。3
execute-snapshot
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段所需的组件,用于指定表名称或正则表达式数组,以匹配快照中包含的表名称。
数组列出了根据完全限定名称匹配表的正则表达式,其格式与您用来指定signal.data.collection
配置属性中的连接器信号表的名称相同。5
增量
信号的
data
字段的可选类型
组件,用于指定要运行的快照操作类型。
目前,唯一有效选项是默认值增量
。
如果没有指定值,连接器将运行一个增量快照。6
additional-condition
可选字符串,它根据表的列指定条件,用于捕获表内容的子集。有关
additional-condition
参数的详情请参考带有额外条件
的临时增量快照。
带有额外条件
的临时增量快照
如果您希望快照在表中仅包含内容子集,您可以通过将 additional-condition
参数附加到快照信号来修改信号请求。
典型的快照的 SQL 查询采用以下格式:
SELECT * FROM <tableName> ....
SELECT * FROM <tableName> ....
通过添加 additional-condition
参数,您可以将 WHERE
条件附加到 SQL 查询中,如下例所示:
SELECT * FROM <tableName> WHERE <additional-condition> ....
SELECT * FROM <tableName> WHERE <additional-condition> ....
以下示例显示了向信号表发送带有额外条件的临时增量快照请求的 SQL 查询:
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
INSERT INTO <signalTable> (id, type, data) VALUES ('<id>', '<snapshotType>', '{"data-collections": ["<tableName>","<tableName>"],"type":"<snapshotType>","additional-condition":"<additional-condition>"}');
例如,假设您有一个包含以下列的产品表:
-
id
(主密钥) -
color
-
quantity
如果您希望 product 表的增量快照只包含 color=blue
的数据项,您可以使用以下 SQL 语句来触发快照:
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue"}');
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue"}');
additional-condition
参数还允许您传递基于多个列的条件。例如,使用上例中的 product 表,您可以提交查询来触发增量快照,该快照仅包含那些项目的 data =blue
和 quantity>10
:
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue AND quantity>10"}');
INSERT INTO myschema.debezium_signal (id, type, data) VALUES('ad-hoc-1', 'execute-snapshot', '{"data-collections": ["schema1.products"],"type":"incremental", "additional-condition":"color=blue AND quantity>10"}');
以下示例显示了连接器捕获的增量快照事件的 JSON。
示例:增加快照事件信息
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定要运行的快照操作类型。 |
2 |
|
指定事件类型。 |
8.2.1.4. 停止增量快照 复制链接链接已复制到粘贴板!
您还可以通过向源数据库上的表发送信号来停止增量快照。您可以通过发送 SQL INSERT
查询,向表提交停止快照信号。
在 Debezium 检测到信号表中的更改后,它会读取信号,并在进行时停止增量快照操作。
您提交的查询指定了 增量
的快照操作,以及可选的、要删除的当前运行快照的表。
先决条件
- 源数据库中存在信号数据收集。
-
信号数据收集在
signal.data.collection
属性中指定。
流程
发送 SQL 查询以停止临时增量快照到信号表:
INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<tableName>","<tableName>"],"type":"incremental"}');
INSERT INTO <signalTable> (id, type, data) values ('<id>', 'stop-snapshot', '{"data-collections": ["<tableName>","<tableName>"],"type":"incremental"}');
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
INSERT INTO myschema.debezium_signal (id, type, data) values ('ad-hoc-1', 'stop-snapshot', '{"data-collections": ["schema1.table1", "schema2.table2"], "type":"incremental"}');
INSERT INTO myschema.debezium_signal (id, type, data)
1 values ('ad-hoc-1',
2 'stop-snapshot',
3 '{"data-collections": ["schema1.table1", "schema2.table2"],
4 "type":"incremental"}');
5 Copy to Clipboard Copied! Toggle word wrap Toggle overflow signal 命令中的
id
、type
和data
参数的值对应于 信号表的字段。下表描述了示例中的参数:
Expand 表 8.3. 向信号表发送停止增量快照信号的 SQL 命令中的字段描述 项 值 描述 1
myschema.debezium_signal
指定源数据库上信号表的完全限定名称。
2
ad-hoc-1
id
参数指定分配给信号请求的id
标识符的任意字符串。
使用此字符串来标识到信号表中条目的日志消息。Debezium 不使用此字符串。3
stop-snapshot
指定
type
参数指定信号要触发的操作。
4
data-collections
信号的
data
字段的可选组件,用于指定表名称或正则表达式数组,以匹配要从快照中删除的表名称。
数组列出了根据完全限定名称匹配表的正则表达式,其格式与您用来指定signal.data.collection
配置属性中的连接器信号表的名称相同。如果省略了data
字段的此组件,则信号将停止正在进行的整个增量快照。5
增量
信号的
data
字段所需的组件,用于指定要停止的快照操作类型。
目前,唯一有效选项是增量的
。
如果没有指定类型
值,则信号无法停止增量快照。
8.2.2. Debezium SQL Server 连接器如何读取更改数据表 复制链接链接已复制到粘贴板!
当连接器首次启动时,它会对捕获表的结构进行结构快照,并将这些信息保留给其内部数据库架构历史记录主题。然后连接器会识别每个源表的更改表,并完成以下步骤。
- 对于每个更改表,连接器会读取最后一次存储的最大 LSN 和当前最大 LSN 之间创建的所有更改。
- 连接器根据提交 LSN 的值排序它以升序读取的更改,并更改 LSN。这种排序顺序可确保 Debezium 按照数据库中发生的相同顺序重新执行更改。
- 连接器通过提交,并将 LSN 作为偏移改为 Kafka Connect。
- 连接器存储最大 LSN,并从第 1 步中重启进程。
重启后,连接器会从它读取的最后一个偏移(提交并更改 LSN)中恢复处理。
连接器可以检测是否为包含的源表启用或禁用 CDC,并调整其行为。
8.2.3. 数据库中没有记录的最大 LSN 复制链接链接已复制到粘贴板!
当数据库中没有记录最大 LSN 时,可能会出现以下情况,因为:
- SQL Server Agent 没有运行
- 更改表中未记录任何更改
- 数据库的活动较低,cdc 清理作业会定期清除 cdc 表中的条目
从这些可能之外,由于正在运行的 SQL Server Agent 是先决条件,因此没有 1。是一个实际问题(虽然无 2 和 3)。
为了缓解这个问题并区分 No 1. 和不同,对 SQL Server Agent 的检查是通过以下查询 "SELECT CASE WHEN dss.[status]=4\":\"N 1 ELSE 0 END AS 进行的,则以下查询 "SELECT CASE WRE dss.[servicename] LIKE N'SQL Server Agent (%';"
.如果 SQL Server Agent 没有运行,则会在日志中写入 ERROR:"No maximum LSN in the database; SQL Server Agent is not running"。
运行状态查询的 SQL Server Agent 需要 7000 SERVER STATE
服务器权限。如果您不想向配置的用户授予这个权限,您可以选择通过 database.sqlserver.agent.status.query
属性配置您自己的查询。您可以定义一个功能,如果 SQL Server Agent 正在运行(false 或 0),并且安全地使用高级别权限,而无需根据此处所述,我需要为用户提供什么最小权限,以便它可以检查 SQL Server Agent 服务的状态? 或者这里使用高级别权限,而无需授予任何人:服务器级别。query 属性的配置应类似: database.sqlserver.agent.status.query=SELECT [ funcdb].func_is_sql_server_agent_running ()
- 您需要使用 [114db]
作为数据库名称的占位符。
8.2.4. Debezium SQL Server 连接器的限制 复制链接链接已复制到粘贴板!
SQL Server 专门要求基本对象作为表,才能创建更改捕获实例。因此,SQL Server 不支持从索引视图(也称为 规范化视图)中捕获更改,因此 Debezium SQL Server 连接器。
8.2.5. 接收 Debezium SQL Server 更改事件记录的 Kafka 主题默认名称 复制链接链接已复制到粘贴板!
默认情况下,SQL Server 连接器将所有 INSERT
、UPDATE
和 DELETE
操作的事件写入特定于该表的单个 Apache Kafka 主题。连接器使用以下惯例命名更改事件主题:< topicPrefix> . <schemaName& gt; . <tableName>
以下列表提供默认名称组件的定义:
- topicPrefix
-
服务器的逻辑名称,如
topic.prefix
配置属性指定。 - schemaName
- 发生更改事件的数据库模式的名称。
- tableName
- 发生更改事件的数据库表的名称。
例如,如果 fulfillment
是逻辑服务器名称,而 dbo
是 schema 名称,数据库包含名称 product,
,products
_on_handcustomers
, 和 orders
的表,连接器会将事件记录流传输为以下 Kafka 主题:
-
fulfillment.testDB.dbo.products
-
fulfillment.testDB.dbo.products_on_hand
-
fulfillment.testDB.dbo.customers
-
fulfillment.testDB.dbo.orders
连接器应用类似的命名约定来标记其内部数据库架构历史记录主题、架构更改主题 以及 事务元数据主题。
如果默认主题名称不满足您的要求,您可以配置自定义主题名称。要配置自定义主题名称,您可以在逻辑主题路由 SMT 中指定正则表达式。有关使用逻辑主题路由 SMT 自定义主题命名的更多信息,请参阅 主题路由。
8.2.6. Debezium SQL Server 连接器如何使用 schema 更改主题 复制链接链接已复制到粘贴板!
对于启用了 CDC 的每个表,Debezium SQL Server 连接器会存储应用于数据库中捕获的表的模式更改事件的历史记录。连接器将模式更改事件写入名为 < topicPrefix>
; 的 Kafka 主题,其中 topicPrefix
是 topic.prefix
配置属性中指定的逻辑服务器名称。
连接器发送到 schema 更改主题的消息包含一个有效负载,也可以包含更改事件消息的 schema。模式更改事件消息的有效负载包括以下元素:
databaseName
-
将语句应用到的数据库的名称。
databaseName
的值充当 message 键。 tableChanges
-
模式更改后整个表架构的结构化表示。
tableChanges
字段包含一个数组,其中包含表中的每个列的条目。由于结构化表示以 JSON 或 Avro 格式呈现数据,因此用户可以轻松地读取消息,而无需首先通过 DDL 解析程序处理它们。
当连接器配置为捕获表时,它会保存表架构的历史记录,不仅在架构更改主题中,也存储在内部数据库模式历史记录主题中。内部数据库架构历史记录主题仅用于连接器,它不用于直接使用应用程序。确保需要有关架构的通知的应用程序只消耗了该模式的更改主题的信息。
连接器发送到其架构更改主题的消息格式处于 incubating 状态,可以在没有通知的情况下更改。
当发生以下事件时,Debebe 会将信息发送到 schema 更改主题:
- 您可以为表启用 CDC。
- 您可以为表禁用 CDC。
- 您可以按照 架构演进过程来更改启用 CDC 的表的结构。
示例:发送到 SQL Server 连接器模式更改主题的消息
以下示例显示了 schema 更改主题中的消息。消息包含表模式的逻辑表示。
项 | 字段名称 | 描述 |
---|---|---|
1 |
| 显示连接器处理事件的时间的可选字段。该时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 在源对象中,ts_ms 表示数据库中更改的时间。通过将 payload.source.ts_ms 的值与 payload.ts_ms 的值进行比较,您可以确定源数据库更新和 Debezium 之间的滞后。 |
2 |
| 标识包含更改的数据库和 schema。 |
3 |
|
对于 SQL Server 连接器,始终为 |
4 |
| 包含 DDL 命令生成的模式更改的一个或多个项目的数组。 |
5 |
| 描述更改的类型。该值是以下之一:
|
6 |
| 创建、更改或丢弃的表的完整标识符。 |
7 |
| 应用更改后代表表元数据。 |
8 |
| 编写表主密钥的列列表。 |
9 |
| 更改表中的每个列的元数据。 |
10 |
| 每个表更改的自定义属性元数据。 |
在连接器发送到 schema 更改主题的消息中,键是包含架构更改的数据库名称。在以下示例中,payload
字段包含键:
8.2.7. Debezium SQL Server 连接器数据更改事件的描述 复制链接链接已复制到粘贴板!
Debezium SQL Server 连接器会为每行级别 INSERT
、UPDATE
和 DELETE
操作生成数据更改事件。每个事件都包含一个键和值。键和值的结构取决于更改的表。
Debezium 和 Kafka Connect 围绕 事件消息的持续流 设计。但是,这些事件的结构可能会随时间而变化,而用户很难处理这些事件。要解决这个问题,每个事件都包含其内容的 schema,或者如果您使用 schema registry,则消费者可以从 registry 获取 schema 的模式 ID。这使得每个事件都可以自我包含。
以下框架 JSON 显示更改事件的基本四个部分。但是,如何配置在应用程序中使用的 Kafka Connect converter 决定了更改事件中的这四个部分的表示。只有当您将转换器配置为生成它时,schema
字段才处于更改事件中。同样,只有在将转换器配置为生成它时,才会发生更改事件中的事件密钥和事件有效负载。如果您使用 JSON 转换器,并将其配置为生成所有四个基本更改事件部分,则更改事件具有此结构:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
第一个 |
2 |
|
第一个 |
3 |
|
第二个 |
4 |
|
第二个 |
默认情况下,连接器流将事件记录更改为名称与事件原始表相同的名称的主题。如需更多信息,请参阅 主题名称。
SQL Server 连接器确保所有 Kafka Connect 模式名称都遵循 Avro 模式名称格式。这意味着,逻辑服务器名称必须以拉丁或下划线开头,即 a-z、A-Z 或 _。逻辑服务器名称中的每个剩余的字符以及数据库和表名称中的每个字符都必须是字母、数字或下划线,即 a-z、A-Z、0-9 或 \_。如果存在无效的字符,它将替换为下划线字符。
如果逻辑服务器名称、数据库名称或表名称包含无效字符,且区分另一个名称的唯一字符无效,则可能会导致意外冲突,因此替换为下划线。
有关更改事件的详情,请查看以下主题:
8.2.7.1. 关于 Debezium SQL Server 中的键更改事件 复制链接链接已复制到粘贴板!
更改事件的密钥包含更改表的密钥的 schema,以及更改的行的实际键。在连接器创建事件时,模式及其对应有效负载都包含更改表的主键(或唯一键约束)中的每个列的字段。
请考虑以下 客户
表,然后是此表的更改事件键示例。
表示例
更改事件键示例
捕获对 customers
表的更改的每个更改事件都有相同的事件键模式。只要
表有以前的定义,捕获 customer 表更改的事件都有以下键结构,在 JSON 中类似如下:
customers
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
键的 schema 部分指定一个 Kafka Connect 模式,它描述了密钥 |
2 |
|
指定 |
3 |
|
指明 event 键必须在其 |
4 |
|
定义密钥有效负载结构的 schema 名称。这个模式描述了更改的表的主键的结构。键架构名称的格式为 connector-name.database-schema-name.table-name.
|
5 |
|
包含生成此更改事件的行的键。在本例中,键包含一个 |
8.2.7.2. 关于 Debezium SQL Server 更改事件中的值 复制链接链接已复制到粘贴板!
更改事件中的值比键稍微复杂。与键一样,该值具有 schema
部分和 payload
部分。schema
部分包含描述 payload
部分的 Envelope
结构的 schema,包括其嵌套字段。更改创建、更新或删除数据的事件,并且具有 envelope 结构的值有效负载。
考虑用于显示更改事件键示例的相同示例:
为每个事件类型描述了更改事件的值部分。
创建 事件
以下示例显示了连接器为在 customer 表中创建数据的操作生成的更改事件的值部分:
项 | 字段名称 | 描述 |
---|---|---|
1 |
| 值的 schema,用于描述值有效负载的结构。每次连接器为特定表生成的更改时,更改事件的值模式都是相同的。 |
2 |
|
在 |
3 |
|
|
4 |
|
|
5 |
|
值的实际数据。这是更改事件提供的信息。 |
6 |
|
指定事件发生前行状态的可选字段。当 |
7 |
|
指定事件发生后行状态的可选字段。在本例中, |
8 |
| 描述事件源元数据的必需字段。此字段包含可用于将此事件与其他事件进行比较的信息,以及事件的来源、事件发生的顺序,以及事件是否为同一事务的一部分。源元数据包括:
|
9 |
|
描述导致连接器生成事件的操作类型的必要字符串。在本例中,
|
10 |
|
显示连接器处理事件的时间的可选字段。在事件消息 envelope 中,时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
更新 事件
示例 customer 表中更新的更改事件值与该表的 create 事件相同。同样,事件的 payload 具有相同的结构。但是,事件值 payload 在更新 事件中包含不同的值。以下是连接器在
customers
表中为更新生成的更改事件值示例:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定事件发生前行状态的可选字段。在 update 事件值中, |
2 |
|
指定事件发生后行状态的可选字段。您可以比较 |
3 |
|
描述事件源元数据的必需字段。
|
4 |
|
描述操作类型的强制字符串。在 update 事件值中, |
5 |
|
显示连接器处理事件的时间的可选字段。在事件消息 envelope 中,时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
更新行的主/唯一键的列会更改行键的值。当键更改时,Debebe 会输出 三个 事件:一个 delete 事件和带有行的旧键的 tombstone 事件,后跟带有行新键的 create 事件。
删除 事件
delete 更改事件中的值与为同一表的 create 和 update 事件相同的 schema
部分。示例 customer
表的 delete 事件中 payload
部分类似如下:
项 | 字段名称 | 描述 |
---|---|---|
1 |
|
指定事件发生前行状态的可选字段。在一个 delete 事件值中, |
2 |
|
指定事件发生后行状态的可选字段。在 delete 事件值中, |
3 |
|
描述事件源元数据的必需字段。在一个 delete 事件值中,
|
4 |
|
描述操作类型的强制字符串。 |
5 |
|
显示连接器处理事件的时间的可选字段。在事件消息 envelope 中,时间基于运行 Kafka Connect 任务的 JVM 中的系统时钟。 |
SQL Server 连接器事件旨在用于 Kafka 日志压缩。只要每个密钥至少保留最新的消息,日志压缩就可以删除一些旧的消息。这可让 Kafka 回收存储空间,同时确保主题包含完整的数据集,并可用于重新载入基于密钥的状态。
tombstone 事件
删除行时,delete 事件值仍可用于日志压缩,因为 Kafka 您可以删除具有相同键的所有之前信息。但是,如果 Kafka 删除具有相同键的所有消息,消息值必须是 null
。为了实现此目的,在 Debezium 的 SQL Server 连接器发出 delete 事件后,连接器会发出一个特殊的 tombstone 事件,它具有相同的键但为 null
值。
8.2.8. Debezium SQL Server 连接器生成的事件代表事务边界 复制链接链接已复制到粘贴板!
Debezium 可以生成代表事务边界的事件,并增强数据更改事件消息。
Debezium 仅在部署连接器后为发生的事务注册并接收元数据。部署连接器前发生的事务元数据。
数据库事务由语句块表示,该块在 BEGIN
和 END
关键字之间括起。Debezium 为每个事务生成 BEGIN
和 END
分隔符的事务边界事件。事务边界事件包含以下字段:
status
-
BEGIN
或END
。 id
- 唯一事务标识符的字符串表示。
ts_ms
-
数据源上事务边界事件(
BEGIN
或END
事件)的时间。如果数据源没有向 Debezium 提供事件时间,则该字段代表 Debezium 处理事件的时间。 event_count
(用于END
事件)- 事务所设计的事件总数。
data_collections
(用于END
事件)-
data_collection
和event_count
元素的一组对,指示连接器为来自数据收集的更改发出的事件数。
Debezium 无法可靠地识别事务何时结束。因此,只有在第一个事务到达另一个事务后,才会发出事务的 END
标记。在出现低流量系统时,这可能会导致 END
标记的延迟发送。
以下示例显示了典型的事务边界信息:
示例:SQL Server 连接器事务边界事件
除非通过 topic.transaction
选项覆盖,否则事务事件将写入名为 <topic. prefix>
。
.transaction
的主题
8.2.8.1. 更改数据事件增强 复制链接链接已复制到粘贴板!
如果启用了事务元数据,数据消息 Envelope
会增加一个新的 transaction
字段。此字段以字段复合的形式提供有关每个事件的信息:
id
- 唯一事务标识符的字符串表示
total_order
- 事件在事务生成的所有事件的绝对路径
data_collection_order
- 事件在事务发送的所有事件中每个数据收集位置
以下示例显示了典型的信息是什么:
8.2.9. Debezium SQL Server 连接器如何映射数据类型 复制链接链接已复制到粘贴板!
Debezium SQL Server 连接器通过生成类似于行存在的表的事件来代表表行数据的更改。每个事件都包含表示行列值的字段。事件表示操作的列值的方式取决于该列的 SQL 数据类型。在事件中,连接器将每个 SQL Server 数据类型的字段映射到 字面类型和 语义类型。
连接器可将 SQL Server 数据类型映射到 字面 和 语义 类型。
- 字面类型
-
描述如何使用 Kafka Connect 模式类型(即
INT8
,INT16
,INT32
,INT64
,FLOAT32
,FLOAT64
,BOOLEAN
,STRING
,BYTES
,ARRAY
,MAP
, 和STRUCT
)来代表值。 - 语义类型
- 描述 Kafka Connect 模式如何使用字段的名称捕获字段 的含义。
如果默认数据类型转换无法满足您的需要,您可以为连接器 创建自定义转换器。
有关数据类型映射的更多信息,请参阅以下部分:
基本类型
下表显示了连接器如何映射基本的 SQL Server 数据类型。
SQL Server 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
| 不适用 |
|
|
|
|
|
|
以下部分介绍了其他数据类型映射。
如果存在,列的默认值会被传播到对应的字段的 Kafka Connect 模式。更改消息将包含字段的默认值(除非给出了显式列值),因此应该很少需要从 schema 获取默认值。
临时值
除 SQL Server 的 DATETIMEOFFSET
数据类型(包含时区信息)外,其他时间类型取决于 time.precision.mode
配置属性的值。当 time.precision.mode
配置属性被设置为 adaptive
(默认值),那么连接器将根据列的数据类型定义决定 temporal 类型的字面类型和语义类型,以便事件 完全 表示数据库中的值:
SQL Server 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
当 time.precision.mode
配置属性设为 connect
时,连接器将使用预定义的 Kafka Connect 逻辑类型。当消费者只了解内置的 Kafka Connect 逻辑类型且无法处理变量精度时间值时,这非常有用。另一方面,因为 SQL 服务器支持十分之一的微秒精度,带有 connect
时间精度模式的连接器将在有一个大于 3 的 fractional second precision 数据库列时丢失一些精度:
SQL Server 数据类型 | 字面类型(架构类型) | 语义类型(架构名称)和备注 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
时间戳值
DATETIME
、SMALLDATETIME
和 DATETIME2
类型代表没有时区信息的时间戳。这些列根据 UTC 转换为等同的 Kafka Connect 值。例如,DATETIME2
值 "2018-06-20 15:13:16.945104" 由 io.debezium.time.MicroTimestamp
代表,值为 "1539)07596945104"。
请注意,运行 Kafka Connect 和 Debezium 的 JVM 的时区不会影响这个转换。
十进制值
Debezium 连接器根据 decimal.handling.mode
连接器配置属性 的设置处理十进制。
- decimal.handling.mode=precise
Expand 表 8.11. 当 decimal.handling.mode=precise时进行映射 SQL Server 类型 字面类型(架构类型) 语义类型(架构名称) NUMERIC[(P[,S])]
BYTES
org.apache.kafka.connect.data.Decimal
scale
模式参数包括一个整数,它代表了十进制小数点移动了多少位。DECIMAL[(P[,S])]
BYTES
org.apache.kafka.connect.data.Decimal
scale
模式参数包括一个整数,它代表了十进制小数点移动了多少位。SMALLMONEY
BYTES
org.apache.kafka.connect.data.Decimal
scale
模式参数包括一个整数,它代表了十进制小数点移动了多少位。领导
BYTES
org.apache.kafka.connect.data.Decimal
scale
模式参数包括一个整数,它代表了十进制小数点移动了多少位。- decimal.handling.mode=double
Expand 表 8.12. Mappings when decimal.handling.mode=double SQL Server 类型 字面类型 语义类型 NUMERIC[(M[,D])]
FLOAT64
不适用
DECIMAL[(M[,D])]
FLOAT64
不适用
SMALLMONEY[(M[,D])]
FLOAT64
不适用
MONEY[(M[,D])]
FLOAT64
不适用
- decimal.handling.mode=string
Expand 表 8.13. Mappings when decimal.handling.mode=string SQL Server 类型 字面类型 语义类型 NUMERIC[(M[,D])]
字符串
不适用
DECIMAL[(M[,D])]
字符串
不适用
SMALLMONEY[(M[,D])]
字符串
不适用
MONEY[(M[,D])]
字符串
不适用
8.3. 设置 SQL Server 以运行 Debezium 连接器 复制链接链接已复制到粘贴板!
要使 Debezium 从 SQL Server 表中捕获更改事件,具有所需特权的 SQL Server 管理员必须首先运行查询以便在数据库上启用 CDC。然后,管理员必须为希望 Debezium 捕获的每个表启用 CDC。
默认情况下,与 Microsoft SQL Server 的 JDBC 连接受 SSL 加密保护。如果没有为 SQL Server 数据库启用 SSL,或者您想要不使用 SSL 连接到数据库,您可以通过将连接器配置中的 database.encrypt
属性的值设置为 false
来禁用 SSL。
有关设置 SQL Server 以与 Debezium 连接器搭配使用的详情,请查看以下部分:
应用 CDC 后,它会捕获提交给启用 CDD 的表的所有 INSERT
、UPDATE
和 DELETE
操作。然后 Debezium 连接器可以捕获这些事件并将其发送到 Kafka 主题。
8.3.1. 在 SQL Server 数据库中启用 CDC 复制链接链接已复制到粘贴板!
在为表启用 CDC 前,您必须为 SQL Server 数据库启用它。SQL Server 管理员通过运行系统存储的步骤来启用 CDC。可使用 SQL Server Management Studio 或使用 Transact-SQL 运行系统存储的步骤。
先决条件
- 您是 SQL Server 系统管理员 固定服务器角色的成员。
- 您是数据库的 db_owner。
- SQL Server Agent 正在运行。
SQL Server CDC 功能处理仅在用户创建的表中发生的更改。您不能在 SQL Server master
数据库上启用 CDC。
流程
- 在 SQL Server Management Studio 中的 View 菜单中,单击 Template Explorer。
- 在 模板浏览器中, 展开 SQL Server Templates。
- 展开 Change Data Capture > Configuration,然后点 Enable Database for CDC。
-
在模板中,将
USE
语句中的数据库名称替换为您要为 CDC 启用的数据库的名称。 运行存储的步骤
sys.sp_cdc_enable_db
,以启用 CDC 的数据库。为 CDC 启用数据库后,会创建一个名为
cdc
的模式,以及 CDC 用户、元数据表和其他系统对象。以下示例演示了如何为数据库
MyDB
启用 CDC:示例:为 CDC 模板启用 SQL Server 数据库
USE MyDB GO EXEC sys.sp_cdc_enable_db GO
USE MyDB GO EXEC sys.sp_cdc_enable_db GO
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3.2. 在 SQL Server 表中启用 CDC 复制链接链接已复制到粘贴板!
SQL Server 管理员必须在您要捕获的源表上启用更改数据捕获。必须已为 CDC 启用数据库。要在表上启用 CDC,SQL Server 管理员为表运行存储的步骤 sys.sp_cdc_enable_table
。可使用 SQL Server Management Studio 或使用 Transact-SQL 运行存储的步骤。必须为每个要捕获的表启用 SQL Server CDC。
先决条件
- 在 SQL Server 数据库上启用了 CDC。
- SQL Server Agent 正在运行。
-
您是数据库的
db_owner
固定数据库角色的成员。
流程
- 在 SQL Server Management Studio 中的 View 菜单中,单击 Template Explorer。
- 在 模板浏览器中, 展开 SQL Server Templates。
- 展开 Change Data Capture > Configuration,然后点 Enable Table Specifying Filegroup options。
-
在模板中,将
USE
语句中的表名称替换为您要捕获的表的名称。 运行存储的步骤
sys.sp_cdc_enable_table
。以下示例演示了如何为表
MyTable
启用 CDC:示例:为 SQL Server 表启用 CDC
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <.> 指定您要捕获的表的名称。<.> 指定角色
MyRole
,您可将用户添加到您要授予源表捕获列的SELECT
权限。sysadmin
或db_owner
角色的用户还能够访问指定的更改表。将@role_name
的值设置为NULL
,仅允许sysadmin
或db_owner
中的成员具有捕获信息的完整访问权限。<.> 指定 SQL Server 放置所捕获表的文件组
。命名的filegroup
必须已经存在。最好不要在用于源表的同一filegroup
中找到更改表。
8.3.3. 验证用户有权访问 CDC 表 复制链接链接已复制到粘贴板!
SQL Server 管理员可以运行系统存储的步骤,以查询数据库或表以检索其 CDC 配置信息。可使用 SQL Server Management Studio 或使用 Transact-SQL 运行存储的步骤。
先决条件
-
您有对捕获实例的所有捕获列的
SELECT
权限。db_owner
数据库角色的成员可以查看所有定义的捕获实例的信息。 - 在为查询包含的表信息定义的任何 gating 角色中都有成员资格。
流程
- 在 SQL Server Management Studio 中的 View 菜单中,单击 Object Explorer。
- 在 Object Explorer 中,展开 Databases,然后扩展您的数据库对象,如 MyDB。
- 展开 Programmability > Stored stepss > System Stored procedures。
运行
sys.sp_cdc_help_change_data_capture
存储的步骤以查询表。查询不应返回空结果。
以下示例在数据库
MyDB
上运行存储的步骤sys.sp_cdc_help_change_data_capture
:示例:查询 CDC 配置信息的表
USE MyDB; GO EXEC sys.sp_cdc_help_change_data_capture GO
USE MyDB; GO EXEC sys.sp_cdc_help_change_data_capture GO
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查询会返回为 CDC 启用的每个表的配置信息,其中包含调用者可访问的更改数据。如果结果为空,请验证用户是否有权限来访问捕获实例和 CDC 表。
8.3.4. Azure 上的 SQL Server 复制链接链接已复制到粘贴板!
Debezium SQL Server 连接器可用于 Azure 上的 SQL Server。有关在 Azure 上为 SQL Server 配置 CDC 并在 Debezium 中使用它的信息,请参阅此示例。
8.3.5. SQL Server 捕获作业代理配置对服务器负载和延迟的影响 复制链接链接已复制到粘贴板!
当数据库管理员为源表启用数据捕获时,捕获作业代理开始运行。代理从事务日志中读取新的更改事件记录,并将事件记录复制到更改数据表中。在源表中提交更改的时间之间,更改在对应的更改表中出现的时间,始终会有一个小的延迟间隔。这个延迟间隔代表了在源表中更改时以及 Debezium 被流传输到 Apache Kafka 间的差距。
理想情况下,对于必须快速响应数据更改的应用程序,您希望在源和更改表之间保持同步。您可能希望运行捕获代理来持续处理更改事件,可能会导致吞吐量增加吞吐量,并减少在事件发生后尽快使用新的事件记录更改表。然而,这不一定是这种情况。在更直接同步时,会牺牲性能损失。每次捕获作业代理查询数据库以获取新事件记录时,它会增加数据库主机上的 CPU 负载。服务器上的额外负载可能会对整体数据库性能造成负面影响,并可能会降低事务效率,特别是在峰值数据库使用期间。
监控数据库指标非常重要,以便您知道数据库是否达到服务器不再支持捕获代理级别的活动点。如果您发现性能问题,您可以修改 SQL Server 捕获代理设置,以帮助平衡具有可容忍延迟的数据库主机上的总体 CPU 负载。
8.3.6. SQL Server 捕获作业代理配置参数 复制链接链接已复制到粘贴板!
在 SQL Server 上,控制捕获作业代理行为的参数在 SQL Server 表 msdb.dbo.cdc_jobs
中定义。如果您在运行捕获作业代理时遇到问题,请通过运行 sys.sp_cdc_change_job
存储的步骤并提供新值来调整捕获作业设置,以减少 CPU 负载。
有关如何配置 SQL Server 捕获作业代理参数的具体指导超出了本文档的范围。
以下参数是修改捕获代理行为用于 Debezium SQL Server 连接器的最显著:
pollinginterval
- 指定捕获代理在日志扫描周期之间等待的秒数。
- 数值越大可减少数据库主机上的负载并增加延迟。
-
值
0
指定扫描之间不等待。 -
默认值为
5
。
maxtrans
-
指定每个日志扫描周期期间要处理的事务的最大数量。在捕获作业处理指定数量的事务后,它会暂停
pollinginterval
在下一次扫描开始前指定的时长。 - 较低值可减少数据库主机上的负载并增加延迟。
-
默认值为
500
。
-
指定每个日志扫描周期期间要处理的事务的最大数量。在捕获作业处理指定数量的事务后,它会暂停
maxscans
-
指定捕获作业可以尝试捕获数据库事务日志的所有内容的扫描周期数量的限制。如果将
continuous
参数设置为1
,则作业会在pollinginterval
在恢复扫描前暂停轮询interval 指定的时间长度。 - 较低值可减少数据库主机上的负载并增加延迟。
-
默认值为
10
。
-
指定捕获作业可以尝试捕获数据库事务日志的所有内容的扫描周期数量的限制。如果将
其他资源
- 有关捕获代理参数的更多信息,请参阅 SQL Server 文档。
8.4. 部署 Debezium SQL Server 连接器 复制链接链接已复制到粘贴板!
您可以使用以下任一方法部署 Debezium SQL Server 连接器:
8.4.1. 使用 AMQ Streams 部署 SQL Server 连接器 复制链接链接已复制到粘贴板!
从 Debezium 1.7 开始,部署 Debezium 连接器的首选方法是使用 AMQ Streams 来构建包含连接器插件的 Kafka Connect 容器镜像。
在部署过程中,您可以创建并使用以下自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR,并包含有关镜像中需要包含连接器工件的信息。 -
提供连接器用来访问源数据库的信息的
KafkaConnector
CR。在 AMQ Streams 启动 Kafka Connect pod 后,您可以通过应用KafkaConnector
CR 来启动连接器。
在 Kafka Connect 镜像的构建规格中,您可以指定可用于部署的连接器。对于每个连接器插件,您还可以指定您的部署可以使用的其他组件。例如,您可以添加 Apicurio Registry 工件或 Debezium 脚本组件。当 AMQ Streams 构建 Kafka Connect 镜像时,它会下载指定的工件,并将其合并到镜像中。
KafkaConnect
CR 中的 spec.build.output
参数指定存储生成的 Kafka Connect 容器镜像的位置。容器镜像可以存储在 Docker registry 中,也可以存储在 OpenShift ImageStream 中。要将镜像存储在 ImageStream 中,您必须先创建 ImageStream,然后才能部署 Kafka Connect。镜像流不会被自动创建。
如果使用 KafkaConnect
资源创建集群,之后您无法使用 Kafka Connect REST API 创建或更新连接器。您仍然可以使用 REST API 来检索信息。
其他资源
- 在 OpenShift 上使用 AMQ Streams 配置 Kafka 连接。
- 在 OpenShift 中部署和升级 AMQ Streams 中的使用 AMQ Streams 自动创建新容器镜像。
8.4.2. 使用 AMQ Streams 部署 Debezium SQL Server 连接器 复制链接链接已复制到粘贴板!
使用早期版本的 AMQ Streams 时,要在 OpenShift 上部署 Debezium 连接器,首先需要为连接器构建 Kafka Connect 镜像。在 OpenShift 上部署连接器的当前首选的方法是使用 AMQ Streams 中的构建配置来自动构建 Kafka Connect 容器镜像,其中包含您要使用的 Debezium 连接器插件。
在构建过程中,AMQ Streams Operator 会将 KafkaConnect
自定义资源中的输入参数(包括 Debezium 连接器定义)转换为 Kafka Connect 容器镜像。构建从 Red Hat Maven 存储库或其他配置的 HTTP 服务器下载必要的工件。
新创建的容器被推送到 .spec.build.output
中指定的容器 registry,用于部署 Kafka Connect 集群。AMQ Streams 构建 Kafka Connect 镜像后,您可以创建 KafkaConnector
自定义资源来启动构建中包含的连接器。
先决条件
- 您可以访问安装了集群 Operator 的 OpenShift 集群。
- AMQ Streams Operator 正在运行。
- 部署 Apache Kafka 集群,如在 OpenShift 中部署和升级 AMQ Streams 所述。
- Kafka Connect 部署在 AMQ Streams 上
- 您有红帽构建的 Debezium 许可证。
-
已安装 OpenShift
oc
CLI 客户端,或者您可以访问 OpenShift Container Platform Web 控制台。 根据您要存储 Kafka Connect 构建镜像的方式,您需要 registry 权限或您必须创建 ImageStream 资源:
- 要将构建镜像存储在镜像 registry 中,如 Red Hat Quay.io 或 Docker Hub
- 在 registry 中创建和管理镜像的帐户和权限。
- 将构建镜像存储为原生 OpenShift ImageStream
- ImageStream 资源已部署到集群中,以存储新的容器镜像。您必须为集群明确创建 ImageStream。镜像流默认不可用。如需有关 ImageStreams 的更多信息,请参阅在 OpenShift Container Platform 上管理镜像流。
流程
- 登录 OpenShift 集群。
为连接器创建 Debezium
KafkaConnect
自定义资源(CR),或修改现有的资源。例如,创建一个名为dbz-connect.yaml
的KafkaConnect
CR,用于指定metadata.annotations
和spec.build
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
例 8.1.
dbz-connect.yaml
文件,该文件定义包含 Debezium 连接器的KafkaConnect
自定义资源在以下示例中,自定义资源被配置为下载以下工件:
- Debezium SQL Server 连接器存档。
- 红帽构建的 Apicurio Registry 存档。Apicurio Registry 是一个可选组件。只有在打算在连接器中使用 Avro 序列化时,才添加 Apicurio Registry 组件。
- Debezium 脚本 SMT 归档以及您要与 Debezium 连接器一起使用的关联脚本引擎。SMT 归档和脚本语言依赖项是可选组件。只有在打算使用 Debezium 是 基于内容的路由 SMT 或 过滤 SMT 时,才添加这些组件。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 8.14. Kafka Connect 配置设置的描述 项 描述 1
将
strimzi.io/use-connector-resources
注解设置为"true"
,以便 Cluster Operator 使用KafkaConnector
资源在此 Kafka Connect 集群中配置连接器。2
spec.build
配置指定构建镜像的位置,并列出要在镜像中包含的插件,以及插件工件的位置。3
build.output
指定存储新构建镜像的 registry。4
指定镜像输出的名称和镜像名称。
output.type
的有效值是docker
,可推送到容器 registry,如 Docker Hub 或 Quay,或将镜像推送到内部 OpenShift ImageStream的镜像流
。要使用 ImageStream,必须将 ImageStream 资源部署到集群中。有关在 KafkaConnect 配置中指定build.output
的更多信息,请参阅在 OpenShift 中配置 AMQ Streams 中的 AMQ Streams Build schema 参考。5
插件配置
列出了您要包含在 Kafka Connect 镜像中的所有连接器。对于列表中的每个条目,指定一个插件名称
,以及有关构建连接器所需的工件的信息。另外,对于每个连接器插件,您还可以包含您要与连接器一起使用的其他组件。例如,您可以添加 Service Registry 工件或 Debezium 脚本组件。6
artifacts.type
的值指定artifacts.url
中指定的工件的文件类型。有效类型是zip
、tgz
或jar
。Debezium 连接器存档以.zip
文件格式提供。type
值必须与url
字段中引用的文件类型匹配。7
artifacts.url
的值指定 HTTP 服务器的地址,如 Maven 存储库,用于存储连接器工件的文件。Debezium 连接器工件位于 Red Hat Maven 存储库中。OpenShift 集群必须有权访问指定的服务器。8
(可选)指定用于下载 Apicurio Registry 组件的工件
类型和
url
。包括 Apicurio Registry 工件,只有在您希望连接器使用 Apache Avro 与 Red Hat build of Apicurio Registry 序列化事件键和值时,而不是使用默认的 JSON converter。9
(可选)指定 Debezium 脚本 SMT 归档的工件
类型和
url
,以用于 Debezium 连接器。只有在打算使用 Debezium 基于内容的路由 SMT 或 过滤 SMT 时使用脚本 SMT 时,才包含脚本 SMT,您必须部署 JSR 223 兼容脚本实施,如 groovy。10
(可选)为 JSR 223 兼容脚本实现的 JAR 文件指定工件
类型和
url
,这是 Debezium 脚本 SMT 所需的。重要如果您使用 AMQ Streams 将连接器插件合并到 Kafka Connect 镜像中,每个所需脚本语言组件
artifacts.url
必须指定 JAR 文件的位置,而artifacts.type
的值还必须设置为jar
。无效的值会导致连接器在运行时失败。要启用使用带有脚本 SMT 的 Apache Groovy 语言,示例中的自定义资源会检索以下库的 JAR 文件:
-
groovy
-
Groovy-jsr223
(协调代理) -
Groovy-json
(用于解析 JSON 字符串的模块)
作为替代方案,Debebe 脚本 SMT 还支持使用 GraalVM JavaScript 的 JSR 223 实现。
输入以下命令将
KafkaConnect
构建规格应用到 OpenShift 集群:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据自定义资源中指定的配置,Streams Operator 会准备要部署的 Kafka Connect 镜像。
构建完成后,Operator 将镜像推送到指定的 registry 或 ImageStream,并启动 Kafka Connect 集群。您配置中列出的连接器工件在集群中可用。创建一个
KafkaConnector
资源来定义您要部署的每个连接器的实例。
例如,创建以下KafkaConnector
CR,并将它保存为sqlserver-inventory-connector.yaml
例 8.2. 为 Debezium 连接器定义
KafkaConnector
自定义资源的sqlserver-inventory-connector.yaml
文件Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 8.15. 连接器配置设置的描述 项 描述 1
使用 Kafka Connect 集群注册的连接器名称。
2
连接器类的名称。
3
可同时运行的任务数量。
4
连接器的配置。
5
主机数据库实例的地址。
6
数据库实例的端口号。
7
Debezium 用于连接到数据库的帐户名称。
8
Debezium 用于连接到数据库用户帐户的密码。
9
数据库实例或集群的主题前缀。
指定的名称只能从字母数字字符或下划线括起。
由于主题前缀用作从这个连接器接收更改事件的任何 Kafka 主题的前缀,所以名称必须在集群中的连接器之间唯一。
此命名空间也用于相关的 Kafka Connect 模式的名称,如果您将连接器与 Avro 连接器集成,则对应的 Avro 模式的命名空间也用于。10
连接器从中捕获更改事件的表列表。
运行以下命令来创建连接器资源:
oc create -n <namespace> -f <kafkaConnector>.yaml
oc create -n <namespace> -f <kafkaConnector>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc create -n debezium -f sqlserver-inventory-connector.yaml
oc create -n debezium -f sqlserver-inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 连接器注册到 Kafka Connect 集群,并开始针对
KafkaConnector
CR 中的spec.config.database.dbname
指定的数据库运行。连接器 pod 就绪后,Debezium 正在运行。
您现在已准备好 验证 Debezium SQL Server 部署。
要部署 Debezium SQL Server 连接器,您必须构建包含 Debezium 连接器存档的自定义 Kafka Connect 容器镜像,然后将此容器镜像推送到容器 registry。然后,您需要创建以下自定义资源(CR):
-
定义 Kafka Connect 实例的
KafkaConnect
CR。CR 中的image
属性指定您创建用来运行 Debezium 连接器的容器镜像的名称。您可以将此 CR 应用到部署了 Red Hat AMQ Streams 的 OpenShift 实例。AMQ Streams 提供将 Apache Kafka 引入到 OpenShift 的 operator 和镜像。 -
定义 Debezium SQL Server 连接器的
KafkaConnector
CR。将此 CR 应用到应用KafkaConnect
CR 的同一 OpenShift 实例。
先决条件
- SQL Server 正在运行,您完成了 设置 SQL Server 以使用 Debezium 连接器 的步骤。
- AMQ Streams 部署在 OpenShift 上,并运行 Apache Kafka 和 Kafka Connect。如需更多信息,请参阅在 OpenShift 中部署和升级 AMQ Streams
- podman 或 Docker 已安装。
-
您有在容器 registry 中创建和管理容器(如
quay.io
或docker.io
)的帐户和权限,您要向其添加将运行 Debezium 连接器的容器。
流程
为 Kafka Connect 创建 Debezium SQL Server 容器:
创建一个 Dockerfile,它使用
registry.redhat.io/amq7/amq-streams-kafka-32-rhel8:2.2.0-12
作为基础镜像。例如,在终端窗口中输入以下命令:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
您可以指定您想要的任何文件名。
2
指定 Kafka Connect 插件目录的路径。如果您的 Kafka Connect 插件目录位于不同的位置,请将这个路径替换为您的目录的实际路径。
该命令在当前目录中创建一个名为
debezium-container-for-sqlserver.yaml
的 Dockerfile。从您在上一步中创建的
debezium-container-for-sqlserver.yaml
Docker 文件中构建容器镜像。在包含该文件的目录中,打开终端窗口并输入以下命令之一:podman build -t debezium-container-for-sqlserver:latest .
podman build -t debezium-container-for-sqlserver:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker build -t debezium-container-for-sqlserver:latest .
docker build -t debezium-container-for-sqlserver:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述命令使用名称
debezium-container-for-sqlserver
构建容器镜像。将自定义镜像推送到容器 registry,如 quay.io 或内部容器 registry。容器 registry 必须可供部署镜像的 OpenShift 实例使用。输入以下命令之一:
podman push <myregistry.io>/debezium-container-for-sqlserver:latest
podman push <myregistry.io>/debezium-container-for-sqlserver:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow docker push <myregistry.io>/debezium-container-for-sqlserver:latest
docker push <myregistry.io>/debezium-container-for-sqlserver:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建新的 Debezium SQL Server KafkaConnect 自定义资源(CR)。例如,创建一个名为
dbz-connect.yaml
的KafkaConnect
CR,用于指定注解和
镜像
属性。以下示例显示了来自dbz-connect.yaml
文件的摘录,该文件描述了KafkaConnect
自定义资源。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 项 描述 1
metadata.annotations
表示KafkaConnector
资源用于配置在这个 Kafka Connect 集群中使用的 Cluster Operator。2
spec.image
指定您为运行 Debezium 连接器而创建的镜像名称。此属性覆盖 Cluster Operator 中的STRIMZI_DEFAULT_KAFKA_CONNECT_IMAGE
变量。输入以下命令将
KafkaConnect
CR 应用到 OpenShift Kafka Connect 环境:oc create -f dbz-connect.yaml
oc create -f dbz-connect.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令添加一个 Kafka Connect 实例,用于指定您为运行 Debezium 连接器而创建的镜像名称。
创建一个
KafkaConnector
自定义资源来配置 Debezium SQL Server 连接器实例。您可以在
.yaml
文件中配置 Debezium SQL Server 连接器,该文件指定连接器的配置属性。连接器配置可能会指示 Debezium 为 schema 和表的子集生成事件,或者可能会设置属性,以便 Debezium 忽略敏感、太大或不需要的指定栏中的值。以下示例配置 Debezium 连接器,该连接器连接到端口
1433
上的 SQL 服务器主机192.168.99.100
。此主机有一个名为testDB
的数据库,名为 customer 的表,inventory-connector-sqlserver
是服务器的逻辑名称。SQL Server
inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表 8.16. 连接器配置设置的描述 项 描述 1
在将连接器注册到 Kafka Connect 服务时,它的名称。
2
此 SQL Server 连接器类的名称。
3
SQL Server 实例的地址。
4
SQL Server 实例的端口号。
5
SQL Server 用户的名称。
6
SQL Server 用户的密码。
7
要从中捕获更改的数据库名称。
8
SQL Server instance/cluster 的主题前缀,它组成一个命名空间,用于连接器写入的 Kafka 主题、Kafka Connect 模式名称和相应 Avro 模式的命名空间。
9
连接器仅捕获
dbo.customers
表中的更改。10
此连接器用来向数据库架构历史记录主题写入和恢复 DDL 语句的 Kafka 代理列表。
11
连接器将编写和恢复 DDL 语句的数据库架构历史记录主题的名称。本主题仅用于内部使用,不应供消费者使用。
12
存储服务器的 signer 证书的 SSL 信任存储的路径。除非禁用数据库加密,否则此属性是必需的(
database.encrypt=false
)。13
SSL 信任存储密码。除非禁用数据库加密,否则此属性是必需的(
database.encrypt=false
)。使用 Kafka Connect 创建连接器实例。例如,如果您将
KafkaConnector
资源保存到inventory-connector.yaml
文件中,您将运行以下命令:oc apply -f inventory-connector.yaml
oc apply -f inventory-connector.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述命令注册
inventory-connector
,连接器开始针对KafkaConnector
CR 中定义的testDB
数据库运行。
验证 Debezium SQL Server 连接器是否正在运行
如果连接器正确启动且没有错误,它会为每个连接器配置为捕获的表创建一个主题。下游应用程序可以订阅这些主题以检索源数据库中发生的信息事件。
要验证连接器是否正在运行,您可以从 OpenShift Container Platform Web 控制台或 OpenShift CLI 工具(oc)执行以下操作:
- 验证连接器状态。
- 验证连接器是否生成主题。
- 验证主题是否填充了每个表初始快照过程中生成的读操作("op":"r")的事件。
先决条件
- Debezium 连接器部署到 OpenShift 上的 AMQ Streams。
-
已安装 OpenShift
oc
CLI 客户端。 - 访问 OpenShift Container Platform web 控制台。
流程
使用以下方法之一检查
KafkaConnector
资源的状态:在 OpenShift Container Platform Web 控制台中:
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 以打开 Select Resource 复选框,然后键入
KafkaConnector
。 - 在 KafkaConnectors 列表中,点您要检查的连接器的名称,如 inventory-connector-sqlserver。
- 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc describe KafkaConnector <connector-name> -n <project>
oc describe KafkaConnector <connector-name> -n <project>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc describe KafkaConnector inventory-connector-sqlserver -n debezium
oc describe KafkaConnector inventory-connector-sqlserver -n debezium
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 8.3.
KafkaConnector
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证连接器是否已创建 Kafka 主题:
通过 OpenShift Container Platform Web 控制台。
- 导航到 Home → Search。
-
在 Search 页面中,点 Resources 打开 Select Resource 复选框,然后键入
KafkaTopic
。 -
在 KafkaTopics 列表中,点您要检查的主题的名称,例如
inventory-connector-sqlserver.inventory.orders--ac5e98ac6a5d91e04d8ec0dc9078a1ece439081d
。 - 在 Conditions 部分中,验证 Type 和 Status 列中的值是否已设置为 Ready 和 True。
在一个终端窗口中:
使用以下命令:
oc get kafkatopics
oc get kafkatopics
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该命令返回类似以下输出的状态信息:
例 8.4.
KafkaTopic
资源状态Copy to Clipboard Copied! Toggle word wrap Toggle overflow
检查主题内容。
- 在终端窗口中输入以下命令:
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
oc exec -n <project> -it <kafka-cluster> -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=<topic-name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-sqlserver.inventory.products_on_hand
oc exec -n debezium -it debezium-kafka-cluster-kafka-0 -- /opt/kafka/bin/kafka-console-consumer.sh \ > --bootstrap-server localhost:9092 \ > --from-beginning \ > --property print.key=true \ > --topic=inventory-connector-sqlserver.inventory.products_on_hand
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定主题名称的格式与
oc describe
命令的格式在第 1 步中返回,例如inventory-connector-sqlserver.inventory.addresses
。对于主题中的每个事件,命令会返回类似以下输出的信息:
例 8.5. Debezium 更改事件的内容
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-sqlserver.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-sqlserver.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-sqlserver.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.sqlserver.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-sqlserver.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"sqlserver","name":"inventory-connector-sqlserver","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"sqlserver-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
{"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"}],"optional":false,"name":"inventory-connector-sqlserver.inventory.products_on_hand.Key"},"payload":{"product_id":101}} {"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-sqlserver.inventory.products_on_hand.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"product_id"},{"type":"int32","optional":false,"field":"quantity"}],"optional":true,"name":"inventory-connector-sqlserver.inventory.products_on_hand.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":true,"field":"sequence"},{"type":"string","optional":true,"field":"table"},{"type":"int64","optional":false,"field":"server_id"},{"type":"string","optional":true,"field":"gtid"},{"type":"string","optional":false,"field":"file"},{"type":"int64","optional":false,"field":"pos"},{"type":"int32","optional":false,"field":"row"},{"type":"int64","optional":true,"field":"thread"},{"type":"string","optional":true,"field":"query"}],"optional":false,"name":"io.debezium.connector.sqlserver.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"},{"type":"int64","optional":false,"field":"total_order"},{"type":"int64","optional":false,"field":"data_collection_order"}],"optional":true,"field":"transaction"}],"optional":false,"name":"inventory-connector-sqlserver.inventory.products_on_hand.Envelope"},"payload":{"before":null,"after":{"product_id":101,"quantity":3},"source":{"version":"2.1.4.Final-redhat-00001","connector":"sqlserver","name":"inventory-connector-sqlserver","ts_ms":1638985247805,"snapshot":"true","db":"inventory","sequence":null,"table":"products_on_hand","server_id":0,"gtid":null,"file":"sqlserver-bin.000003","pos":156,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1638985247805,"transaction":null}}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,
有效负载
值显示连接器快照从表inventory.products_on_hand
中生成一个读取("op" ="r"
)事件。product_id
记录的"before"
状态为null
,这表示记录没有之前的值。"after"
状态对于product_id
为101
的项目的quantity
显示为3
。
有关您可以为 Debezium SQL Server 连接器设置的配置属性的完整列表,请参阅 SQL Server 连接器属性。
结果
当连接器启动时,它会对配置了连接器的 SQL Server 数据库 执行一致的快照。然后,连接器开始为行级操作生成数据更改事件,并将更改事件记录流传输到 Kafka 主题。
8.4.4. Debezium SQL Server 连接器配置属性的描述 复制链接链接已复制到粘贴板!
Debezium SQL Server 连接器有很多配置属性,您可以使用它们来实现应用程序的正确连接器行为。许多属性具有默认值。
有关属性的信息按如下方式进行组织:
- 所需的连接器配置属性
- 高级连接器配置属性
数据库架构历史记录配置属性,用于控制 Debezium 如何处理从数据库架构历史记录主题读取的事件。
- 控制 数据库驱动程序行为的直通数据库驱动程序属性。
所需的 Debezium SQL Server 连接器配置属性
除非默认值可用 , 否则需要以下配置属性。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 | 连接器的唯一名称。尝试再次使用相同的名称注册将失败。(所有 Kafka Connect 连接器都需要此属性。) | |
没有默认值 |
连接器的 Java 类的名称。对于 SQL | |
| 指定连接器可用于从数据库实例捕获数据的最大任务数量。 | |
没有默认值 | SQL Server 数据库服务器的 IP 地址或主机名。 | |
| SQL Server 数据库服务器的整数端口号。 | |
没有默认值 | 连接到 SQL Server 数据库服务器时使用的用户名。在使用 Kerberos 身份验证时,可以省略,这可使用 直通属性进行配置。 | |
没有默认值 | 连接到 SQL Server 数据库服务器时要使用的密码。 | |
没有默认值 | ||
没有默认值 |
为您希望 Debezium 捕获的 SQL Server 数据库服务器提供命名空间的主题前缀。前缀在所有其他连接器中应该是唯一的,因为它用作从这个连接器接收记录的所有 Kafka 主题名称的前缀。数据库服务器逻辑名称中只能使用字母数字字符、连字符、句点和下划线。 警告 不要更改此属性的值。如果您更改了 name 值,重启后,而不是继续向原始主题发出事件,连接器会将后续事件发送到名称基于新值的主题。连接器也无法恢复其数据库架构历史记录主题。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与您要 捕获更改的模式的名称匹配。任何未包含在 schema.
要匹配架构的名称,Debezium 应用您指定的正则表达式,以 替代 的正则表达式。也就是说,指定的表达式与模式的整个名称字符串匹配,它与 schema 名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的、以逗号分隔的正则表达式列表,与 您不想 捕获更改的模式的名称匹配。任何名称没有包含在 schema.
要匹配架构的名称,Debezium 应用您指定的正则表达式,以 替代 的正则表达式。也就是说,指定的表达式与模式的整个名称字符串匹配,它与 schema 名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的正则表达式列表,与您希望 Debezium 捕获的表的完全限定表标识符匹配。默认情况下,连接器捕获指定模式的所有非系统表。当设置此属性时,连接器只从指定的表中捕获更改。每个标识符的格式都是 schemaName。tableName。
要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
没有默认值 |
可选的正则表达式列表,与您要捕获的表的完全限定表标识符匹配。Debezium 捕获
要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
空字符串 |
可选的正则表达式列表,其与更改事件消息值中包含的列的完全限定名称匹配。列的完全限定域名格式为 schemaName。tableName.columnName。请注意,事件键中始终包含主键列,即使值中没有包括。
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配,它与列名称中可能存在的子字符串不匹配。 | |
空字符串 |
可选的正则表达式列表,该表达式与应该从更改事件消息值中排除的列的完全限定名称匹配。列的完全限定域名格式为 schemaName。tableName.columnName。请注意,如果从值中排除,则总在事件键中包含主键列。
要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配,它与列名称中可能存在的子字符串不匹配。 | |
| 不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。列的完全限定域名格式为 '< schemaName> . <tableName> .<columnName>'。
一个 pseudonym,它包括了通过应用指定的 hashAlgorithm 和 salt 的结果的哈希值。根据使用的 hash 功能,会维护引用完整性,而列值则替换为伪nyms。支持的哈希功能在 Java Cryptography 架构标准算法名称文档中的 MessageDigest 部分 进行了描述。 column.mask.hash.SHA-256.with.salt.CzQMA0cB5K = inventory.orders.customerName, inventory.shipment.customerName
如有必要,伪的nym 会自动缩短到列的长度。连接器配置可以包含多个指定不同哈希算法和 salt 的属性。 |
|
时间、日期和时间戳可以通过不同类型的精度表示,包括: | |
|
指定连接器如何处理 | |
|
指定连接器是否应该将数据库模式中的更改发布到与数据库服务器 ID 的名称相同的 Kafka 主题的布尔值。每个架构更改都会使用一个键进行记录,其中包含数据库名称和一个 JSON 结构,用于描述 schema 更新。这独立于连接器内部记录数据库架构历史记录。默认值是 | |
|
控制 删除 事件是否随后是 tombstone 事件。 | |
不适用 |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。如果您要在一组列中超过属性名称中指定的字符数时,设置此属性。将
列的完全限定域名会观察以下格式:< 您可以在单个配置中指定多个长度不同的属性。 | |
列的 N /a 完全限定名称的格式是 schemaName。tableName.columnName. |
一个可选的、以逗号分隔的正则表达式列表,与基于字符的列的完全限定名称匹配。如果您希望连接器屏蔽一组列的值,例如,如果它们包含敏感数据,则设置此属性。将 列的完全限定域名会观察以下格式: schemaName.tableName.columnName。要匹配列的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与列的整个名称字符串匹配;表达式不匹配列名称中可能存在的子字符串。 您可以在单个配置中指定多个长度不同的属性。 | |
不适用 | 可选的、以逗号分隔的正则表达式列表,它与您希望连接器发送代表列元数据的完全限定名称匹配。当设置此属性时,连接器会将以下字段添加到事件记录的架构中:
这些参数分别传播列的原始类型和长度(用于变量带宽类型)。
列的完全限定域名会观察以下格式: schemaName.tableName.columnName。 | |
不适用 | 可选的、以逗号分隔的正则表达式列表,用于指定为数据库列定义的数据类型的完全限定名称。当设置此属性时,对于具有匹配数据类型的列,连接器会发出事件记录,该记录在 schema 中包含以下额外字段:
这些参数分别传播列的原始类型和长度(用于变量带宽类型)。
列的完全限定域名会观察以下格式: schemaName.tableName.typeName。 有关 SQL Server 特定数据类型名称的列表,请查看 SQL Server 数据类型映射。 | |
不适用 | 指定连接器用来组成自定义消息键的表达式列表,以更改它发布到指定表的 Kafka 主题的事件记录。
默认情况下,Debezium 使用表的主键列作为它发出的记录的消息键。对于缺少主密钥的表,或者指定缺少主密钥的表的密钥,您可以根据一个或多个列配置自定义消息密钥。
每个完全限定表名称都是正则表达式,格式为: 对您用来创建自定义消息键的列数没有限制。但是,最好使用指定唯一密钥所需的最小数量。 | |
bytes |
指定在更改事件中 | |
none |
指定如何调整架构名称,以便与连接器使用的消息转换器兼容。可能的设置:
|
高级 SQL Server 连接器配置属性
以下 高级配置 属性有很好的默认值,其在大多数情况下可以正常工作,因此很少需要在连接器配置中指定。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 |
枚举连接器可以使用 的自定义转换器 实例的符号名称的逗号分隔列表。例如,
您必须设置
对于您为连接器配置的每个转换器,还必须添加一个
例如, isbn.type: io.debezium.test.IsbnConverter
如果要进一步控制配置的转换器的行为,您可以添加一个或多个配置参数将值传递给转换器。要将任何其他配置参数与转换器关联,请将参数名称与转换器的符号链接名称添加前缀。例如, isbn.schema.name: io.debezium.sqlserver.type.Isbn
| |
Initial | 采用结构的初始快照以及捕获表(可选)数据的模式。快照完成后,连接器将继续从数据库的 redo 日志中读取更改事件。支持以下值:
| |
|
一个可选的、以逗号分隔的正则表达式列表,匹配表的完全限定名 ( 要匹配表的名称,Debebe 应用您指定的正则表达式。也就是说,指定的表达式与表的整个名称字符串匹配,它与表名称中可能存在的子字符串不匹配。 | |
repeatable_read | 控制使用哪些事务隔离级别的模式,以及连接器锁定表用于捕获的时长。支持以下值:
模式选择也会影响数据一致性。只有 | |
|
指定连接器在处理事件时应如何响应异常。 | |
| 正整数值,用于指定连接器在每次迭代期间应该等待的毫秒数,以便显示新的更改事件。默认值为 500 毫秒,或 0.5 秒。 | |
|
正整数值,用于指定阻塞队列可以保存的最大记录数。当 Debezium 从数据库读取事件时,它会将事件放置在阻塞队列中,然后再将它们写入 Kafka。当连接器将消息写入 Kafka 或 Kafka 不可用时,阻塞队列可以提供从数据库读取更改事件的后端。当连接器定期记录偏移时,队列中保存的事件会被忽略。始终将 | |
|
较长的整数值,指定块队列的最大卷(以字节为单位)。默认情况下,不会为阻塞队列指定卷限制。要指定队列可以使用的字节数,请将此属性设置为正长值。 | |
| 正整数值,用于指定在每个连接器迭代过程中应处理的每个批处理事件的最大大小。 | |
|
控制发送心跳消息的频率。 | |
没有默认值 |
连接器在启动后进行快照前应等待的时间 ; | |
| 指定在进行快照时应从一个表中读取的最大行数。连接器将以这个大小的多个批处理读取表内容。默认值为 2000。 | |
没有默认值 | 指定在给定查询的每个数据库往返时将获取的行数。默认为 JDBC 驱动程序的默认获取大小。 | |
|
整数值,用于指定在执行快照时等待获取表锁定的最长时间(以毫秒为单位)。如果无法在这个时间段内获取表锁定,则快照将失败(也看到 快照)。 | |
没有默认值 | 指定要包含在快照中的表行。如果您希望快照仅在表中包括行的子集,请使用此属性。此属性仅影响快照。它不适用于连接器从日志中读取的事件。
属性包含一个以逗号分隔的表名称列表,格式为 <
在包含 soft-delete 列 "snapshot.select.statement.overrides": "customer.orders", "snapshot.select.statement.overrides.customer.orders": "SELECT * FROM [customers].[orders] WHERE delete_flag = 0 ORDER BY id DESC"
在生成的快照中,连接器仅包含 | |
当连接器配置明确指定使用 Avro 的 | 字段名称是否被清理以遵守 Avro 命名要求。如需了解更多详细信息,请参阅 Avro 命名。 | |
|
当设置为 | |
10000 (10 秒) | 在发生可分配错误后重启连接器前要等待的 milli-seconds 数量。 | |
|
以逗号分隔的操作类型列表,这些类型将在流期间跳过。操作包括: | |
没有默认值 |
用于向连接器发送信号的数据收集的完全限定名称。https://access.redhat.com/documentation/zh-cn/red_hat_build_of_debezium/2.1.4/html-single/debezium_user_guide/index#debezium-signaling-enabling-signaling | |
|
在增量快照期间允许架构更改。启用连接器时,会在增量快照期间检测模式更改,并重新选择当前的块以避免锁定 DDL。 | |
| 连接器在增量快照块期间获取并读取内存的最大行数。增加块大小可提高效率,因为快照会运行更大的快照查询。但是,较大的块大小还需要更多内存来缓冲快照数据。将块大小调整为在您的环境中提供最佳性能的值。 | |
0 |
指定每个迭代的最大事务数,用于减少数据库中的多个表更改时的内存占用量。当设置为 | |
| 使用 OPTION (RECOMPILE)查询选项到增量快照中使用的所有 SELECT 语句。这有助于解决可能发生的参数,但可能导致源数据库上的 CPU 负载增加,具体取决于查询执行的频率。 | |
|
应该用来决定数据更改的主题名称、模式更改、事务、心跳事件等的 TopicNamingStrategy 类的名称,默认为 | |
|
指定主题名称的分隔符,默认为 | |
| 用于在绑定并发哈希映射中保存主题名称的大小。此缓存有助于确定与给定数据收集对应的主题名称。 | |
|
控制连接器向发送心跳消息的主题名称。主题名称具有此模式: | |
|
控制连接器向发送事务元数据消息的主题名称。主题名称具有此模式: 如需更多信息,请参阅 事务元数据。 |
Debezium SQL Server 连接器数据库模式历史记录配置属性
Debezium 提供了一组 schema.history.internal114
属性,用于控制连接器如何与 schema 历史记录主题交互。
下表描述了用于配置 Debezium 连接器的 schema.history.internal
属性。
属性 | 默认 | 描述 |
---|---|---|
没有默认值 | 连接器存储数据库架构历史记录的 Kafka 主题的完整名称。 | |
没有默认值 | 连接器用来建立到 Kafka 集群的初始连接的主机/端口对列表。此连接用于检索之前由连接器存储的数据库架构历史记录,并编写从源数据库读取的每个 DDL 语句。每个对都应该指向 Kafka Connect 进程使用的相同 Kafka 集群。 | |
| 整数值,用于指定连接器在轮询保留数据时应该等待的最大毫秒数。默认值为 100ms。 | |
| 指定连接器在使用 Kafka admin 客户端获取集群信息时应等待的最大毫秒数。 | |
| 指定连接器在使用 Kafka admin 客户端创建 kafka 历史记录主题时应等待的最大毫秒数。 | |
|
连接器在连接器恢复失败前读取保留历史记录数据的次数上限。在收到数据后等待的最长时间为 | |
|
指定连接器是否应该忽略不正确的或未知数据库语句或停止处理等布尔值,以便人可以解决这个问题。安全默认值为 | |
|
指定连接器是否应该记录所有 DDL 语句的布尔值
安全默认值为 |
直通数据库模式历史记录属性,用于配置制作者和消费者客户端
Debezium 依赖于 Kafka producer 将模式更改写入数据库架构历史记录主题。同样,它依赖于 Kafka 使用者在连接器启动时从数据库 schema 历史记录主题中读取。您可以通过将值分配给以 schema.history.internal.consumer 前缀开头的一组直通配置属性来定义 Kafka producer
和 消费者
客户端的配置。直通制作者和消费者数据库模式历史记录属性控制一系列行为,如这些客户端如何与 Kafka 代理安全连接,如下例所示:
Debezium 在将属性传递给 Kafka 客户端之前,从属性名称中分离前缀。
如需有关 Kafka producer 配置属性和 Kafka 使用者配置属性的更多详情,请参阅 Kafka 文档。
Debezium SQL Server 连接器传递数据库驱动程序配置属性
Debezium 连接器为数据库驱动程序的透传配置提供。直通数据库属性以前缀 驱动程序 开头
。例如,连接器将 driver.foobar=false
等属性传递给 JDBC URL。
与 数据库架构历史记录客户端的直通属性 一样,Debebe 会将属性中的前缀从属性分离,然后再将它们传递给数据库驱动程序。
8.5. 在模式更改后刷新捕获表 复制链接链接已复制到粘贴板!
当为 SQL Server 表启用数据捕获时,如表中的更改一样,事件记录会保留到服务器上的捕获表中。如果您对源表更改的结构进行了更改,例如通过添加新列,则这个更改不会动态反映在更改表中。只要捕获表继续使用过时的模式,Debezium 连接器无法正确为表发出数据更改事件。您必须刷新捕获表才能使连接器恢复处理更改事件。
由于 CDC 在 SQL Server 中实施的方式,您无法使用 Debezium 更新捕获表。要刷新捕获表,必须是具有升级权限的 SQL Server 数据库 operator。作为 Debezium 用户,您必须使用 SQL Server 数据库 operator 协调任务,以完成架构刷新并恢复到 Kafka 主题。
您可以使用以下方法之一在 schema 更改后更新捕获表:
使用每种流程的优点和缺点。
无论您是使用在线还是离线更新方法,必须在在同一源表中应用后续的模式更新前完成整个模式更新过程。最佳实践是在单个批处理中执行所有 DDL,这样流程只能运行一次。
启用 CDC 的源表不支持一些模式更改。例如,如果在表中启用了 CDC,如果您重命名了其中一个列或更改列类型,则 SQL Server 不允许更改表的 schema。
将源表中的列从 NULL
改为 NOT NULL
或反之后,SQL Server 连接器无法正确捕获更改的信息,直到您创建新的捕获实例为止。如果您在更改列设计后没有创建新的捕获表,则更改连接器发出的事件记录无法正确指示列是否是可选的。也就是说,之前定义为可选(或 NULL
)的列仍然如此,尽管现在被定义为 NOT NULL
。同样,已根据需要定义的列(notNULL
),保留该设计,虽然它们现在定义为 NULL
。
使用 sp_rename
功能重命名表后,它将继续在旧源表名称下发出更改,直到连接器重启为止。重启连接器后,它将在新源表名称下发出更改。
8.5.1. 模式更改后运行离线更新 复制链接链接已复制到粘贴板!
离线模式更新提供了更新捕获表的安全方法。但是,离线更新可能不适用于需要高可用性的应用程序。
先决条件
- 更新被提交到启用了 CDC 的 SQL Server 表的 schema。
- 您是一个具有升级权限的 SQL Server 数据库 operator。
流程
- 暂停更新数据库的应用。
- 等待 Debezium 连接器流传输所有未流更改事件记录。
- 停止 Debezium 连接器。
- 将所有更改应用到源表模式。
-
使用
sys.sp_cdc_enable_table
进程为更新源表创建一个新的捕获表,以及参数@capture_instance
的唯一值。 - 恢复在第 1 步中暂停的应用程序。
- 启动 Debezium 连接器。
-
在 Debezium 连接器从新的捕获表中启动流后,通过运行存储的步骤
sys.sp_cdc_disable_table
来丢弃旧的捕获表,并将参数@capture_instance
设置为旧捕获实例名称。
8.5.2. 架构更改后运行在线更新 复制链接链接已复制到粘贴板!
完成在线架构更新的过程比运行离线架构更新的步骤要简单,您可以在应用程序和数据处理中无需停机才能完成。但是,有了在线架构更新,在更新源数据库中的模式后,可能会出现潜在的处理差距,但在创建新捕获实例前可能会发生。在该间隔中,更改事件仍然被更改表的旧实例捕获,而保存到旧表中的更改数据会保留之前架构的结构。例如,如果您在源表中添加新列,请在新捕获表就绪前更改生成的事件,请不要包含新列的字段。如果您的应用程序没有容许这样的转换周期,最好使用离线架构更新过程。
先决条件
- 更新被提交到启用了 CDC 的 SQL Server 表的 schema。
- 您是一个具有升级权限的 SQL Server 数据库 operator。
流程
- 将所有更改应用到源表模式。
-
通过运行带有参数
@capture_instance
的唯一值的sys.sp_cdc_enable_table
存储的流程,为更新源表创建一个新的捕获表。 -
当 Debezium 从新捕获表中启动流时,您可以通过运行
sys.sp_cdc_disable_table
存储流程并将参数@capture_instance
设置为旧捕获实例名称来丢弃旧的捕获表。
示例:在数据库 schema 更改后运行在线 schema 更新
以下示例演示了如何在将列 phone_number
添加到 customers
源表中后在更改表中完成在线模式更新。
运行以下查询来添加
phone_number
字段来修改customers
源表的 schema:ALTER TABLE customers ADD phone_number VARCHAR(32);
ALTER TABLE customers ADD phone_number VARCHAR(32);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过运行
sys.sp_cdc_enable_table
存储的步骤来创建新的捕获实例。EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', @source_name = 'customers', @role_name = NULL, @supports_net_changes = 0, @capture_instance = 'dbo_customers_v2'; GO
EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', @source_name = 'customers', @role_name = NULL, @supports_net_changes = 0, @capture_instance = 'dbo_customers_v2'; GO
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下查询在
customers
表中插入新数据:INSERT INTO customers(first_name,last_name,email,phone_number) VALUES ('John','Doe','john.doe@example.com', '+1-555-123456'); GO
INSERT INTO customers(first_name,last_name,email,phone_number) VALUES ('John','Doe','john.doe@example.com', '+1-555-123456'); GO
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Kafka Connect 日志通过类似以下消息的条目报告配置更新:
connect_1 | 2019-01-17 10:11:14,924 INFO || Multiple capture instances present for the same table: Capture instance "dbo_customers" [sourceTableId=testDB.dbo.customers, changeTableId=testDB.cdc.dbo_customers_CT, startLsn=00000024:00000d98:0036, changeTableObjectId=1525580473, stopLsn=00000025:00000ef8:0048] and Capture instance "dbo_customers_v2" [sourceTableId=testDB.dbo.customers, changeTableId=testDB.cdc.dbo_customers_v2_CT, startLsn=00000025:00000ef8:0048, changeTableObjectId=1749581271, stopLsn=NULL] [io.debezium.connector.sqlserver.SqlServerStreamingChangeEventSource] connect_1 | 2019-01-17 10:11:14,924 INFO || Schema will be changed for ChangeTable [captureInstance=dbo_customers_v2, sourceTableId=testDB.dbo.customers, changeTableId=testDB.cdc.dbo_customers_v2_CT, startLsn=00000025:00000ef8:0048, changeTableObjectId=1749581271, stopLsn=NULL] [io.debezium.connector.sqlserver.SqlServerStreamingChangeEventSource] ... connect_1 | 2019-01-17 10:11:33,719 INFO || Migrating schema to ChangeTable [captureInstance=dbo_customers_v2, sourceTableId=testDB.dbo.customers, changeTableId=testDB.cdc.dbo_customers_v2_CT, startLsn=00000025:00000ef8:0048, changeTableObjectId=1749581271, stopLsn=NULL] [io.debezium.connector.sqlserver.SqlServerStreamingChangeEventSource]
connect_1 | 2019-01-17 10:11:14,924 INFO || Multiple capture instances present for the same table: Capture instance "dbo_customers" [sourceTableId=testDB.dbo.customers, changeTableId=testDB.cdc.dbo_customers_CT, startLsn=00000024:00000d98:0036, changeTableObjectId=1525580473, stopLsn=00000025:00000ef8:0048] and Capture instance "dbo_customers_v2" [sourceTableId=testDB.dbo.customers, changeTableId=testDB.cdc.dbo_customers_v2_CT, startLsn=00000025:00000ef8:0048, changeTableObjectId=1749581271, stopLsn=NULL] [io.debezium.connector.sqlserver.SqlServerStreamingChangeEventSource] connect_1 | 2019-01-17 10:11:14,924 INFO || Schema will be changed for ChangeTable [captureInstance=dbo_customers_v2, sourceTableId=testDB.dbo.customers, changeTableId=testDB.cdc.dbo_customers_v2_CT, startLsn=00000025:00000ef8:0048, changeTableObjectId=1749581271, stopLsn=NULL] [io.debezium.connector.sqlserver.SqlServerStreamingChangeEventSource] ... connect_1 | 2019-01-17 10:11:33,719 INFO || Migrating schema to ChangeTable [captureInstance=dbo_customers_v2, sourceTableId=testDB.dbo.customers, changeTableId=testDB.cdc.dbo_customers_v2_CT, startLsn=00000025:00000ef8:0048, changeTableObjectId=1749581271, stopLsn=NULL] [io.debezium.connector.sqlserver.SqlServerStreamingChangeEventSource]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 最后,将
phone_number
字段添加到 schema 中,其值会出现在写入 Kafka 主题的消息中。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
sys.sp_cdc_disable_table
存储的步骤来丢弃旧的捕获实例。EXEC sys.sp_cdc_disable_table @source_schema = 'dbo', @source_name = 'dbo_customers', @capture_instance = 'dbo_customers'; GO
EXEC sys.sp_cdc_disable_table @source_schema = 'dbo', @source_name = 'dbo_customers', @capture_instance = 'dbo_customers'; GO
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.6. 监控 Debezium SQL Server 连接器性能 复制链接链接已复制到粘贴板!
Debezium SQL Server 连接器除了支持 Zookeeper、Kafka 和 Kafka Connect 提供的 JMX 指标外,还提供三种类型的指标。连接器提供以下指标:
- 执行快照时用于监控连接器的快照 指标。
- 读取 CDC 表数据时用于监控连接器的 流传输指标。
- 用于监控连接器 架构历史记录状态的 schema 历史记录指标。
有关如何通过 JMX 公开前面指标的详情,请参考 Debezium 监控文档。
8.6.1. Debezium SQL Server 连接器快照指标 复制链接链接已复制到粘贴板!
MBean 是 debezium.sql_server:type=connector-metrics,server= <sqlserver.server.name> , task= <task.id>,context=snapshot
。
除非快照操作处于活跃状态,否则快照指标不会被公开,或者快照自上次连接器启动后发生。
下表列出了可用的 shapshot 指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个快照事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器从上次启动或重置后看到的事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在快照和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 包括在快照中的表的总数。 | |
| 快照要复制的表数。 | |
| 快照是否启动。 | |
| 快照是否暂停。 | |
| 快照是否中止。 | |
| 快照是否完成。 | |
| 快照目前花费的秒数,即使未完成也是如此。还包括快照暂停时的时间。 | |
| 快照暂停的秒数。如果快照暂停多次,则暂停的时间会增加。 | |
| 包含快照中每个表扫描的行数的映射。表在处理期间逐步添加到映射中。更新每个 10,000 行扫描,并在完成表后更新。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
在执行增量快照时,连接器还提供以下额外快照指标:
8.6.2. Debezium SQL Server 连接器流指标 复制链接链接已复制到粘贴板!
MBean 是 debezium.sql_server:type=connector-metrics,server= <sqlserver.server.name > ,task= <task.id>,context=streaming
。
下表列出了可用的流指标。
属性 | 类型 | 描述 |
---|---|---|
| 连接器读取的最后一个流事件。 | |
| 连接器读取和处理最新事件以来的毫秒数。 | |
| 此连接器自上次开始或指标重置以来看到的事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的创建事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的更新事件总数。 | |
| 此连接器自上次开始或指标重置以来看到的删除事件总数。 | |
| 由连接器中配置的 include/exclude 列表过滤规则过滤的事件数。 | |
| 连接器捕获的表列表。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列长度。 | |
| 用于在流和主 Kafka Connect 循环之间传递事件的队列的空闲容量。 | |
| 表示连接器当前是否连接到数据库服务器的标记。 | |
| 最后一次更改事件时间戳和连接器处理之间毫秒的数量。该值将限制运行数据库服务器和连接器的机器上时钟之间的差别。 | |
| 已提交的已处理的事务数量。 | |
| 最后一次接收的事件的协调。 | |
| 最后一次处理的事务的事务标识符。 | |
|
队列的最大缓冲区(以字节为单位)。如果 | |
| 队列中记录的当前卷(以字节为单位)。 |
8.6.3. Debezium SQL Server 连接器模式历史记录指标 复制链接链接已复制到粘贴板!
MBean 是 debezium.sql_server:type=connector-metrics,context=schema-history,server= <sqlserver.server.name>
。
下表列出了可用的模式历史记录指标。
属性 | 类型 | 描述 |
---|---|---|
|
| |
| 恢复开始的时间(以 epoch 秒为单位)。 | |
| 恢复阶段读取的更改数量。 | |
| 恢复和运行时应用的架构更改总数。 | |
| 从历史记录存储中恢复自上次更改以来的毫秒数。 | |
| 从上次更改被应用后经过的毫秒数。 | |
| 从历史记录存储中恢复最后一次更改的字符串表示。 | |
| 最后一次应用的更改的字符串表示。 |
第 9 章 监控 Debezium 复制链接链接已复制到粘贴板!
您可以使用 Apache Zookeeper、Apache Kafka 和 Kafka Connect 提供的 JMX 指标来监控 Debezium。要使用这些指标,您必须在启动 Zookeeper、Kafka 和 Kafka Connect 服务时启用它们。启用 JMX 涉及设置正确的环境变量。
如果您在同一台机器上运行多个服务,请确保为每个服务使用不同的 JMX 端口。
9.1. 用于监控 Debezium 连接器的指标 复制链接链接已复制到粘贴板!
除了 Kafka、Zookeeper 和 Kafka Connect 中 JMX 指标的内置支持外,每个连接器都提供了用于监控其活动的额外指标。
9.2. 在本地安装中启用 JMX 复制链接链接已复制到粘贴板!
使用 Zookeeper、Kafka 和 Kafka Connect 时,您可以通过在启动每个服务时设置适当的环境变量来启用 JMX。
9.2.1. ZooKeeper JMX 环境变量 复制链接链接已复制到粘贴板!
ZooKeeper 对 JMX 的内置支持。当使用本地安装运行 Zookeeper 时,zkServer.sh
脚本会识别以下环境变量:
JMXPORT
-
启用 JMX 并指定用于 JMX 的端口号。该值用于指定 JVM 参数
-Dcom.sun.management.jmxremote.port=$JMXPORT
。 JMXAUTH
-
JMX 客户端在连接时必须使用密码身份验证。必须为
true
或false
。默认值为false
。该值用于指定 JVM 参数-Dcom.sun.management.jmxremote.authenticate=$JMXAUTH
。 JMXSSL
-
JMX 客户端是否使用 SSL/TLS 进行连接。必须为
true
或false
。默认值为false
。该值用于指定 JVM 参数-Dcom.sun.management.jmxremote.ssl=$JMXSSL
。 JMXLOG4J
-
是否应禁用 Log4J JMX MBeans。必须为
true
(默认)或false
。默认值是true
。该值用于指定 JVM 参数-Dzookeeper.jmx.log4j.disable=$JMXLOG4J
。
9.2.2. Kafka JMX 环境变量 复制链接链接已复制到粘贴板!
当使用本地安装运行 Kafka 时,kafka-server-start.sh
脚本会识别以下环境变量:
JMX_PORT
-
启用 JMX 并指定用于 JMX 的端口号。该值用于指定 JVM 参数
-Dcom.sun.management.jmxremote.port=$JMX_PORT
。 KAFKA_JMX_OPTS
JMX 选项,在启动时直接传递给 JVM。默认选项有:
-
-Dcom.sun.management.jmxremote
-
-Dcom.sun.management.jmxremote.authenticate=false
-
-Dcom.sun.management.jmxremote.ssl=false
-
9.2.3. Kafka Connect JMX 环境变量 复制链接链接已复制到粘贴板!
当使用本地安装运行 Kafka 时,connect-distributed.sh
脚本会识别以下环境变量:
JMX_PORT
-
启用 JMX 并指定用于 JMX 的端口号。该值用于指定 JVM 参数
-Dcom.sun.management.jmxremote.port=$JMX_PORT
。 KAFKA_JMX_OPTS
JMX 选项,在启动时直接传递给 JVM。默认选项有:
-
-Dcom.sun.management.jmxremote
-
-Dcom.sun.management.jmxremote.authenticate=false
-
-Dcom.sun.management.jmxremote.ssl=false
-
9.3. 监控 OpenShift 上的 Debezium 复制链接链接已复制到粘贴板!
如果您在 OpenShift 上使用 Debezium,您可以通过在 9999
上打开 JMX 端口来获取 JMX 指标。如需更多信息,请参阅在 OpenShift 中使用 AMQ Streams 中的 JMX 选项。
另外,您可以使用 Prometheus 和 Grafana 监控 JMX 指标。如需更多信息,请参阅在 OpenShift 中部署和升级 AMQ Streams 中的 将指标引入到 Kafka。
第 10 章 Debezium 日志记录 复制链接链接已复制到粘贴板!
Debezium 在其连接器中内置了大量日志,您可以更改日志配置来控制这些日志语句出现在日志中,以及发送这些日志的位置。Debezium (以及 Kafka、Kafka Connect 和 Zookeeper)使用 Java 的 Log4j 日志记录框架。
默认情况下,连接器在启动时生成大量有用的信息,但在连接器与源数据库保持同步时会生成非常少的日志。当连接器正常运行时,这通常就足够了,但在连接器意外的行为时可能不够。在这种情况下,您可以更改日志级别,以便连接器生成更详细的日志消息,描述连接器的作用及其不做什么。
10.1. Debezium 日志记录概念 复制链接链接已复制到粘贴板!
在配置日志记录之前,您应该了解 Log4J loggers、日志级别和 附加程序 是什么。
日志记录器
应用生成的每个日志消息发送到特定的 日志记录器 (如 io.debezium.connector.mysql
)。日志记录器按层次结构排列。例如,io.debezium.connector.mysql
日志记录器是 io.debezium.connector
日志记录器的子项,它是 io.debezium
日志记录器的子程序。在层次结构的顶部,根日志记录器定义 了其下所有日志记录器的默认日志记录器配置。
日志级别
应用程序生成的每个日志消息也具有特定的 日志级别 :
-
ERROR
- 错误、例外和其他显著问题 -
警告
- 潜在的问题 和问题 -
INFO
- 状态和常规活动(通常是低卷) -
DEBUG
- 在诊断意外行为时非常有用的更详细的活动 -
TRACE
- 非常详细和详细的活动(通常是非常大的)
Appenders
appender 基本上是写入日志消息的目的地。每个附加程序控制其日志消息的格式,您可以更多地控制日志消息的样子。
要配置日志记录,您需要为每个日志记录器指定所需的级别,以及应该写入这些日志消息的附加程序。由于日志记录器是分层的,根日志记录器的配置充当下面的所有日志记录器的默认值,但您可以覆盖任何子(或后代)日志记录器。
10.2. 默认 Debezium 日志记录配置 复制链接链接已复制到粘贴板!
如果您在 Kafka Connect 过程中运行 Debezium 连接器,则 Kafka Connect 将使用 Kafka 安装中的 Log4j 配置文件(例如 /opt/kafka/config/connect-log4j.properties
)。默认情况下,此文件包含以下配置:
connect-log4j.properties
除非配置其他日志记录器,否则 Debezium 使用的所有日志记录器都继承 rootLogger
配置。
10.3. 配置 Debezium 日志记录 复制链接链接已复制到粘贴板!
默认情况下,Debezium 连接器将所有 INFO
、WARN
和 ERROR
消息写入控制台。您可以使用以下方法之一更改默认日志配置:
您可以使用其他方法使用 Log4j 配置 Debezium 日志记录。如需更多信息,请搜索有关设置和使用附加者向特定目的地发送日志消息的教程。
10.3.1. 通过配置日志记录器来更改 Debezium 日志记录级别 复制链接链接已复制到粘贴板!
默认 Debezium 日志记录级别提供足够的信息来显示连接器是否健康。但是,如果连接器不健康,您可以更改其日志级别来排除这个问题。
通常,Debezium 连接器将其日志消息发送到与生成日志消息的 Java 类的完全限定名称匹配的日志记录器。Debezium 使用软件包来组织具有类似或相关功能的代码。这意味着您可以控制特定类的所有日志消息,或者控制特定软件包内或所有类的所有日志消息。
流程
-
打开
log4j.properties
文件。 为连接器配置日志记录器。
这个示例为 MySQL 连接器和连接器使用的数据库架构历史记录实现配置了日志记录器,并将其设置为日志记录
DEBUG
级别的信息:log4j.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如有必要,更改连接器中类的特定子集的日志级别。
增加整个连接器的日志级别会增加日志详细程度,这有助于了解发生的情况。在这些情况下,您只能为与您要故障排除的问题相关的类子集更改日志级别。
-
将连接器的日志级别设置为
DEBUG
或TRACE
。 查看连接器的日志消息。
查找与您要故障排除相关的问题相关的日志消息。每个日志消息的末尾显示生成消息的 Java 类的名称。
-
将连接器的日志级别设置为
INFO
。 为您识别的每个 Java 类配置日志记录器。
例如,假设您不确定 MySQL 连接器在处理 binlog 时跳过一些事件的原因。您可以把连接器的日志记录保持在
INFO
中,而不是为整个连接器打开DEBUG
或TRACE
日志记录,然后只对正在读取 binlog 的类配置DEBUG
或TRACE
:log4j.properties
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
将连接器的日志级别设置为
10.3.2. 使用 Kafka Connect API 动态更改 Debezium 日志记录级别 复制链接链接已复制到粘贴板!
您可以使用 Kafka Connect REST API 在运行时动态设置连接器的日志级别。与您在 log4j.properties
中设置的日志级别更改不同,您通过 API 所做的更改会立即生效,且不需要重启 worker。
您在 API 中指定的日志级别设置只适用于接收请求的端点的 worker。集群中其他 worker 的日志级别保持不变。
在 worker 重启后,指定级别不会被保留。要对日志级别进行持久更改,请通过 配置日志记录器 或添加 映射的诊断上下文 来设置 log4j.properties
中的日志级别。
流程
通过将 PUT 请求发送到指定以下信息的
admin/loggers
端点来设置日志级别:- 您要更改日志级别的软件包。
要设置的日志级别。
curl -s -X PUT -H "Content-Type:application/json" http://localhost:8083/admin/loggers/io.debezium.connector.<connector_package> -d '{"level": "<log_level>"}'
curl -s -X PUT -H "Content-Type:application/json" http://localhost:8083/admin/loggers/io.debezium.connector.<connector_package> -d '{"level": "<log_level>"}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,要记录 Debezium MySQL 连接器的调试信息,请将以下请求发送到 Kafka Connect:
curl -s -X PUT -H "Content-Type:application/json" http://localhost:8083/admin/loggers/io.debezium.connector.mysql -d '{"level": "DEBUG"}'
curl -s -X PUT -H "Content-Type:application/json" http://localhost:8083/admin/loggers/io.debezium.connector.mysql -d '{"level": "DEBUG"}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.3.3. 通过添加映射的诊断上下文来更改 Debezium 日志记录级别 复制链接链接已复制到粘贴板!
大多数 Debezium 连接器(和 Kafka Connect worker)使用多个线程来执行不同的活动。这可能会导致难以查看日志文件,并只查找这些日志消息以了解特定的逻辑活动。要使日志消息更容易查找,Debezium 提供了几个 映射的诊断上下文 (MDC),为每个线程提供额外的信息。
Debezium 提供以下 MDC 属性:
dbz.connectorType
-
连接器类型的短别名。例如,
MySql
、Mongo
、Postgre 等等。与 同一类型的 连接器关联的所有线程都使用相同的值,因此您可以使用它来查找由给定类型的连接器生成的所有日志消息。
dbz.connectorName
-
连接器或数据库服务器的名称,如连接器配置中定义的。例如,
产品
、serverA
等。与特定 连接器实例 关联的所有线程都使用相同的值,以便您可以找到特定连接器实例生成的所有日志消息。 dbz.connectorContext
-
作为连接器任务中运行的独立线程运行的活动的短名称。例如,
主
、binlog
、快照
等等。在某些情况下,当连接器为特定资源(如表或集合)分配线程时,可以使用该资源的名称。与连接器关联的每个线程都使用不同的值,以便您可以找到与此特定活动关联的所有日志消息。
要为连接器启用 MDC,您可以在 log4j.properties
文件中配置附加程序。
流程
-
打开
log4j.properties
文件。 配置附加程序以使用任何受支持的 Debezium MDC 属性。
在以下示例中,
stdout
附加程序配置为使用这些 MDC 属性:log4j.properties
... log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p %X{dbz.connectorType}|%X{dbz.connectorName}|%X{dbz.connectorContext} %m [%c]%n ...
... log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p %X{dbz.connectorType}|%X{dbz.connectorName}|%X{dbz.connectorContext} %m [%c]%n ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上例中的配置会生成类似于以下输出中的日志消息:
... 2017-02-07 20:49:37,692 INFO MySQL|dbserver1|snapshot Starting snapshot for jdbc:mysql://mysql:3306/?useInformationSchema=true&nullCatalogMeansCurrent=false&useSSL=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull with user 'debezium' [io.debezium.connector.mysql.SnapshotReader] 2017-02-07 20:49:37,696 INFO MySQL|dbserver1|snapshot Snapshot is using user 'debezium' with these MySQL grants: [io.debezium.connector.mysql.SnapshotReader] 2017-02-07 20:49:37,697 INFO MySQL|dbserver1|snapshot GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium'@'%' [io.debezium.connector.mysql.SnapshotReader] ...
... 2017-02-07 20:49:37,692 INFO MySQL|dbserver1|snapshot Starting snapshot for jdbc:mysql://mysql:3306/?useInformationSchema=true&nullCatalogMeansCurrent=false&useSSL=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull with user 'debezium' [io.debezium.connector.mysql.SnapshotReader] 2017-02-07 20:49:37,696 INFO MySQL|dbserver1|snapshot Snapshot is using user 'debezium' with these MySQL grants: [io.debezium.connector.mysql.SnapshotReader] 2017-02-07 20:49:37,697 INFO MySQL|dbserver1|snapshot GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium'@'%' [io.debezium.connector.mysql.SnapshotReader] ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 日志中的每一行都包含连接器类型(如
MySQL
)、连接器的名称(如dbserver1),
以及线程的活动(如快照
)。
10.4. OpenShift 中的 Debezium 日志记录 复制链接链接已复制到粘贴板!
如果您在 OpenShift 上使用 Debezium,您可以使用 Kafka Connect 日志记录器来配置 Debezium 日志记录器和日志记录级别。有关在 Kafka Connect 模式中配置日志记录属性的更多信息,请参阅在 OpenShift 中使用 AMQ Streams。
第 11 章 为应用程序配置 Debezium 连接器 复制链接链接已复制到粘贴板!
当默认 Debezium 连接器行为不适用于应用程序时,您可以使用以下 Debezium 功能来配置您需要的行为。
- Kafka Connect 自动主题创建
- 启用连接在运行时创建主题,并根据名称将配置设置应用到这些主题。
- Avro 序列化
- 支持配置 Debezium PostgreSQL、MongoDB 或 SQL Server 连接器,以使用 Avro 序列化消息键和值,从而更轻松地更改事件记录用户以适应更改记录架构。
- CloudEvents converter
- 启用 Debezium 连接器来发出符合 CloudEvents 规格的更改事件记录。
- 将信号发送到 Debezium 连接器
- 提供修改连接器行为或触发操作的方法,如启动临时快照。
11.1. 自定义 Kafka Connect 自动主题创建 复制链接链接已复制到粘贴板!
Kafka 提供两个自动创建主题的机制。您可以为 Kafka 代理启用自动主题创建,并以 Kafka 2.6.0 开始,也可以启用 Kafka Connect 来创建主题。Kafka 代理使用 auto.create.topics.enable
属性来控制自动主题创建。在 Kafka Connect 中,topic.creation.enable
属性指定是否允许 Kafka Connect 创建主题。在这两种情况下,属性的默认设置都启用自动主题创建。
启用自动主题创建后,如果 Debezium 源连接器为没有目标主题的表发出更改事件记录,则该主题会在运行时创建,因为事件记录最接近到 Kafka 中。
代理和 Kafka Connect 自动主题创建之间的区别
代理创建的主题仅限于共享单个默认配置。代理无法将唯一配置应用到不同的主题或一组主题。相反,Kafka Connect 可以在创建主题时应用任何几个配置,设置复制因素、分区数量和其他特定于主题的设置,如 Debezium 连接器配置中指定的。连接器配置定义了一组主题创建组,并将一组主题配置属性与每个组相关联。
代理配置和 Kafka Connect 配置相互独立。无论您在代理中禁用主题创建,Kafka Connect 都可以创建主题。如果您在代理和 Kafka Connect 中启用自动主题创建,则连接配置具有优先权,代理仅在 Kafka Connect 配置中的任何设置时才创建主题。
如需更多信息,请参阅以下主题:
11.1.1. 为 Kafka 代理禁用自动主题创建 复制链接链接已复制到粘贴板!
默认情况下,如果主题尚不存在,Kafka 代理配置可让代理在运行时创建主题。代理创建的主题无法使用自定义属性配置。如果您使用早于 2.6.0 的 Kafka 版本,且您希望使用特定配置创建主题,则必须在代理中禁用自动创建主题,然后显式创建主题,或者通过自定义部署过程创建。
流程
-
在代理配置中,将
auto.create.topics.enable
的值设置为false
。
11.1.2. 在 Kafka Connect 中配置自动主题创建 复制链接链接已复制到粘贴板!
Kafka Connect 中的自动主题创建由 topic.creation.enable
属性控制。属性的默认值为 true
,启用自动主题创建,如下例所示:
topic.creation.enable = true
topic.creation.enable = true
topic.creation.enable
属性的设置应用到 Connect 集群中的所有 worker。
Kafka Connect 自动主题创建需要您定义 Kafka Connect 在创建主题时适用的配置属性。您可以通过定义主题组,然后在 Debezium 连接器配置中指定主题配置属性,然后指定要应用到每个组的属性。连接器配置定义了默认主题创建组,以及可选的一个或多个自定义主题创建组。自定义主题创建组使用主题名称模式列表来指定组设置应用到的主题。
有关 Kafka Connect 与主题创建组匹配的详细信息,请参阅 主题创建组。有关如何将配置属性分配给组的更多信息,请参阅 主题创建组配置属性。
默认情况下,Kafka Connect 创建的主题根据模式 server.schema.table
命名,如 dbserver.myschema.inventory
。
流程
-
要防止 Kafka Connect 自动创建主题,请在 Kafka Connect 自定义资源中将
topic.creation.enable
的值设置为false
,如下例所示:
Kafka Connect 自动主题创建需要至少为 default
主题创建组设置 replication.factor
和 partitions
属性。对组有效,可从 Kafka 代理的默认值中获取所需属性的值。
11.1.3. 配置自动创建的主题 复制链接链接已复制到粘贴板!
要使 Kafka Connect 自动创建主题,它需要源连接器中有关配置属性的信息,才能在创建主题时应用。您可以在每个 Debezium 连接器的配置中定义控制主题创建的属性。当 Kafka Connect 为连接器发出的事件记录创建主题,生成的主题会从适用的组获取其配置。该配置只适用于仅由该连接器发送的事件记录。
11.1.3.1. 主题创建组 复制链接链接已复制到粘贴板!
一组主题属性与主题创建组关联。最少,您必须定义 默认
主题创建组并指定其配置属性。此外,您还可以定义一个或多个自定义主题创建组,并为每个组指定唯一的属性。
当您创建自定义主题创建组时,您可以根据主题名称模式为每个组定义成员主题。您可以指定描述每个组中包含或排除的主题的命名模式。include
和 exclude
属性包含用来定义主题名称模式的正则表达式的逗号分隔列表。例如,如果您希望组包含以字符串 dbserver1.inventory
开头的所有主题,请将其 topic.creation.inventory.include
属性的值设置为 dbserver1\\.inventory\\
。
如果您同时为自定义主题组指定 include
和 exclude
属性,则排除规则具有优先权,并覆盖包含的规则。
11.1.3.2. 主题创建组配置属性 复制链接链接已复制到粘贴板!
默认
主题创建组,每个自定义组都与一组唯一的配置属性关联。您可以将组配置为包含任何 Kafka 主题级配置属性。例如,您可以为旧主题片段、保留时间、主题组指定 主题压缩类型 指定清理策略。您必须至少定义一组最小属性,以描述要创建的主题的配置。
如果没有注册自定义组,或者任何注册的组的 include
模式与要创建的任何主题的名称不匹配,则 Kafka Connect 使用默认
组的配置来创建主题。
有关配置主题的常规信息,请参阅在 OpenShift 上安装 Debezium 中的 Kafka 主题创建建议。
11.1.3.3. 指定 Debezium 默认主题创建组的配置 复制链接链接已复制到粘贴板!
在使用 Kafka Connect 自动主题创建前,您必须创建一个默认主题创建组并为它定义配置。默认主题创建组的配置应用于名称与自定义主题创建组的 include
列表模式匹配的任何主题。
先决条件
在 Kafka Connect 自定义资源中,
metadata.annotations
中的use-connector-resources
值指定集群 Operator 使用 KafkaConnector 自定义资源在集群中配置连接器。例如:... metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" ...
... metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
流程
要为
topic.creation.default
组定义属性,将它们添加到连接器自定义资源的spec.config
中,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以在默认组配置中包含任何 Kafka 主题级配置属性。
项 | 描述 |
---|---|
1 |
|
2 |
|
3 |
|
4 |
|
自定义组只回退到所需的 replication.factor
和 partitions
属性 的默认
组设置。如果自定义主题组的配置未定义其他属性,则不会应用 默认组中
指定的值。
11.1.3.4. 指定 Debezium 自定义主题创建组的配置 复制链接链接已复制到粘贴板!
您可以定义多个自定义主题组,每个主题组都有自己的配置。
流程
要定义自定义主题组,在连接器自定义资源中添加一个
topic.creation.<group_name>.include
property tospec.config
,后跟您要应用到自定义组中的主题的配置属性。以下示例显示了定义自定义主题创建组
清单和
applicationlogs
的自定义资源摘录:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
项 | 描述 |
---|---|
1 |
定义 |
2 |
|
3 |
定义 |
4 |
|
5 |
|
11.1.3.5. 注册 Debezium 自定义主题创建组 复制链接链接已复制到粘贴板!
在为任何自定义主题创建组指定配置后,请注册组。
流程
通过在连接器自定义资源中添加
topic.creation.groups
属性,并指定以逗号分隔的自定义主题创建组列表来注册自定义组。以下来自连接器自定义资源摘录会注册自定义主题创建组
清单
和应用程序日志
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
完成的配置
以下示例显示了一个已完成的配置,其中包含 默认
主题组的配置,以及 清单的
配置和应用程序logs
自定义主题创建组:
示例:配置默认主题创建和两个自定义组
11.2. 配置 Debezium 连接器以使用 Avro 序列化 复制链接链接已复制到粘贴板!
Debezium 连接器在 Kafka Connect 框架中工作,通过生成更改事件记录捕获数据库中的每个行级别更改。对于每个更改事件记录,Debezium 连接器完成以下操作:
- 应用配置的转换。
- 使用配置的 Kafka Connect 转换器 将记录键和值序列化为二进制形式。
- 将记录写入正确的 Kafka 主题。
您可以为每个独立 Debezium 连接器实例指定转换器。Kafka Connect 提供了一个 JSON 转换器,它将记录键和值序列化到 JSON 文档中。默认行为是 JSON 转换器包含记录的 message schema,使得每个记录都非常详细。Debezium 入门指南显示了当包含 有效负载和模式时记录是什么。如果要使用 JSON 序列化记录,请考虑将以下连接器配置属性设置为 false
:
-
key.converter.schemas.enable
-
value.converter.schemas.enable
将这些属性设置为 false
可排除每个记录的详细模式信息。
或者,您可以使用 Apache Avro 序列化记录键和值。Avro 二进制格式压缩效率更高。Avro 模式可以确保每个记录都有正确的结构。Avro 的架构演进机制使架构能够演进。这对 Debezium 连接器至关重要,它动态生成每个记录的模式,以匹配更改的数据库表的结构。随着时间的推移,更改写入同一 Kafka 主题的事件记录可能会有不同版本的相同模式。Avro 序列化使更改事件记录的使用者更容易地适应更改记录模式。
要使用 Apache Avro 序列化,您必须部署一个模式 registry,用于管理 Avro 消息模式及其版本。有关设置此 registry 的详情,请参考在 OpenShift 上安装和部署红帽构建的 Apicurio Registry 的文档。
11.2.1. 关于 Apicurio Registry 复制链接链接已复制到粘贴板!
Red Hat build of Apicurio Registry
Red Hat build of Apicurio Registry 提供了以下与 Avro 搭配使用的组件:
- 您可以在 Debezium 连接器配置中指定的 Avro converter。这个转换器将 Kafka Connect 模式映射到 Avro 模式。然后,转换器使用 Avro 模式将记录键和值序列化为 Avro 的紧凑二进制形式。
跟踪的 API 和模式 registry:
- Kafka 主题中使用的 Avro 模式。
- 其中 Avro converter 发送生成的 Avro 模式。
由于 Avro 模式存储在此 registry 中,因此每个记录只需要仅包含 tiny 模式标识符。这使得每个记录更小。对于 Kafka 等 I/O 绑定系统,这意味着生产者和消费者的总吞吐量。
- 用于 Kafka 生成者和消费者的 Avro Serdes (序列化器和反序列化器)。您编写用于消耗更改事件记录的 Kafka 消费者应用程序可以使用 Avro Serdes 来反序列化更改事件记录。
要将 Apicurio Registry 与 Debezium 搭配使用,请将 Apicurio Registry 转换器及其依赖项添加到您用于运行 Debezium 连接器的 Kafka Connect 容器镜像中。
Apicurio Registry 项目还提供 JSON 转换器。此转换器将不详细消息与人类可读的 JSON 的优点相结合。消息本身不包含架构信息,但只包含一个 schema ID。
要使用 Apicurio Registry 提供的转换器,您需要提供 apicurio.registry.url
。
11.2.2. 部署使用 Avro 序列化的 Debezium 连接器概述 复制链接链接已复制到粘贴板!
要部署使用 Avro 序列化的 Debezium 连接器,您必须完成三个主要任务:
- 按照在 OpenShift 上安装和部署红帽构建的 Apicurio Registry 实例中的说明,部署 Red Hat build of Apicurio Registry。
- 通过下载 Debezium Service Registry Kafka Connect zip 文件并将其提取到 Debezium 连接器的目录中来安装 Avro converter。
通过设置配置属性将 Debezium 连接器实例配置为使用 Avro serialization,如下所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在内部,Kafka Connect 始终使用 JSON 键/值转换器来存储配置和偏移。
11.2.3. 在 Debezium 容器中部署使用 Avro 的连接器 复制链接链接已复制到粘贴板!
在您的环境中,您可能想要使用提供的 Debezium 容器来部署使用 Avro 序列化的 Debezium 连接器。完成以下步骤,为 Debezium 构建自定义 Kafka Connect 容器镜像,并将 Debezium 连接器配置为使用 Avro converter。
先决条件
- 已安装 Docker 并有足够的权限来创建和管理容器。
- 您下载了您要使用 Avro 序列化部署的 Debezium 连接器插件。
流程
部署 Apicurio Registry 实例。请参阅 在 OpenShift 上安装和部署红帽构建的 Apicurio Registry,其提供了以下说明:
- 安装 Apicurio Registry
- 安装 AMQ Streams
- 设置 AMQ Streams 存储
提取 Debezium 连接器存档,以便为连接器插件创建目录结构。如果您下载并提取多个 Debezium 连接器的存档,生成的目录结构类似以下示例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 Avro converter 添加到包含您要配置为使用 Avro 序列化的 Debezium 连接器的目录中:
- 进入 Red Hat build of Debezium 下载站点,并下载 Apicurio Registry Kafka Connect zip 文件。
- 将存档提取到所需的 Debezium 连接器目录中。
要将多种 Debezium 连接器配置为使用 Avro 序列化,请将存档提取到每个相关连接器类型的目录中。虽然将存档提取到每个目录中会复制文件,您可以删除可能冲突的依赖项。
创建并发布自定义镜像,以运行配置为使用 Avro converter 的 Debezium 连接器:
使用
registry.redhat.io/amq7/amq-streams-kafka-32-rhel8:2.2.0-12
作为基础镜像来创建新的Dockerfile
。在以下示例中,将 my-plugins 替换为插件目录的名称:FROM registry.redhat.io/amq7/amq-streams-kafka-32-rhel8:2.2.0-12 USER root:root COPY ./my-plugins/ /opt/kafka/plugins/ USER 1001
FROM registry.redhat.io/amq7/amq-streams-kafka-32-rhel8:2.2.0-12 USER root:root COPY ./my-plugins/ /opt/kafka/plugins/ USER 1001
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Kafka Connect 开始运行连接器前,Kafka Connect 会加载
/opt/kafka/plugins
目录中的任何第三方插件。构建 docker 容器镜像。例如,如果您将您在上一步中创建的 docker 文件保存为
debezium-container-with-avro
,则可运行以下命令:docker build -t debezium-container-with-avro:latest
将自定义镜像推送到容器 registry,例如:
docker push <myregistry.io>/debezium-container-with-avro:latest
指向新容器镜像。执行以下操作之一:
编辑
KafkaConnect
自定义资源的KafkaConnect.spec.image
属性。如果设置,此属性会覆盖 Cluster Operator 中的STRIMZI_DEFAULT_KAFKA_CONNECT_IMAGE
变量。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
在
install/cluster-operator/050-Deployment-strimzi-cluster-operator.yaml
文件中,编辑STRIMZI_DEFAULT_KAFKA_CONNECT_IMAGE
变量以指向新容器镜像并重新安装 Cluster Operator。如果编辑此文件,则需要将其应用到 OpenShift 集群。
部署配置为使用 Avro converter 的每个 Debezium 连接器。对于每个 Debezium 连接器:
创建 Debezium 连接器实例。以下
inventory-connector.yaml
文件示例会创建一个KafkaConnector
自定义资源,用于定义配置为使用 Avro converter 的 MySQL 连接器实例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用连接器实例,例如:
oc apply -f inventory-connector.yaml
这会注册
inventory-connector
,连接器开始针对清单
数据库运行。
验证连接器是否已创建,并已开始跟踪指定数据库中的更改。您可以通过观察 Kafka Connect 日志输出来验证连接器实例,例如
inventory-connector
启动。显示 Kafka Connect 日志输出:
oc logs $(oc get pods -o name -l strimzi.io/name=my-connect-cluster-connect)
oc logs $(oc get pods -o name -l strimzi.io/name=my-connect-cluster-connect)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查日志输出,以验证是否已执行初始快照。您应该看到类似以下行的内容:
... 2020-02-21 17:57:30,801 INFO Starting snapshot for jdbc:mysql://mysql:3306/?useInformationSchema=true&nullCatalogMeansCurrent=false&useSSL=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL&connectTimeout=30000 with user 'debezium' with locking mode 'minimal' (io.debezium.connector.mysql.SnapshotReader) [debezium-mysqlconnector-dbserver1-snapshot] 2020-02-21 17:57:30,805 INFO Snapshot is using user 'debezium' with these MySQL grants: (io.debezium.connector.mysql.SnapshotReader) [debezium-mysqlconnector-dbserver1-snapshot] ...
... 2020-02-21 17:57:30,801 INFO Starting snapshot for jdbc:mysql://mysql:3306/?useInformationSchema=true&nullCatalogMeansCurrent=false&useSSL=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL&connectTimeout=30000 with user 'debezium' with locking mode 'minimal' (io.debezium.connector.mysql.SnapshotReader) [debezium-mysqlconnector-dbserver1-snapshot] 2020-02-21 17:57:30,805 INFO Snapshot is using user 'debezium' with these MySQL grants: (io.debezium.connector.mysql.SnapshotReader) [debezium-mysqlconnector-dbserver1-snapshot] ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建快照涉及几个步骤:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 完成快照后,Debebe 开始跟踪更改,例如,
清单
数据库的binlog
以更改事件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
11.2.4. 关于 Avro 名称要求 复制链接链接已复制到粘贴板!
如 Avro 文档所述,名称必须遵循以下规则:
-
以
[A-Za-z_]
开始 -
之后仅包含
[A-Za-z0-9_]
字符
Debezium 使用列的名称作为对应 Avro 字段的基础。如果列名称也不符合 Avro 命名规则,这可能会导致序列化过程中出现问题。每个 Debezium 连接器都提供一个配置属性 sanitize.field.names
,如果您有没有遵循名称的 Avro 规则的列,则可以将其设置为 true
。将 sanitize.field.names
设置为 true
允许序列化非格式字段,而无需实际修改您的模式。
11.3. 以 CloudEvents 格式发送 Debezium 更改事件记录 复制链接链接已复制到粘贴板!
CloudEvents 是以常见方式描述事件数据的规范。它的目标是在服务、平台和系统之间提供互操作性。Debezium 可让您配置 MongoDB、MySQL、PostgreSQL 或 SQL Server 连接器,以发出符合 CloudEvents 规格的更改事件记录。
以 CloudEvents 格式发出更改事件记录是一项技术预览功能。技术预览功能不被红帽产品服务级别协议(SLA)支持,且可能无法完成。因此,红帽不推荐在生产环境中实施任何技术预览功能。此技术预览功能为您提供对即将推出的产品创新的早期访问,允许您在开发过程中测试并提供反馈。如需有关支持范围的更多信息,请参阅 技术预览功能支持范围。
CloudEvents 规格定义:
- 一组标准化事件属性
- 定义自定义属性的规则
- 将事件格式映射到序列化表示的编码规则,如 JSON 或 Avro
- 用于传输层(如 Apache Kafka、HTTP 或 AMQP)的协议绑定
要配置 Debezium 连接器来发出符合 CloudEvents 规格的更改事件记录,Debezium 提供了 io.debezium.converters.CloudEventsConverter
,它是一个 Kafka Connect 消息转换器。
目前,只支持结构化映射模式。CloudEvents 更改事件 envelope 可以是 JSON 或 Avro,每个 envelope 类型支持 JSON 或 Avro 作为 数据格式
。预计未来的 Debezium 版本将支持二进制映射模式。
有关以 CloudEvents 格式发出更改事件的信息,如下所示:
有关使用 Avro 的详情,请参考:
11.3.1. CloudEvents 格式的 Debezium 更改事件记录示例 复制链接链接已复制到粘贴板!
以下示例显示了 PostgreSQL 连接器提供的 CloudEvents 更改事件记录是什么。在本例中,PostgreSQL 连接器被配置为使用 JSON 作为 CloudEvents 格式 envelope,以及 数据格式
。
- 1 1 1
- 连接器根据更改事件的内容为更改事件生成的唯一 ID。
- 2 2 2
- 事件源,它是连接器配置中
topic.prefix
属性指定的数据库的逻辑名称。 - 3 3 3
- CloudEvents 规格版本。
- 4 4 4
- 生成更改事件的连接器类型。此字段的格式是
io.debezium.CONNECTOR_TYPE.datachangeevent
。CONNECTOR_TYPE
的值为mongodb
、mysql
、postgresql
或sqlserver
。 - 5 5
- 源数据库中更改的时间。
- 6
- 描述
data
属性的内容类型,本例中为 JSON。唯一的替代方案是 Avro。 - 7
- 操作标识符。可能的值有
r
用于 read,c
用于 create、u
用于 update,或d
用于 delete。 - 8
- 从 Debezium 更改事件已知的所有
源
属性都通过使用属性名称的iodebezium
前缀映射到 CloudEvents 扩展属性。 - 9
- 在连接器中启用时,从 Debezium 更改事件已知的每个
事务
属性都映射到 CloudEvents 扩展属性,方法是将iodebeziumtx
前缀用于属性名称。 - 10
- 实际数据更改本身。根据操作和连接器,数据可能会在、
after
和/或patch
字段之前
包含。
以下示例还显示了 PostgreSQL 连接器提供的 CloudEvents 更改事件记录是什么。在本例中,PostgreSQL 连接器再次配置为使用 JSON 作为 CloudEvents 格式 envelope,但此时连接器被配置为使用 Avro 作为 数据格式
。
也可以将 Avro 用于 envelope 和 data
属性。
11.3.2. 配置 Debezium CloudEvents converter 的示例 复制链接链接已复制到粘贴板!
在 Debezium 连接器配置中配置 io.debezium.converters.CloudEventsConverter
。以下示例演示了如何配置 CloudEvents converter 来发送具有以下特征的更改事件记录:
- 使用 JSON 作为 envelope。
-
使用
http://my-registry/schemas/ids/1
中的 schema registry 将data
属性序列化为二进制 Avro 数据。
- 1
- 指定
serializer.type
是可选的,因为json
是默认值。
CloudEvents converter 转换 Kafka 记录值。在同一连接器配置中,如果您要对记录密钥操作,您可以指定 key.converter
。例如,您可以指定 StringConverter
、LongConverter
、JsonConverter
或 AvroConverter
。
11.3.3. Debezium CloudEvents converter 配置选项 复制链接链接已复制到粘贴板!
当您将 Debezium 连接器配置为使用 CloudEvent converter 时,您可以指定以下选项。
选项 | 默认 | 描述 |
|
用于 CloudEvents envelope 结构的编码类型。该值可以是 | |
|
用于 | |
N/A |
使用 JSON 时要传递给底层转换器的任何配置选项。 | |
N/A |
使用 Avro 时要传递给底层转换器的任何配置选项。删除了 | |
none |
指定如何调整架构名称,以便与连接器使用的消息转换器兼容。该值可以是 |
11.4. 将信号发送到 Debezium 连接器 复制链接链接已复制到粘贴板!
Debezium 信号机制提供了一种修改连接器行为或触发一次性操作的方法,如启动表 的临时快照。要触发连接器来执行指定操作,您需要发出 SQL 命令来向专用信号表添加信号消息,也称为信号数据收集。您在源数据库中创建的信号表专门用于与 Debezium 通信。当 Debezium 检测到新的 日志记录 或临时快照记录添加到 信号表中时,它会读取信号,并启动请求的操作。
信号可用于以下 Debezium 连接器:
- Db2
- MongoDB (技术预览)
- MySQL
- Oracle
- PostgreSQL
- SQL Server
11.4.1. 启用 Debezium 信号 复制链接链接已复制到粘贴板!
默认情况下禁用 Debezium 信号机制。您必须明确为要使用的每个连接器启用信号。
流程
- 在源数据库中,创建一个信号数据收集表,用于将信号发送到连接器。有关信号数据收集所需的结构的详情,请参考 信号数据收集的结构。
- 对于实现原生更改数据捕获(CDC)机制的源数据库,请为信号表启用 CDC。
将信号数据收集的名称添加到 Debezium 连接器配置中。
在连接器配置中,添加属性signal.data.collection
,并将其值设为在第 1 步中创建的信号数据收集的完全限定名称。
For example,signal.data.collection = inventory.debezium_signals
.
信号集合的完全限定名称格式取决于连接器。
以下示例显示了要用于每个连接器的命名格式:- Db2
-
<schemaName>.<tableName>
- MongoDB
-
<databaseName>.<collectionName>
- MySQL
-
<databaseName>.<tableName>
- Oracle
-
<databaseName>.<schemaName>.<tableName>
- PostgreSQL
-
<schemaName>.<tableName>
- SQL Server
-
<databaseName > . <schemaName> . <tableName
>
以了解有关设置signal.data.collection
属性的更多信息,请参阅连接器的配置属性表。
11.4.1.1. Debezium 信号数据收集所需的结构 复制链接链接已复制到粘贴板!
信号数据收集或信号表存储您发送到连接器的信号来触发指定操作。信号表的结构必须符合以下标准格式:
- 包含三个字段(列)。
- 字段按特定顺序排列,如 表 1 所示。
字段 | 类型 | 描述 |
---|---|---|
|
|
标识信号实例的任意唯一字符串。 |
|
|
指定要发送的信号类型。 |
|
|
指定要传递给信号操作的 JSON 格式参数。 |
数据收集中的字段名称是任意的。上表提供了推荐的名称。如果您使用不同的命名约定,请确保每个字段中的值与预期内容一致。
11.4.1.2. 创建 Debezium 信号数据收集 复制链接链接已复制到粘贴板!
您可以通过将标准 SQL DDL 查询提交到源数据库来创建信号表。
先决条件
- 您有足够的访问权限在目标数据库上创建表。
流程
-
向源数据库提交 SQL 查询,以创建 与所需结构 一致的表,如下例所示:
CREATE TABLE < tableName> (id VARCHAR (<varcharValue>) PRIMARY KEY, type VARCHAR (<varcharValue>) NOT NULL, data VARCHAR (<varcharValue>) NULL);
您分配给 id
变量的 VARCHAR
参数的空间量必须足够,以适应发送到信号表的信号的 ID 字符串的大小。
如果 ID 的大小超过可用空间,则连接器无法处理信号。
以下示例显示了一个 CREATE TABLE
命令,它创建一个三列 debezium_signal
表:
CREATE TABLE debezium_signal (id VARCHAR(42) PRIMARY KEY, type VARCHAR(32) NOT NULL, data VARCHAR(2048) NULL);
CREATE TABLE debezium_signal (id VARCHAR(42) PRIMARY KEY, type VARCHAR(32) NOT NULL, data VARCHAR(2048) NULL);
11.4.2. Debezium 信号操作的类型 复制链接链接已复制到粘贴板!
您可以使用信号启动以下操作:
有些信号与所有连接器不兼容。
11.4.2.1. 日志记录信号 复制链接链接已复制到粘贴板!
您可以通过创建一个具有 日志
信号类型的信号表条目,来请求连接器在日志中添加条目。处理信号后,连接器会将指定的消息输出到日志中。(可选)您可以配置信号,以便生成的消息包含流协调。
列 | 值 | 描述 |
---|---|---|
id |
| |
type |
| 信号的操作类型。 |
data |
|
|
11.4.2.2. 临时快照信号 复制链接链接已复制到粘贴板!
您可以通过创建一个带有 execute-snapshot
信号类型的信号表条目来请求连接器启动临时快照。处理信号后,连接器将运行请求的快照操作。
与连接器首次启动后运行的初始快照不同,在连接器已开始流更改事件后,会在运行时运行临时快照。您可以随时启动临时快照。
临时快照可用于以下 Debezium 连接器:
- Db2
- MySQL
- Oracle
- PostgreSQL
- SQL Server
列 | 值 |
---|---|
id |
|
type |
|
data |
|
目前,exec -snapshot
操作只触发 增量快照。
有关临时快照的更多信息,请参阅您的连接器文档中的 快照 主题。
临时快照停止信号
您可以通过创建带有 stop-snapshot
信号类型的信号表条目,请求连接器来停止 in-progress 临时快照。处理信号后,连接器将停止当前的 in-progress 快照操作。
您可以停止以下 Debezium 连接器的临时快照:
- Db2
- MySQL
- Oracle
- PostgreSQL
- SQL Server
列 | 值 |
---|---|
id |
|
type |
|
data |
|
您必须指定信号 的类型
。data-collections
字段是可选的。将 data-collections
字段留空,以请求连接器停止当前快照中的所有活动。如果您希望增量快照继续,但您要从快照中排除特定集合,请提供以逗号分隔的集合或正则表达式列表。连接器处理信号后,增量快照将继续,但它会把数据从您指定的集合中排除。
11.4.2.3. 增量快照 复制链接链接已复制到粘贴板!
增量快照是特定类型的临时快照。在增量快照中,连接器捕获您指定的表的基准状态,类似于初始快照。但是,与初始快照不同,增量快照会以块的形式捕获表,而不是一次捕获所有快照。连接器使用水位线方法来跟踪快照的进度。
通过在块而不是单个单一操作中捕获指定表的初始状态,增量快照比初始快照过程提供以下优点:
- 虽然连接器捕获指定表的基准状态,但事务日志中最近实时事件的流传输将继续中断。
- 如果增量快照进程中断,可以从其停止的点中恢复。
- 您可以随时启动增量快照。
增量快照暂停信号
您可以通过创建一个具有 pause-snapshot
信号类型的信号表条目,请求连接器暂停 in-progress 增量快照。处理信号后,连接器将停止暂停当前的 in-progress 快照操作。因此,无法指定数据收集,因为快照处理将在信号处理时暂停的位置。
您可以为以下 Debezium 连接器暂停增量快照:
- Db2
- MySQL
- Oracle
- PostgreSQL
- SQL Server
列 | 值 |
---|---|
id |
|
type |
|
您必须指定信号 的类型
。data
字段将被忽略。
增量快照恢复信号
您可以通过创建一个具有 resume-snapshot
信号类型的信号表条目来请求连接器恢复暂停的增量快照。处理信号后,连接器将恢复之前暂停的快照操作。
您可以为以下 Debezium 连接器恢复增量快照:
- Db2
- MySQL
- Oracle
- PostgreSQL
- SQL Server
列 | 值 |
---|---|
id |
|
type |
|
您必须指定信号 的类型
。data
字段将被忽略。
有关增量快照的更多信息,请参阅您的连接器文档中的 快照 主题。
第 12 章 应用转换以修改使用 Apache Kafka 交换的消息 复制链接链接已复制到粘贴板!
Debezium 提供了几个单一消息转换(SMT),您可以使用它来修改更改事件记录。您可以配置连接器以应用转换,在将记录发送到 Apache Kafka 前修改记录。您还可以将 Debezium SMTs 应用到接收器连接器,以在连接器从 Kafka 主题读取前修改记录。
如果只想将转换应用到特定消息,您可以配置 Kafka Connect predicate 来定义应用 SMT 的条件。
Debezium 提供以下 SMT:
- 主题路由器 SMT
- 根据应用于原始主题名称的正则表达式,将事件记录重新路由到特定的主题。
- 基于内容的路由器 SMT
- 根据事件内容重新路由指定的更改事件记录。
- 消息过滤 SMT
- 允许您将事件记录的子集传播到目标 Kafka 主题。根据事件记录的内容,转换会对连接器发出的更改事件记录应用正则表达式。只有与表达式匹配的记录才会写入目标主题。其他记录将被忽略。
- 新的记录状态提取 SMT
- 以简化的格式创建 Debezium 更改事件记录的复杂结构。简化的结构启用由无法使用原始结构的接收器连接器处理。
- MongoDB 新记录状态提取
- 简化了 Debezium MongoDB 连接器更改事件记录的复杂结构。简化的结构启用由无法使用原始事件结构的接收器连接器处理。
- outbox 事件路由器 SMT
- 提供对开箱即用模式的支持,以启用多个服务间的安全可靠的数据交换。
- MongoDB outbox 事件路由器 SMT
- 支持将 outbox 模式与 MongoDB 连接器搭配使用,以启用多个服务间的安全可靠的数据交换。
12.1. 使用 SMT predicates 有选择地应用转换 复制链接链接已复制到粘贴板!
当您为连接器配置单个消息转换(SMT)时,您可以为转换定义 predicate。predicate 指定如何将转换条件应用到连接器进程的消息子集。您可以为源连接器(如 Debezium)或 sink 连接器分配 predicates 以转换。
12.1.1. 关于 SMT predicates 复制链接链接已复制到粘贴板!
Debezium 提供多个单消息转换(SMT),可用于在 Kafka Connect 将记录保存到 Kafka 主题前修改事件记录。默认情况下,当您为 Debezium 连接器配置其中一个 SMT 时,Kafka Connect 会将这个转换应用到连接器发出的每个记录。但是,您可能有一些要有选择地应用转换的实例,以便它只修改共享通用特征的事件消息子集。
例如,对于 Debezium 连接器,您可能希望仅在来自特定表的事件消息或包含特定标头键的事件消息上运行转换。在运行 Apache Kafka 2.6 或更高版本的环境中,您可以在转换中附加 predicate 语句,以指示 Kafka Connect 只对某些记录应用 SMT。在 predicate 中,您可以指定 Kafka Connect 用来评估它处理的每个消息的条件。当 Debezium 连接器发出更改事件消息时,Kafka Connect 会根据配置的 predicate 条件检查消息。如果事件消息的条件为 true,Kafka Connect 会应用转换,然后将消息写入 Kafka 主题。与条件不匹配的消息会原封发送到 Kafka。
这种情况与您为接收器连接器 SMT 定义的 predicates 类似。连接器从 Kafka 主题读取信息,Kafka Connect 根据 predicate 条件评估信息。如果消息与条件匹配,Kafka Connect 会应用转换,然后将信息传递给接收器连接器。
定义了 predicate 后,您可以重复使用它并将其应用到多个转换。predicates 还包含一个 negate
选项,可用于反转 predicate,以便 predicate 条件仅应用到与 predicate 语句中定义的条件 不匹配的 记录。您可以使用 negate
选项将 predicate 与基于负条件的其他转换配对。
predicate 元素
predicates 包括以下元素:
-
predicates
前缀 -
别名(例如,
isOutboxTable
) -
类型(例如
org.apache.kafka.connect.transforms.predicates.TopicNameMatches
)。Kafka Connect 提供了一组默认的 predicate 类型,您可以通过定义自己的自定义 predicates 来补充。 - 根据 predicate 的类型(例如,正则表达式命名模式)
默认 predicate 类型
以下 predicate 类型默认可用:
- HasHeaderKey
- 在您希望 Kafka Connect 评估的事件消息中指定标头中的键名称。对于包含具有指定名称的标头键的任何记录,predicate 会评估为 true。
- RecordIsTombstone
匹配 Kafka tombstone 记录。对于具有
null
值的任何记录,predicate 会评估为true
。将此 predicate 与过滤器 SMT 结合使用,以删除 tombstone 记录。此 predicate 没有配置参数。Kafka 中的 tombstone 是一个记录,其中包含一个具有 0 字节、
null
有效负载的键。当 Debezium 连接器处理源数据库中的 delete 操作时,连接器会为删除操作发送两个更改事件:-
删除操作(
"op" : "d"
)事件,它提供数据库记录的先前值。 具有相同键但为
null
值的 tombstone 事件。tombstone 代表行的删除标记。当为 Kafka 启用 日志 压缩时,在压缩 Kafka 过程中会删除共享与 tombstone 相同的键的所有事件。日志压缩会定期进行,压缩间隔由主题的
delete.retention.ms
设置控制。虽然可以 配置 Debezium,使其不会发出 tombstone 事件,但最好允许 Debezium 在日志压缩过程中发出 tombstones 来保持预期的行为。禁止 tombstones 会阻止 Kafka 在日志压缩过程中删除删除密钥的记录。如果您的环境包含无法处理 tombstones 的接收器连接器,您可以将接收器连接器配置为使用带有
RecordIsTombstone
predicate 的 SMT 来过滤 tombstone 记录。
-
删除操作(
- TopicNameMatches
- 指定 Kafka Connect 匹配的主题名称的正则表达式。对于与指定的正则表达式匹配的连接器记录,predicate 为 true。使用此 predicate 根据源表的名称将 SMT 应用到记录。
12.1.2. 定义 SMT predicates 复制链接链接已复制到粘贴板!
默认情况下,Kafka Connect 将 Debezium 连接器配置中的每个单个消息转换应用到它从 Debezium 接收的每个更改事件记录。从 Apache Kafka 2.6 开始,您可以在控制 Kafka Connect 如何应用转换的连接器配置中为转换定义 SMT predicate。predicate 语句定义了 Kafka Connect 将转换应用到 Debezium 发送的事件记录的条件。Kafka Connect 评估 predicate 声明,然后有选择地将 SMT 应用到与 predicate 中定义的条件匹配的记录子集。配置 Kafka Connect predicates 与配置转换类似。您可以指定 predicate 别名,将别名与转换相关联,然后定义 predicate 的类型和配置。
先决条件
- Debezium 环境运行 Apache Kafka 2.6 或更高版本。
- 为 Debezium 连接器配置 SMT。
流程
-
在 Debezium 连接器配置中,为
predicates
参数指定 predicate 别名,例如IsOutboxTable
。 通过将 predicate 别名附加到连接器配置中的转换别名,将 predicate 别名与您要有条件应用的转换别名相关联:
transforms.<TRANSFORM_ALIAS>.predicate=<PREDICATE_ALIAS>
transforms.<TRANSFORM_ALIAS>.predicate=<PREDICATE_ALIAS>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如:
transforms.outbox.predicate=IsOutboxTable
transforms.outbox.predicate=IsOutboxTable
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过指定其 type 并为配置参数提供值来配置 predicate。
对于类型,请指定 Kafka Connect 中的以下默认类型之一:
- HasHeaderKey
- RecordIsTombstone
TopicNameMatches
例如:
predicates.IsOutboxTable.type=org.apache.kafka.connect.transforms.predicates.TopicNameMatches
predicates.IsOutboxTable.type=org.apache.kafka.connect.transforms.predicates.TopicNameMatches
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
对于 TopicNameMatch 或
HasHeaderKey
predicates,为您要匹配的主题或标头名称指定一个正则表达式。例如:
predicates.IsOutboxTable.pattern=outbox.event.*
predicates.IsOutboxTable.pattern=outbox.event.*
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
如果要对条件进行必要,请将
negate
关键字附加到转换别名,并将它设置为true
。例如:
transforms.outbox.negate=true
transforms.outbox.negate=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以上属性反转 predicate 匹配的一组记录,因此 Kafka Connect 会将转换应用到与 predicate 中指定的条件不匹配的任何记录。
示例:用于 outbox 事件路由器转换的 TopicNameMatch predicate
以下示例显示了 Debezium 连接器配置,它将 outbox 事件路由器转换应用到 Debezium 发送到 Kafka outbox.event.order
主题的消息。
由于 TopicNameMatch
predicate 仅针对来自 outbox 表中的消息评估为 true,所以转换不会应用到源自数据库中其他表的消息。
12.1.3. 忽略 tombstone 事件 复制链接链接已复制到粘贴板!
您可以控制 Debezium 是否发出 tombstone 事件,以及 Kafka 保留的时长。根据您的数据管道,您可能想要为连接器设置 tombstones.on.delete
属性,以便 Debezium 不会发出 tombstone 事件。
是否启用 Debezium 发送 tombstones,具体取决于如何在您的环境中消耗主题以及接收器消费者的特性。有些接收器连接器依赖于 tombstone 事件从下游数据存储中删除记录。如果接收器连接器依赖 tombstone 记录来指示何时删除下游数据存储中的记录,请配置 Debezium 来发出它们。
当您将 Debezium 配置为生成 tombstones 时,需要进一步的配置以确保接收器连接器接收 tombstone 事件。必须设置主题的保留策略,以便连接器在 Kafka 在日志压缩过程中删除事件消息的时间。在压缩前保留 tombstones 的时长,由主题的 delete.retention.ms
属性控制。
默认情况下,连接器的 tombstones.on.delete
属性设置为 true
,以便连接器在每次删除事件后生成一个 tombstone。如果将属性设置为 false
以防止 Debezium 将 tombstone 记录保存到 Kafka 主题,则没有 tombstone 记录可能会导致意外的结果。Kafka 在日志压缩过程中依赖于 tombstone 来删除与已删除密钥相关的记录。
如果您需要支持无法处理 null 值记录的接收器连接器或下游 Kafka 用户,而不是防止 Debezium 发送 tombstones,请考虑使用 RecordIsTombstone
predicate 类型为连接器配置 SMT,以便在用户读取前删除 tombstone 信息。
流程
要防止 Debezium 为删除的数据库记录发出 tombstone 事件,请将连接器的
tombstones.on.delete
选项设置为false
。例如:
“tombstones.on.delete”: “false”
“tombstones.on.delete”: “false”
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
12.2. 将 Debezium 事件记录路由到您指定的主题 复制链接链接已复制到粘贴板!
每个包含数据更改事件的 Kafka 记录都有一个默认的目的地主题。如果需要,您可以将记录重新路由到您在记录到达 Kafka Connect 转换器前指定的主题。为此,Debebe 提供主题路由单一消息转换(SMT)。在 Debezium 连接器的 Kafka Connect 配置中配置这个转换。配置选项允许您指定以下内容:
- 用于标识要重新路由的记录的表达式
- 解析到目的地主题的表达式
- 如何确保将记录中的唯一键重新路由到目标主题
您确定转换配置提供了您想要的行为。Debezium 不会验证来自您转换配置的结果的行为。
主题路由转换是一个 Kafka Connect SMT。
以下主题提供详情:
12.2.1. 将 Debezium 记录路由到您指定的主题的用例 复制链接链接已复制到粘贴板!
默认行为是 Debezium 连接器将每个更改事件记录发送到名称从数据库名称以及进行更改的表名称的主题。换句话说,主题接收一个物理表的记录。当您想接收多个物理表的记录时,您必须配置 Debezium 连接器,以将记录重新路由到该主题。
逻辑表
逻辑表是将多个物理表的记录路由到一个主题的常见用例。在逻辑表中,有多个物理表,它们都有相同的模式。例如,分片表具有相同的模式。逻辑表可由两个或多个分片表组成: db_shard1.my_table
和 db_shard2.my_table
。表位于不同的分片中,物理不同,但它们组成一个逻辑表。您可以将任何分片中的表重新路由更改事件记录到同一主题。
分区的 PostgreSQL 表
当 Debezium PostgreSQL 连接器捕获分区表中的更改时,默认行为是更改事件记录将路由到每个分区的不同主题。要将记录从所有分区发送到一个主题,请配置主题路由 SMT。因为分区表中的每个键都保证是唯一的,因此请配置 key.enforce.uniqueness=false
,以便 SMT 不添加 key 字段来确保唯一密钥。添加 key 字段是默认行为。
12.2.2. 将多个表的 Debezium 记录路由到一个主题的示例 复制链接链接已复制到粘贴板!
要将多个物理表的更改事件记录路由到同一主题,请在 Debezium 连接器的 Kafka Connect 配置中配置主题路由转换。配置主题路由 SMT 要求您指定决定的正则表达式:
- 用于路由记录的表。这些表必须具有相同的模式。
- 目标主题名称。
以下示例中的连接器配置为主题路由 SMT 设置几个选项:
transforms=Reroute transforms.Reroute.type=io.debezium.transforms.ByLogicalTableRouter transforms.Reroute.topic.regex=(.*)customers_shard(.*) transforms.Reroute.topic.replacement=$1customers_all_shards
transforms=Reroute
transforms.Reroute.type=io.debezium.transforms.ByLogicalTableRouter
transforms.Reroute.topic.regex=(.*)customers_shard(.*)
transforms.Reroute.topic.replacement=$1customers_all_shards
topic.regex
指定转换适用于每个更改事件记录的正则表达式,以确定是否应将其路由到特定的主题。
在示例中,正则表达式
(.*)customers_shard(.*)
与名称包含customers_shard
字符串的表的记录匹配。这会重新路由具有以下名称的表的记录:myserver.mydb.customers_shard1
myserver.mydb.customers_shard2
myserver.mydb.customers_shard3
topic.replacement
-
指定代表目标主题名称的正则表达式。转换将每个匹配记录路由到此表达式标识的主题。在本例中,上面列出的三个分片表的记录将路由到
myserver.mydb.customers_all_shards
主题。 schema.name.adjustment.mode
-
指定消息密钥架构名称如何从生成的主题名称进行调整,以便与连接器使用的消息转换器兼容。该值可以是
none
(默认)或avro
。
自定义配置
要自定义配置,您可以定义 SMT predicate 语句,用于指定您要转换进程的表,或者不处理。如果您将 SMT 配置为与正则表达式匹配的路由表,且您不希望 SMT 重新路由与表达式匹配的特定表,则 predicate 可能很有用。
12.2.3. 确保 Debezium 记录中的唯一键路由到同一主题 复制链接链接已复制到粘贴板!
Debezium 更改事件键使用表列组成表的主键。要将多个物理表的记录路由到一个主题,事件键必须在所有这些表中都是唯一的。但是,每个物理表可能有一个只在该表中独有的主密钥。例如,myserver.mydb.customers_shard1
表中的行可能与 myserver.mydb.customers_shard2
表中的行相同。
为确保每个事件键在更改事件记录进入同一主题的表中都是唯一的,主题路由转换会将字段插入到更改事件键中。默认情况下,插入的字段的名称是 __dbz__physicalTableIdentifier
。insert 字段的值是默认的目的地主题名称。
如果要,您可以配置主题路由转换,将不同的字段插入到密钥中。为此,请指定 key.field.name
选项,并将其设置为使用现有主密钥字段名称冲突的字段名称。例如:
transforms=Reroute transforms.Reroute.type=io.debezium.transforms.ByLogicalTableRouter transforms.Reroute.topic.regex=(.*)customers_shard(.*) transforms.Reroute.topic.replacement=$1customers_all_shards transforms.Reroute.key.field.name=shard_id
transforms=Reroute
transforms.Reroute.type=io.debezium.transforms.ByLogicalTableRouter
transforms.Reroute.topic.regex=(.*)customers_shard(.*)
transforms.Reroute.topic.replacement=$1customers_all_shards
transforms.Reroute.key.field.name=shard_id
本例将 shard_id
字段添加到路由记录中的键结构中。
如果要调整键的新字段的值,请配置这两个选项:
key.field.regex
- 指定转换应用到默认目标主题名称的正则表达式,以捕获一个或多个字符组。
key.field.replacement
- 指定在捕获的组方面确定插入的 key 字段的值的正则表达式。
例如:
transforms.Reroute.key.field.regex=(.*)customers_shard(.*) transforms.Reroute.key.field.replacement=$2
transforms.Reroute.key.field.regex=(.*)customers_shard(.*)
transforms.Reroute.key.field.replacement=$2
使用这个配置,假设默认目标主题名称为:
myserver.mydb.customers_shard1
myserver.mydb.customers_shard2
myserver.mydb.customers_shard3
转换使用第二个捕获的组中的值(分片号)作为键的新字段的值。在本例中,插入的 key 字段的值将是 1
、2
或 3
。
如果您的表包含全局唯一密钥,且不需要更改密钥结构,您可以将 key.enforce.uniqueness
选项设置为 false
:
... transforms.Reroute.key.enforce.uniqueness=false ...
...
transforms.Reroute.key.enforce.uniqueness=false
...
12.2.4. 用于有选择地应用主题路由转换的选项 复制链接链接已复制到粘贴板!
除了 Debezium 连接器在发生数据库更改时发出的更改事件消息外,连接器还会发出其他类型的消息,包括心跳消息以及有关架构更改和事务的元数据消息。由于这些消息的结构与 SMT 旨在处理的更改事件消息的结构不同,因此最好将连接器配置为有选择地应用 SMT,以便它只处理预期的数据更改消息。
您可以使用以下方法之一将连接器配置为有选择地应用 SMT:
- 为转换配置 SMT predicate。
- 对 SMT 使用 topic.regex 配置选项。
12.2.5. 用于配置 Debezium 主题路由转换的选项 复制链接链接已复制到粘贴板!
下表描述了主题路由 SMT 配置选项。
选项 | 默认 | 描述 |
---|---|---|
指定转换适用于每个更改事件记录的正则表达式,以确定是否应将其路由到特定的主题。 | ||
指定代表目标主题名称的正则表达式。转换将每个匹配记录路由到此表达式标识的主题。此表达式可以引用您为 | ||
|
指明是否向记录的更改事件键添加字段。添加 key 字段可确保每个事件键在更改事件记录进入同一主题的表中是唯一的。这有助于防止对具有相同键但源自不同源表的记录更改事件冲突。 | |
|
要添加到更改事件键的字段名称。此字段的值标识原始表名称。要使 SMT 添加此字段, | |
指定转换应用到默认目标主题名称的正则表达式,以捕获一个或多个字符组。要使 SMT 应用此表达式, | ||
指定在为 | ||
none |
指定消息密钥架构名称应该如何调整,以便与连接器使用的消息转换器兼容,包括: | |
| 用于在 LRUCache 中保存最大条目的大小。缓存将保留用于逻辑表键和值的旧/新模式,还缓存派生的 key 和 topic regex 结果,以改进源记录转换。 |
12.3. 根据事件内容将更改事件记录路由到主题 复制链接链接已复制到粘贴板!
默认情况下,Debebe 将从表读取的所有更改事件流传输到单个静态主题。然而,在有些情况下,您可能希望根据事件内容将所选事件重新路由到其他主题。基于内容的路由消息的过程在 基于内容的路由 消息模式中进行了描述。要在 Debezium 中应用此模式,您可以使用基于内容的路由 单个消息转换 (SMT)来编写为每个事件评估的表达式。根据评估事件的方式,SMT 会将事件消息路由到原始目标主题,或者将其重新路由到您在表达式中指定的主题。
Debezium 基于内容的路由 SMT 是一个技术预览功能。技术预览功能不被红帽产品服务级别协议(SLA)支持,且可能无法完成。因此,红帽不推荐在生产环境中实施任何技术预览功能。此技术预览功能为您提供对即将推出的产品创新的早期访问,允许您在开发过程中测试并提供反馈。如需有关支持范围的更多信息,请参阅 技术预览功能支持范围。
虽然可以使用 Java 创建自定义 SMT 来编码路由逻辑,但使用自定义编码的 SMT 具有其缺陷。例如:
- 需要预先编译转换并将其部署到 Kafka Connect。
- 每个更改都需要代码重新编译和重新部署,从而造成不灵活的操作。
基于内容的路由 SMT 支持与 JSR 223 集成的脚本语言(用于 Java™ 平台)。
Debezium 不附带 JSR 223 API 的任何实现。要将表达式语言与 Debezium 搭配使用,您必须为语言下载 JSR 223 脚本引擎实施。根据您用于部署 Debezium 的方法,您可以自动从 Maven Central 下载所需的工件,也可以手动下载工件,然后将它们添加到 Debezium 连接器插件目录中,以及语言实施所使用的任何其他 JAR 文件中。
12.3.1. 设置 Debezium 基于 content-routing SMT 复制链接链接已复制到粘贴板!
为安全起见,Debezium 连接器存档不包含基于内容的路由 SMT。相反,它会在单独的工件中提供 debezium-scripting-2.1.4.Final.tar.gz
。
如果通过从 Dockerfile 构建自定义 Kafka Connect 容器镜像来部署 Debezium 连接器,要使用过滤器 SMT,您必须将 SMT 工件明确添加到 Kafka Connect 环境中。当使用 AMQ Streams 部署连接器时,它可以根据您在 Kafka Connect 自定义资源中指定的配置参数自动下载所需的工件。重要信息:在 Kafka Connect 实例中存在路由 SMT 后,允许向实例添加连接器的任何用户都可以运行脚本表达式。要确保脚本表达式只能由授权用户运行,请务必在添加路由 SMT 前保护 Kafka Connect 实例及其配置接口。
如果您从 Dockerfile 构建 Kafka Connect 容器镜像,则适用以下步骤。如果使用 AMQ Streams 创建 Kafka Connect 镜像,请按照连接器部署主题中的说明操作。
流程
-
从浏览器中,打开 Debezium 下载站点的红帽构建,并下载 Debezium 脚本 SMT 存档(
debezium-scripting-2.1.4.Final.tar.gz
)。 - 将存档的内容提取到 Kafka Connect 环境的 Debezium 插件目录中。
- 获取 JSR-223 脚本引擎实现,并将其内容添加到 Kafka Connect 环境的 Debezium 插件目录中。
- 重启 Kafka Connect 进程以获取新的 JAR 文件。
Groovy 语言在 classpath 上需要以下库:
-
groovy
-
groovy-json
(可选) -
groovy-jsr223
JavaScript 语言在 classpath 上需要以下库:
-
graalvm.js
-
graalvm.js.scriptengine
12.3.2. 示例: Debezium 基本基于内容的路由配置 复制链接链接已复制到粘贴板!
要将 Debezium 连接器配置为根据事件内容路由更改事件记录,您可以在连接器的 Kafka Connect 配置中配置 ContentBasedRouter
SMT。
配置基于内容的路由 SMT 要求您指定一个定义过滤条件的正则表达式。在配置中,您可以创建一个定义路由条件的正则表达式。表达式定义了用于评估事件记录的模式。它还指定目的地主题的名称,其中路由与模式匹配的事件。您指定的模式可能会指定一个事件类型,如表插入、更新或删除操作。您还可以定义一个与特定列或行中值匹配的模式。
例如,要将所有更新(u
)记录重新路由到 updates
主题,您可以在连接器配置中添加以下配置:
前面的例子指定了使用 Groovy
表达式语言。
与模式不匹配的记录将路由到默认主题。
自定义配置
前面的示例演示了一个简单的 SMT 配置,它旨在只处理 DML 事件,其中包含 op
字段。连接器可能会发出的其他类型的消息(心跳消息、tombstone 消息或有关事务或模式更改的元数据消息)不包含此字段。为了避免处理失败,您可以定义一个 SMT predicate 语句,该语句只会将转换应用到 特定事件。
12.3.3. 在 Debezium 内容的路由表达式中使用的变量 复制链接链接已复制到粘贴板!
Debezium 将某些变量绑定到 SMT 的评估上下文中。当您创建表达式来指定控制路由目的地的条件时,SMT 可以查找并解释这些变量的值,以评估表达式中的条件。
下表列出了 Debezium 绑定到基于内容路由 SMT 的评估上下文的变量:
名称 | 描述 | 类型 |
---|---|---|
| 消息的一个键。 |
|
| 消息的值。 |
|
| message 键的 schema。 |
|
| 消息值的 schema。 |
|
| 目标主题的名称。 | 字符串 |
|
消息标头的 Java 映射。key 字段是标头名称。
|
|
表达式可以在其变量上调用任意方法。表达式应解析为布尔值,用来决定 SMT 如何处理消息。当表达式中的路由条件评估为 true
时,会保留消息。当路由条件评估为 false
时,会删除消息。
表达式不应产生任何副作用。也就是说,不应修改他们通过的任何变量。
12.3.4. 用于有选择地应用基于内容的路由转换的选项 复制链接链接已复制到粘贴板!
除了 Debezium 连接器在发生数据库更改时发出的更改事件消息外,连接器还会发出其他类型的消息,包括心跳消息以及有关架构更改和事务的元数据消息。由于这些消息的结构与 SMT 旨在处理的更改事件消息的结构不同,因此最好将连接器配置为有选择地应用 SMT,以便它只处理预期的数据更改消息。您可以使用以下方法之一将连接器配置为有选择地应用 SMT:
- 为转换配置 SMT predicate。
- 对 SMT 使用 topic.regex 配置选项。
12.3.5. 为其他脚本语言配置基于内容的路由条件 复制链接链接已复制到粘贴板!
您表达基于内容的路由条件的方式取决于您使用的脚本语言。例如,如 基本配置示例所示,当您使用 Groovy
作为表达式语言时,以下表达式会将所有更新(u
)记录重新路由到 更新
主题,而将其他记录路由到默认主题:
value.op == 'u' ? 'updates' : null
value.op == 'u' ? 'updates' : null
其他语言使用不同的方法表达相同的条件。
Debezium MongoDB 连接器将 after
和 patch
字段作为序列化 JSON 文档而不是作为结构发出。
要将 ContentBasedRouting SMT 与 MongoDB 连接器搭配使用,您必须首先将 JSON 中的数组字段取消回单独的文档。
您可以使用表达式中的 JSON 解析器为每个数组项目生成单独的输出文档。例如,如果您使用 Groovy 作为表达式语言,请将 groovy-json
工件添加到 classpath 中,然后添加一个表达式,如 (new groovy.json.JsonSlurper ()).parseText (value.after).last_name == 'Kretchmar'
。
JavaScript
当使用 JavaScript 作为表达式语言时,您可以调用 StructVirtualMachineget ()
方法来指定基于内容的路由条件,如下例所示:
value.get('op') == 'u' ? 'updates' : null
value.get('op') == 'u' ? 'updates' : null
带有 Graal.js 的 JavaScript
当使用带有 Graal.js 的 JavaScript 来创建基于内容的路由条件时,您可以使用与 Groovy 一起使用的方法类似。例如:
value.op == 'u' ? 'updates' : null
value.op == 'u' ? 'updates' : null
12.3.6. 配置基于内容的路由转换的选项 复制链接链接已复制到粘贴板!
属性 | 默认 | 描述 |
可选的正则表达式,用于评估事件的目标主题名称,以确定是否应用条件逻辑。如果目标主题的名称与 | ||
写入表达式的语言。必须以 | ||
要为每个消息评估的表达式。必须评估一个 | ||
|
指定转换如何处理
|
12.4. 过滤 Debezium 更改事件记录 复制链接链接已复制到粘贴板!
默认情况下,Debebe 提供它接收到 Kafka 代理的每个数据更改事件。然而,在很多情况下,您可能只关注生成者发出的事件子集。要让您只处理与您相关的记录,Debezium 只提供 过滤器 单个消息转换 (SMT)。
Debezium 过滤器 SMT 是一个技术预览功能。技术预览功能不被红帽产品服务级别协议(SLA)支持,且可能无法完成。因此,红帽不推荐在生产环境中实施任何技术预览功能。此技术预览功能为您提供对即将推出的产品创新的早期访问,允许您在开发过程中测试并提供反馈。如需有关支持范围的更多信息,请参阅 技术预览功能支持范围。
虽然可以使用 Java 创建自定义 SMT 来编码过滤逻辑,但使用自定义编码的 SMT 具有其缺陷。例如:
- 需要预先编译转换并将其部署到 Kafka Connect。
- 每个更改都需要代码重新编译和重新部署,从而造成不灵活的操作。
过滤器 SMT 支持与 JSR 223 集成的脚本语言(Java™ 平台跟踪)。
Debezium 不附带 JSR 223 API 的任何实现。要将表达式语言与 Debezium 搭配使用,您必须为语言下载 JSR 223 脚本引擎实施。根据您用于部署 Debezium 的方法,您可以自动从 Maven Central 下载所需的工件,也可以手动下载工件,然后将它们添加到 Debezium 连接器插件目录中,以及语言实施所使用的任何其他 JAR 文件中。
12.4.1. 设置 Debezium 过滤器 SMT 复制链接链接已复制到粘贴板!
为安全起见,Debezium 连接器存档中不包含过滤器 SMT。相反,它会在单独的工件中提供 debezium-scripting-2.1.4.Final.tar.gz
。
如果通过从 Dockerfile 构建自定义 Kafka Connect 容器镜像来部署 Debezium 连接器,若要使用过滤器 SMT,您必须明确下载 SMT 归档并部署文件以及连接器插件。当使用 AMQ Streams 部署连接器时,它可以根据您在 Kafka Connect 自定义资源中指定的配置参数自动下载所需的工件。重要信息:在 Kafka Connect 实例中存在过滤器 SMT 后,允许向实例添加连接器的任何用户都可以运行脚本表达式。要确保脚本表达式只能由授权用户运行,请务必在添加过滤器 SMT 前保护 Kafka Connect 实例及其配置接口。
如果您从 Dockerfile 构建 Kafka Connect 容器镜像,则适用以下步骤。如果使用 AMQ Streams 创建 Kafka Connect 镜像,请按照连接器部署主题中的说明操作。
流程
-
从浏览器中,打开 Debezium 下载站点的红帽构建,并下载 Debezium 脚本 SMT 存档(
debezium-scripting-2.1.4.Final.tar.gz
)。 - 将存档的内容提取到 Kafka Connect 环境的 Debezium 插件目录中。
- 获取 JSR-223 脚本引擎实现,并将其内容添加到 Kafka Connect 环境的 Debezium 插件目录中。
- 重启 Kafka Connect 进程以获取新的 JAR 文件。
Groovy 语言在 classpath 上需要以下库:
-
groovy
-
groovy-json
(可选) -
groovy-jsr223
JavaScript 语言在 classpath 上需要以下库:
-
graalvm.js
-
graalvm.js.scriptengine
12.4.2. 示例: Debezium 基本过滤器 SMT 配置 复制链接链接已复制到粘贴板!
您可以在 Debezium 连接器的 Kafka Connect 配置中配置过滤器转换。在配置中,您可以通过定义基于业务逻辑的过滤条件来指定您感兴趣的事件。当过滤器 SMT 处理事件流时,它会根据配置的过滤器条件评估每个事件。只有满足过滤器条件条件的事件才会传递给代理。
要配置 Debezium 连接器来过滤更改事件记录,请在 Debezium 连接器的 Kafka Connect 配置中配置 Filter
SMT。配置过滤器 SMT 要求您指定定义过滤条件的正则表达式。
例如,您可以在连接器配置中添加以下配置。
前面的例子指定了使用 Groovy
表达式语言。正则表达式 value.op == 'u' && value.before.id == 2
会删除所有消息,但代表 update (u
)记录的 id
值等于 2
。
自定义配置
前面的示例演示了一个简单的 SMT 配置,它旨在只处理 DML 事件,其中包含 op
字段。连接器可能会发出的其他类型的消息(心跳消息、tombstone 消息或有关架构更改和事务的元数据消息)不包含此字段。为了避免处理失败,您可以定义一个 SMT predicate 语句,该语句只会将转换应用到 特定事件。
12.4.3. 在过滤器表达式中使用的变量 复制链接链接已复制到粘贴板!
Debezium 将某些变量绑定到过滤器 SMT 的评估上下文中。当您创建表达式来指定过滤器条件时,您可以使用 Debezium 绑定到评估上下文的变量。通过绑定变量,Debezium 允许 SMT 在评估表达式中的条件时查找和解释其值。
下表列出了 Debezium 绑定到过滤器 SMT 的评估上下文的变量:
名称 | 描述 | 类型 |
---|---|---|
| 消息的一个键。 |
|
| 消息的值。 |
|
| message 键的 schema。 |
|
| 消息值的 schema。 |
|
| 目标主题的名称。 | 字符串 |
|
消息标头的 Java 映射。key 字段是标头名称。
|
|
表达式可以在其变量上调用任意方法。表达式应解析为布尔值,用来决定 SMT 如何处理消息。当表达式中的过滤器条件评估为 true
时,会保留消息。当过滤器条件评估为 false
时,会删除消息。
表达式不应产生任何副作用。也就是说,不应修改他们通过的任何变量。
12.4.4. 用于有选择地应用过滤器转换的选项 复制链接链接已复制到粘贴板!
除了 Debezium 连接器在发生数据库更改时发出的更改事件消息外,连接器还会发出其他类型的消息,包括心跳消息以及有关架构更改和事务的元数据消息。由于这些消息的结构与 SMT 旨在处理的更改事件消息的结构不同,因此最好将连接器配置为有选择地应用 SMT,以便它只处理预期的数据更改消息。您可以使用以下方法之一将连接器配置为有选择地应用 SMT:
- 为转换配置 SMT predicate。
- 对 SMT 使用 topic.regex 配置选项。
12.4.5. 为其他脚本语言过滤条件配置 复制链接链接已复制到粘贴板!
您表达过滤条件的方式取决于您使用的脚本语言。
例如,如 基本配置 示例所示,当您使用 Groovy
作为表达式语言时,以下表达式会删除所有消息,除了 id
值设置为 2
的更新记录:
value.op == 'u' && value.before.id == 2
value.op == 'u' && value.before.id == 2
其他语言使用不同的方法表达相同的条件。
Debezium MongoDB 连接器将 after
和 patch
字段作为序列化 JSON 文档而不是作为结构发出。
要将过滤器 SMT 与 MongoDB 连接器搭配使用,您必须首先将 JSON 中的数组字段解压到单独的文档中。
您可以使用表达式中的 JSON 解析器为每个数组项目生成单独的输出文档。例如,如果您使用 Groovy 作为表达式语言,请将 groovy-json
工件添加到 classpath 中,然后添加一个表达式,如 (new groovy.json.JsonSlurper ()).parseText (value.after).last_name == 'Kretchmar'
。
JavaScript
如果您使用 JavaScript 作为表达式语言,您可以调用 StructVirtualMachineget ()
方法来指定过滤条件,如下例所示:
value.get('op') == 'u' && value.get('before').get('id') == 2
value.get('op') == 'u' && value.get('before').get('id') == 2
带有 Graal.js 的 JavaScript
如果您使用带有 Graal.js 的 JavaScript 来定义过滤条件,您可以使用类似于 Groovy 的方法。例如:
value.op == 'u' && value.before.id == 2
value.op == 'u' && value.before.id == 2
12.4.6. 配置过滤器转换的选项 复制链接链接已复制到粘贴板!
下表列出了您可以在过滤器 SMT 中使用的配置选项。
属性 | 默认 | 描述 |
可选的正则表达式,用于评估事件的目标主题名称,以确定是否应用过滤逻辑。如果目标主题的名称与 | ||
写入表达式的语言。必须以 | ||
要为每个消息评估的表达式。必须评估一个布尔值,其中为 | ||
|
指定转换如何处理
|
12.5. 从 Debezium 更改事件中提取源记录 after 状态 复制链接链接已复制到粘贴板!
Debezium 连接器会发出数据更改信息,以表示它们从源数据库捕获的每个操作。连接器发送到 Apache Kafka 的消息具有复杂的结构,它错误地代表原始数据库事件的详情。
虽然这种复杂的消息格式准确详细介绍了系统中发生的更改的信息,但该格式可能不适用于一些下游用户。Kafka 生态系统的其他部分可能需要格式的信息,以便字段名称和值以简化的扁平化结构显示。
要简化 Debezium 连接器生成的事件记录的格式,您可以使用 Debezium 事件扁平化单个消息转换(SMT)。配置转换以支持需要 Kafka 记录的用户,其格式比连接器生成的默认格式要简单。根据您的具体用例,您可以将 SMT 应用到 Debezium 连接器,或应用到消耗 Debezium 连接器生成的消息的接收器连接器。要启用 Apache Kafka 以其原始格式保留 Debezium 更改事件信息,请为接收器连接器配置 SMT。
事件扁平化转换是一个 Kafka Connect SMT。
本章中的信息描述了 Debezium SQL 的数据库连接器的扁平化单个消息转换(SMT)。有关 Debezium MongoDB 连接器等同的 SMT 的详情,请参考 MongoDB New Document Extraction。
以下主题提供详情:
12.5.1. Debezium 更改事件结构的描述 复制链接链接已复制到粘贴板!
Debezium 生成具有复杂结构的数据更改事件。每个事件由三个部分组成:
元数据,包括但不限于:
- 更改数据的操作类型。
- 源信息,如数据库名称和发生更改的表。
- 标识更改的时间戳。
- 可选的事务信息。
- 更改前的行数据
- 更改后的行数据
以下示例显示了 UPDATE
更改事件的消息结构的一部分:
有关连接器更改事件结构的更多信息,请参阅连接器的文档。
事件扁平化 SMT 处理上例中的信息后,它简化了消息格式,如下例所示:
{ "field1" : "newvalue1", "field2" : "newvalue2" }
{
"field1" : "newvalue1",
"field2" : "newvalue2"
}
12.5.2. Debezium 事件扁平化转换的行为 复制链接链接已复制到粘贴板!
事件扁平化 SMT 从 Kafka 记录中的 Debezium 更改事件中提取 after
字段。SMT 仅将原始更改事件替换为其 after
字段来创建简单的 Kafka 记录。
您可以为 Debezium 连接器或消耗 Debezium 连接器发送的消息配置事件扁平化 SMT。为接收器连接器配置事件扁平化的优点是,存储在 Apache Kafka 中的记录包含整个 Debezium 更改事件。将 SMT 应用到源或接收器连接器的决定取决于您的特定用例。
您可以配置转换以执行以下操作之一:
- 将更改事件的元数据添加到简化的 Kafka 记录中。默认行为是 SMT 不会添加元数据。
-
在流中为
DELETE
操作保留包含更改事件的 Kafka 记录。默认行为是 SMT 丢弃DELETE
操作更改事件的 Kafka 记录,因为大多数用户还无法处理它们。
数据库 DELETE
操作会导致 Debezium 生成两个 Kafka 记录:
-
包含
"op": "d"、
前
行数据和一些其他字段的记录。 -
具有与已删除行相同的键和
null
值的 tombstone 记录。此记录是 Apache Kafka 的标记。这表示 日志压缩 可以删除所有具有此键的记录。
您可以将事件扁平化配置为执行以下操作之一,而不是丢弃包含 before
行数据的记录:
-
将记录保留在流中,并将它编辑为只有
"value": "null"
字段。 -
将记录保留在流中,并将它编辑为
value
字段,其中包含在before
字段中带有添加的"__deleted": "true"
条目的 key/value 对。
同样,您可以配置事件扁平化 SMT,而不是丢弃 tombstone 记录,以将 tombstone 记录保留在流中。
12.5.3. 配置 Debezium 事件扁平化转换 复制链接链接已复制到粘贴板!
通过在连接器配置中添加 SMT 配置详情,在 Kafka Connect 源或接收器连接器中配置 Debezium 事件扁平化 SMT。例如,要获取转换的默认行为,请将其添加到连接器配置中,而不指定任何选项,如下例所示:
transforms=unwrap,... transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState
transforms=unwrap,...
transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState
与任何 Kafka Connect 连接器配置一样,您可以按照您希望 Kafka Connect 应用 SMT 的顺序将 converts =
设置为多个、以逗号分隔的 SMT 别名。
以下 .properties
示例设置了几个事件扁平化 SMT 选项:
transforms=unwrap,... transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState transforms.unwrap.drop.tombstones=false transforms.unwrap.delete.handling.mode=rewrite transforms.unwrap.add.fields=table,lsn
transforms=unwrap,...
transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState
transforms.unwrap.drop.tombstones=false
transforms.unwrap.delete.handling.mode=rewrite
transforms.unwrap.add.fields=table,lsn
drop.tombstones=false
-
在事件流中为
DELETE
操作保留 tombstone 记录。 delete.handling.mode=rewrite
对于
DELETE
操作,通过扁平化更改事件中的value
字段来编辑 Kafka 记录。value
字段直接包含before
字段中的键/值对。SMT 添加__deleted
并将其设置为true
,例如:"value": { "pk": 2, "cola": null, "__deleted": "true" }
"value": { "pk": 2, "cola": null, "__deleted": "true" }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow add.fields=table,lsn
-
在简化的 Kafka 记录中添加
表和
lsn
字段的更改事件元数据。
自定义配置
连接器可能会发出多种类型的事件信息(心跳消息、tombstone 消息或元数据消息有关事务或模式更改)。要将转换应用到事件子集,您可以定义一个 SMT predicate 语句,用于选择性地将转换应用到 特定事件。
12.5.4. 在 Kafka 记录中添加 Debezium 元数据的示例 复制链接链接已复制到粘贴板!
您可以配置事件扁平化 SMT,将原始更改事件元数据添加到简化的 Kafka 记录中。例如,您可能希望简化的记录的标头或值包含以下任意一种:
- 进行更改的操作类型
- 更改的数据库或表的名称
- 特定于连接器的字段,如 Postgres LSN 字段
要在简化的 Kafka 记录的标头中添加元数据,请指定 add.headers
选项。要在简化的 Kafka 记录的值中添加元数据,请指定 add.fields
选项。每个选项都使用以逗号分隔的更改事件字段名称列表。不要指定空格。当有重复的字段名称时,要为其中一个字段添加元数据,请指定 struct 和字段。例如:
transforms=unwrap,... transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState transforms.unwrap.add.fields=op,table,lsn,source.ts_ms transforms.unwrap.add.headers=db transforms.unwrap.delete.handling.mode=rewrite
transforms=unwrap,...
transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState
transforms.unwrap.add.fields=op,table,lsn,source.ts_ms
transforms.unwrap.add.headers=db
transforms.unwrap.delete.handling.mode=rewrite
使用这个配置,简化的 Kafka 记录将包含以下内容:
另外,简化的 Kafka 记录会有一个 __db
标头。
在简化的 Kafka 记录中,SMT 使用双下划线为 metadata 字段名称添加前缀。当您指定 struct 时,F SMT 也会在 struct 名称和字段名称之间插入下划线。
要在用于 DELETE
操作的简化 Kafka 记录中添加元数据,还必须配置 delete.handling.mode=rewrite
。
12.5.5. 用于有选择地应用事件扁平化转换的选项 复制链接链接已复制到粘贴板!
除了 Debezium 连接器在发生数据库更改时发出的更改事件消息外,连接器还会发出其他类型的消息,包括心跳消息以及有关架构更改和事务的元数据消息。由于这些消息的结构与 SMT 旨在处理的更改事件消息的结构不同,因此最好将连接器配置为有选择地应用 SMT,以便它只处理预期的数据更改消息。
有关如何有选择地应用 SMT 的更多信息,请参阅为转换配置 SMT predicate。
12.5.6. 配置 Debezium 事件扁平化转换的选项 复制链接链接已复制到粘贴板!
下表描述了您可以指定配置事件扁平化 SMT 的选项。
选项 | 默认 | 描述 |
---|---|---|
|
Debezium 为每个 | |
|
Debezium 为每个 | |
要使用行数据来确定要将记录路由到的主题,请将此选项设置为 | ||
__ (double-underscore) | 将此可选字符串设置为为字段添加前缀。 | |
没有默认值 |
将这个选项设置为用逗号分开的列表,没有空格,将元数据字段添加到简化的 Kafka 记录的值中。当有重复的字段名称时,要为其中一个字段添加元数据,请指定 struct 和字段,如 | |
__ (double-underscore) | 将此可选字符串设置为标头前缀。 | |
没有默认值 |
将这个选项设置为用逗号分开的列表,没有空格,将元数据字段添加到简化的 Kafka 记录的标头中。当有重复的字段名称时,要为其中一个字段添加元数据,请指定 struct 和字段,如 |
12.6. 从 Debezium MongoDB 更改事件中提取源文档 复制链接链接已复制到粘贴板!
Debezium MongoDB 连接器会发出数据更改信息,以表示 MongoDB 集合中发生的每个操作。这些事件消息的复杂结构传真代表原始数据库事件的详细信息。但是,一些下游用户可能无法以原始格式处理消息。例如,要表示数据收集中的嵌套文档,连接器以包含嵌套字段的格式发送事件消息。要支持接收器连接器,或者无法处理原始消息的层次结构格式的其他使用者,您可以使用 Debezium MongoDB 事件扁平化(ExtractNewDocumentState)单一消息转换(SMT)。SMT 简化了原始消息的结构,并可以通过其他方法修改消息,以便更轻松地处理数据。
事件扁平化转换是一个 Kafka Connect SMT。
本章中的信息仅描述了 Debezium MongoDB 连接器的单个消息转换(SMT)。有关与关系数据库一起使用的相同 SMT 的详情,请参考新记录状态 Extraction SMT 的文档。
以下主题提供详情:
- 第 12.6.1 节 “Debezium MongoDB 更改事件结构的描述”
- 第 12.6.2 节 “Debezium MongoDB 事件扁平化转换的行为”
- 第 12.6.3 节 “配置 Debezium MongoDB 事件扁平化转换”
- 第 12.6.4 节 “MongoDB 事件消息中编码数组的选项”
- 第 12.6.5 节 “在 MongoDB 事件消息中扁平化嵌套结构”
-
第 12.6.6 节 “Debezium MongoDB 连接器如何报告
$unset
操作删除的字段名称” - 第 12.6.7 节 “确定原始数据库操作的类型”
- 第 12.6.8 节 “使用 MongoDB 事件扁平化 SMT 将 Debezium 元数据添加到 Kafka 记录”
- 第 12.6.9 节 “应用 MongoDB 的选项有选择地提取新的文档状态转换”
- 第 12.6.10 节 “MongoDB 事件扁平化转换的配置选项”
- 已知限制
12.6.1. Debezium MongoDB 更改事件结构的描述 复制链接链接已复制到粘贴板!
Debezium MongoDB 连接器生成具有复杂结构的更改事件。每个事件消息包括以下部分:
- 源元数据
包括但不仅限于以下字段:
- 更改集合中数据的操作类型(创建/插入、更新或删除)。
- 发生更改的数据库和集合的名称。
- 标识更改的时间戳。
- 可选的事务信息。
- 文档数据
- 数据
前
当 Debezium 连接器的
capture.mode
设置为以下值之一时,此字段存在于运行 MongoDB 6.0 及之后的版本中:-
change_streams_with_pre_image
. change_streams_update_full_with_pre_image
.如需更多信息,请参阅 MongoDB 预镜像支持
-
- 数据
后
代表在当前操作后文档中存在的值的 JSON 字符串。事件消息中存在
after
字段取决于事件类型和连接器配置。MongoDB插入
操作的create
事件始终包含after
字段,而不考虑capture.mode
设置。对于更新
事件,只有在capture.mode
被设置为以下值之一时,才会显示after
字段:-
change_streams_update_full
change_streams_update_full_with_pre_image
.注意更改事件消息中的
after
值不一定表示事件后立即表示文档的状态。该值不会被动态计算,在连接器捕获更改事件后,它会查询集合以检索文档的当前值。例如,假设有多个操作、
b
和c
修改文档的情况,以快速成功方式修改文档。当连接器进程时,它会更改
,它会查询集合以获取完整的文档。同时,更改
b
和c
。当连接器收到对更改的完整文档的响应时,可能会收到一个基于b
或c
后续更改的文档版本。如需更多信息,请参阅
capture.mode
属性的文档。
-
- 数据
以下片段显示了连接器在 MongoDB 插入
操作后发出的 创建
更改事件的基本结构:
{ "op": "c", "after": "{\"field1\":\"newvalue1\",\"field2\":\"newvalue1\"}", "source": { ... } }
{
"op": "c",
"after": "{\"field1\":\"newvalue1\",\"field2\":\"newvalue1\"}",
"source": { ... }
}
上例中的 after
字段的复杂格式提供了有关源数据库中发生的更改的详细信息。但是,一些消费者无法处理包含嵌套值的消息。要将原始消息的复杂嵌套字段转换为更简单、更通用兼容结构,请为 MongoDB 使用 event flattening SMT。SMT 扁平化消息中嵌套字段的结构,如下例所示:
{ "field1" : "newvalue1", "field2" : "newvalue2" }
{
"field1" : "newvalue1",
"field2" : "newvalue2"
}
有关 Debezium MongoDB 连接器生成的消息的默认结构的更多信息,请参阅 连接器文档。
12.6.2. Debezium MongoDB 事件扁平化转换的行为 复制链接链接已复制到粘贴板!
MongoDB 的事件扁平化 SMT 从 Debezium MongoDB 连接器发送的
更改事件消息中提取 创建或更新
after
字段。在 SMT 处理原始更改事件消息后,它会生成一个简化的版本,该版本只包含 after
字段的内容。
根据您的用例,您可以将 ExtractNewDocumentState SMT 应用到 Debezium MongoDB 连接器,或应用到消耗 Debezium 连接器生成的消息的接收器连接器。如果您将 SMT 应用到 Debezium MongoDB 连接器,则 SMT 会在将连接器发送到 Apache Kafka 前修改连接器发送的消息。要确保 Kafka 以原始格式保留完整的 Debezium 更改事件信息,请将 SMT 应用到接收器连接器。
当您使用事件扁平化 SMT 来处理从 MongoDB 连接器发出的消息时,F SMT 会将原始消息中的记录结构转换为正确输入的 Kafka Connect 记录,这些记录可以被典型的 sink 连接器使用。例如,FUSE 会将代表原始消息中的 after
信息的 JSON 字符串转换为任何消费者可以处理的模式结构。
另外,您可以为 MongoDB 配置事件扁平化 SMT,以便在处理过程中以其他方式修改消息。如需更多信息,请参阅配置 主题。
12.6.3. 配置 Debezium MongoDB 事件扁平化转换 复制链接链接已复制到粘贴板!
为使用 Debezium MongoDB 连接器发送的消息的 MongoDB 配置事件扁平化(ExtractNewDocumentState) SMT。
以下主题提供详情:
- 第 12.6.3.1 节 “示例: Debezium MongoDB 事件扁平化的基本配置”
- 第 12.6.4 节 “MongoDB 事件消息中编码数组的选项”
- 第 12.6.5 节 “在 MongoDB 事件消息中扁平化嵌套结构”
-
第 12.6.6 节 “Debezium MongoDB 连接器如何报告
$unset
操作删除的字段名称” - 第 12.6.7 节 “确定原始数据库操作的类型”
- 第 12.6.8 节 “使用 MongoDB 事件扁平化 SMT 将 Debezium 元数据添加到 Kafka 记录”
- 第 12.6.9 节 “应用 MongoDB 的选项有选择地提取新的文档状态转换”
- 第 12.6.10 节 “MongoDB 事件扁平化转换的配置选项”
12.6.3.1. 示例: Debezium MongoDB 事件扁平化的基本配置 复制链接链接已复制到粘贴板!
要获取 SMT 的默认行为,请在 sink 连接器配置中添加 SMT,而不指定任何选项,如下例所示:
transforms=unwrap,... transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState
transforms=unwrap,...
transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState
与任何 Kafka Connect 连接器配置一样,您可以将 converts =
设置为多个、以逗号分隔的 SMT 别名。Kafka Connect 应用按照列出顺序指定的转换。
您可以为使用 MongoDB 事件扁平化 SMT 的连接器设置多个选项。以下示例显示了为连接器设置 drop.tombstones
、delete.handling.mode
和 add.headers
选项的配置:
transforms=unwrap,... transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.drop.tombstones=false transforms.unwrap.delete.handling.mode=drop transforms.unwrap.add.headers=op
transforms=unwrap,...
transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState
transforms.unwrap.drop.tombstones=false
transforms.unwrap.delete.handling.mode=drop
transforms.unwrap.add.headers=op
有关上例中的配置选项的更多信息,请参阅配置 主题,
自定义配置
连接器可能会发出多种类型的事件信息(如心跳消息、tombstone 消息或有关事务的元数据消息)。要将转换应用到事件子集,您可以定义一个 SMT predicate 语句,用于选择性地将转换应用到 特定事件。
12.6.4. MongoDB 事件消息中编码数组的选项 复制链接链接已复制到粘贴板!
默认情况下,事件扁平化 SMT 将 MongoDB 阵列转换为与 Apache Kafka Connect 或 Apache Avro 模式兼容的数组。虽然 MongoDB 数组可以包含多个类型的元素,但 Kafka 数组中的所有元素都必须是相同的类型。
为确保 SMT 以满足环境需求的方式编码数组,您可以指定 array.encoding
配置选项。以下示例显示了设置数组编码的配置:
transforms=unwrap,... transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.array.encoding=<array|document>
transforms=unwrap,...
transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState
transforms.unwrap.array.encoding=<array|document>
根据配置,SMT 使用以下编码方法之一处理源消息中数组的每个实例:
- 阵列编码
-
如果将
array.encoding
设置为数组
(默认),则 SMT 编码将使用
数组来编码原始消息中的数组。为确保正确处理,数组实例中的所有元素都必须是相同的类型。这个选项是一个限制,但它可让下游客户端轻松处理阵列。 - 文档编码
-
如果将
array.encoding
设置为文档
,则 SMT 会将源中的每个阵列转换为 结构 的结构,类似于 BSON 序列化。主 结构 包含名为_0、
_1
、_2
等等的字段,其中每个字段名称代表原始数组中某一元素的索引。SMT 使用 source 数组中等同元素检索的值填充每个索引字段。索引名称以下划线作为前缀,因为 Avro 编码禁止以数字字符开头的字段名称。
以下示例演示了 Debezium MongoDB 连接器如何代表一个数据库文件,其中包含包含异构数据类型的数组:
例 12.1. 示例:包含多个数据类型的数组文档编码
如果将 array.encoding
设置为 文档
,则 SMT 会将前面的文档转换为以下格式:
文档
编码选项可让 SMT 处理由异构元素组成的任意数组。但是,在使用这个选项前,请始终验证接收器连接器和其他下游用户是否能够处理包含多个数据类型的数组。
12.6.5. 在 MongoDB 事件消息中扁平化嵌套结构 复制链接链接已复制到粘贴板!
当数据库操作涉及嵌入式文档时,Debezium MongoDB 连接器会发出一个 Kafka 事件记录,其中包含反映原始文档层次结构的结构。也就是说,事件消息将嵌套文档表示为一组嵌套字段结构。在下游连接器无法处理包含嵌套结构的消息的环境中,您可以将事件扁平化 SMT 配置为扁平化消息中的分层结构。扁平消息结构更适合表等存储。
要将 SMT 配置为扁平化嵌套结构,请将 flatten.struct
配置选项设置为 true
。在转换的消息中,字段名称会被构建,使其与文档源一致。SMT 通过将父文档字段名称与嵌套文档字段的名称匹配来重命名每个扁平化字段。由 flatten.struct.delimiter
选项定义的分隔符分隔名称的组件。struct.delimiter
的默认值是一个下划线字符(_
)。
以下示例显示了用于指定 SMT 扁平化嵌套结构的配置:
transforms=unwrap,... transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.flatten.struct=<true|false> transforms.unwrap.flatten.struct.delimiter=<string>
transforms=unwrap,...
transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState
transforms.unwrap.flatten.struct=<true|false>
transforms.unwrap.flatten.struct.delimiter=<string>
以下示例显示了 MongoDB 连接器发送的事件信息。消息包含一个文档的字段,其中包含两个嵌套文档( b
和 c
)的字段:
以下示例中的消息显示在 MongoDB 的 SMT 后的输出。
在生成的消息中,原始消息中的 b
和 c
字段将被扁平化并重命名。重命名的字段通过将父文档的名称与嵌套文档的名称连接在一起:
和 a
_ba_c
。新字段名称的组件使用下划线字符分隔,具体由 struct.delimiter
配置属性的设置所定义。
12.6.6. Debezium MongoDB 连接器如何报告 $unset 操作删除的字段名称 复制链接链接已复制到粘贴板!
在 MongoDB 中,$unset
operator 和 $rename
operator 都从文档中删除字段。因为 MongoDB 集合是无架构的,在更新从文档中删除字段后,无法推断更新的文档中缺少的字段的名称。为了支持接收器连接器或其他可能需要删除字段的信息,Debezium 会发出更新信息,其中包含列出已删除字段名称的 removedFields
元素。
以下示例显示了导致删除字段的操作更新消息的一部分:
在上例中,在 文档更新
之前和之后,代表源文档的状态。只有在设置了连接器的
capture.mode
时,连接器才会发出这些字段,如以下列表所述:
- 字段
前
在更改前提供文档的状态。只有在
capture.mode
设置为以下值之一时,才会显示此字段:-
change_streams_with_pre_image
-
change_streams_update_full_with_pre_image
.
-
after
字段更改后提供文档的完整状态。只有在
capture.mode
设置为以下值之一时,才会显示此字段:-
change_streams_update_full
-
change_streams_update_full_with_pre_image
.
-
假设配置为捕获完整文档的连接器,当 ExtractNewDocumentState
SMT 收到 $unset
事件 的更新
消息时,对于 $unset 事件的 SMT 会重新处理消息,这代表 removed 字段有一个 null
值,如下例所示:
{ "id": 1, "a": null }
{
"id": 1,
"a": null
}
对于没有配置为捕获完整文档的连接器,当 SMT 收到 $unset
操作的更新事件时,它会生成以下输出信息:
{ "a": null }
{
"a": null
}
12.6.7. 确定原始数据库操作的类型 复制链接链接已复制到粘贴板!
在 SMT 扁平化事件后,生成的消息不再指示生成事件的操作是 create
、update
或 initial snapshot read
。通常,您可以通过配置连接器来公开有关删除附带的 tombstone 或重写事件的信息,来识别 删除操作
。有关配置连接器以公开事件消息中的 tombstones 和 rewrites 的更多信息,请参阅 drop.tombstones
和 delete.handling.mode
属性。
要在事件消息中报告数据库操作类型,SMT 可以向以下元素之一添加一个 op
字段:
- 事件消息正文。
- 消息标头。
例如,要添加一个标头属性来显示原始操作的类型,请添加转换,然后将 add.headers
属性添加到连接器配置中,如下例所示:
transforms=unwrap,... transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.add.headers=op
transforms=unwrap,...
transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState
transforms.unwrap.add.headers=op
根据前面的配置,SMT 通过向消息添加 op
标头来报告事件类型,并为它分配一个字符串值来标识操作的类型。分配的字符串值基于原始 MongoDB 更改事件消息 中的 op
字段值。
12.6.8. 使用 MongoDB 事件扁平化 SMT 将 Debezium 元数据添加到 Kafka 记录 复制链接链接已复制到粘贴板!
MongoDB 的事件扁平化 SMT 可以将原始更改事件消息的元数据字段添加到简化的消息中。添加的元数据字段前缀为双引号("__
")。在事件记录中添加元数据可包含内容,如发生更改事件的集合名称,或包含特定于连接器的字段,如副本集名称。目前,SMT 只能添加以下更改事件子结构中的字段: source
、Transaction 和 updateDescription
。
有关 MongoDB 更改事件结构的更多信息,请参阅 MongoDB 连接器文档。
例如,您可以指定以下配置来添加副本集名称(rs
)和更改事件的集合名称到最终扁平化的事件记录:
transforms=unwrap,... transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState transforms.unwrap.add.fields=rs,collection
transforms=unwrap,...
transforms.unwrap.type=io.debezium.connector.mongodb.transforms.ExtractNewDocumentState
transforms.unwrap.add.fields=rs,collection
以上配置会导致以下内容添加到扁平化的记录中:
{ "__rs" : "rs0", "__collection" : "my-collection", ... }
{ "__rs" : "rs0", "__collection" : "my-collection", ... }
如果您希望 SMT 添加元数据字段 来删除
事件,请将 delete.handling.mode
选项的值设置为 重写
。
12.6.9. 应用 MongoDB 的选项有选择地提取新的文档状态转换 复制链接链接已复制到粘贴板!
除了 Debezium 连接器在发生数据库更改时发出的更改事件消息外,连接器还会发出其他类型的消息,包括心跳消息以及有关架构更改和事务的元数据消息。由于这些消息的结构与 SMT 旨在处理的更改事件消息的结构不同,因此最好将连接器配置为有选择地应用 SMT,以便它只处理预期的数据更改消息。
有关如何有选择地应用 SMT 的更多信息,请参阅为转换配置 SMT predicate。
12.6.10. MongoDB 事件扁平化转换的配置选项 复制链接链接已复制到粘贴板!
下表描述了 MongoDB 事件扁平化 SMT 的配置选项。
属性 | 默认 | 描述 |
---|---|---|
| 指定 SMT 在编码从原始事件消息读取的数组时使用的格式。设置以下选项之一:
有关 | |
| 原始事件消息中的 SMT flattens 结构(structs)通过串联消息中的嵌套属性的名称(用可配置的分隔符分隔)来形成一个简单的字段名称。 | |
|
当 | |
|
Debezium 为每个 | |
|
指定 SMT 如何处理 Debezium 为
| |
__ (double-underscore) | 将此可选字符串设置为标头前缀。 | |
没有默认值 |
指定以逗号分隔的列表,没有空格,包含您希望 SMT 添加到简化的消息标头中的元数据字段。当原始消息包含重复字段名称时,您可以通过提供结构名称和字段名称来标识要修改的特定字段,如
另外,您可以通过在列表中添加一个以下格式的条目来覆盖字段的原始名称,并为它分配新名称:
例如: version:VERSION, connector:CONNECTOR, source.ts_ms:EVENT_TIMESTAMP
您指定的新名称值区分大小写。 | |
__ (double-underscore) | 指定为字段名称的前缀的可选字符串。 | |
没有默认值 |
将这个选项设置为用逗号分开的列表,没有空格,将元数据字段添加到简化的 Kafka 消息的
例如: version:VERSION, connector:CONNECTOR, source.ts_ms:EVENT_TIMESTAMP
您指定的新名称值区分大小写。
当 SMT 在简化的消息的 | |
| 字段名称是否会被清理以遵守 Avro 命名要求。如需了解更多详细信息,请参阅 Avro 命名。 |
已知限制
- 由于 MongoDB 是一个无架构数据库,因此在使用 Debezium 将更改流传输到基于模式的数据关系数据库时,具有相同名称的集合中的字段必须存储同一类型的数据。
- 将 SMT 配置为以与接收器连接器兼容的格式生成信息。如果接收器连接器需要"flat"消息结构,但它会收到一个在源 MongoDB 文档中编码数组的消息,则接收器连接器无法处理消息。
12.7. 配置 Debezium 连接器以使用 outbox 模式 复制链接链接已复制到粘贴板!
开箱即用模式是一种在多个(micro)服务间安全、可靠地交换数据的方法。开箱即用模式实施可避免服务内部状态(通常在其数据库中保留)和状态,以及需要相同数据的服务所消耗的事件的状态。
要在 Debezium 应用程序中实施 outbox 模式,请将 Debezium 连接器配置为:
- 捕获开箱即用表中的更改
- 应用 Debezium outbox 事件路由器单消息转换(SMT)
配置为应用 outbox SMT 的 Debezium 连接器应该只捕获在 outbox 表中发生的更改。如需更多信息,请参阅有 选择应用转换的选项。
只有每个 outbox 表具有相同的结构时,连接器才能捕获多个 outbox 表中的更改。
请参阅 可靠的与 Outbox Pattern 的数据交换,以了解为什么开箱即用模式很有用以及如何工作。
outbox 事件路由器 SMT 与 MongoDB 连接器不兼容。
MongoDB 用户可以运行 MongoDB outbox 事件路由器 SMT。
以下主题提供详情:
- 第 12.7.1 节 “Debezium outbox 消息示例”
- 第 12.7.2 节 “Debezium outbox 事件路由器 SMT 期望的 outbox 表结构”
- 第 12.7.3 节 “基本 Debezium outbox 事件路由器 SMT 配置”
- 第 12.7.4 节 “用于有选择地应用 Outbox 事件路由器转换的选项”
- 第 12.7.5 节 “在 Debezium outbox 消息中使用 Avro 作为有效负载格式”
- 第 12.7.6 节 “在 Debezium outbox 信息中记录其他字段”
- 第 12.7.7 节 “将转义的 JSON 字符串扩展为 JSON”
- 第 12.7.8 节 “配置开箱即用事件路由器转换的选项”
12.7.1. Debezium outbox 消息示例 复制链接链接已复制到粘贴板!
要了解 Debezium outbox 事件路由器 SMT 的配置方式,请查看以下 Debezium outbox 信息示例:
被配置为应用 outbox 事件路由器 SMT 的 Debezium 连接器通过转换 Debezium raw 信息来生成上述消息,如下所示:
这个 Debezium outbox 消息示例基于 默认的 outbox 事件路由器配置,它假定一个基于聚合的表结构和事件路由。要自定义行为,outbox 事件路由器 SMT 提供了大量 配置选项。
12.7.2. Debezium outbox 事件路由器 SMT 期望的 outbox 表结构 复制链接链接已复制到粘贴板!
要应用默认的 outbox 事件路由器 SMT 配置,假设您的 outbox 表具有以下列:
列 | 效果 |
---|---|
|
包含事件的唯一 ID。在 outbox 消息中,这个值是一个标头。您可以使用此 ID 删除重复的消息。 |
|
包含 SMT 附加到主题名称中的值,连接器向这个主题发出一个 outbox 信息。默认行为是,这个值替换了 |
|
包含 event 键,它为有效负载提供 ID。SMT 使用这个值作为发送的 outbox 消息中的键。这对于在 Kafka 分区中维护正确顺序非常重要。 |
|
开箱即用更改事件的表示。默认结构为 JSON。默认情况下,Kafka message 值仅由 |
其他自定义列 |
outbox 表中的任何其他列可以在 payload 部分中或作为消息标头 添加到 outbox 事件中。 |
12.7.3. 基本 Debezium outbox 事件路由器 SMT 配置 复制链接链接已复制到粘贴板!
要配置 Debezium 连接器来支持 outbox 模式,请配置 outbox.EventRouter
SMT。要获取 SMT 的默认行为,请将其添加到连接器配置中,而不指定任何选项,如下例所示:
transforms=outbox,... transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
transforms=outbox,...
transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
自定义配置
连接器可能会发出多种类型的事件信息(例如,心跳消息、tombstone 消息或有关事务或架构更改的元数据消息)。要将转换应用到来自 outbox 表中的事件,请定义一个 SMT predicate 语句,选择性地将转换应用到 这些事件。
12.7.4. 用于有选择地应用 Outbox 事件路由器转换的选项 复制链接链接已复制到粘贴板!
除了 Debezium 连接器在发生数据库更改时发出的更改事件消息外,连接器还会发出其他类型的消息,包括心跳消息以及有关架构更改和事务的元数据消息。由于这些消息的结构与 SMT 旨在处理的更改事件消息的结构不同,因此最好将连接器配置为有选择地应用 SMT,以便它只处理预期的数据更改消息。您可以使用以下方法之一将连接器配置为有选择地应用 SMT:
- 为转换配置 SMT predicate。
-
将
route.topic.regex
配置选项用于 SMT。
12.7.5. 在 Debezium outbox 消息中使用 Avro 作为有效负载格式 复制链接链接已复制到粘贴板!
outbox 事件路由器 SMT 支持任意有效负载格式。outbox 表中的 payload
列值以透明方式传递。使用 JSON 的替代方案是使用 Avro。这对消息格式监管非常有用,并确保外部事件模式以向后兼容的方式演进。
源应用程序如何为开箱即用消息有效负载生成 Avro 格式的内容不在本文档范围内。一种可能是利用 KafkaAvroSerializer
类来序列化 GenericRecord
实例。要确保 Kafka message 值是确切的 Avro 二进制数据,请将以下配置应用到连接器:
transforms=outbox,... transforms.outbox.type=io.debezium.transforms.outbox.EventRouter value.converter=io.debezium.converters.BinaryDataConverter
transforms=outbox,...
transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
value.converter=io.debezium.converters.BinaryDataConverter
默认情况下,有效负载
列值( Avro 数据)是唯一消息值。将 BinaryDataConverter
配置为值转换器会将 payload
列值按原样传播到 Kafka 消息值。
Debezium 连接器可以配置为发出心跳、事务元数据或模式更改事件(根据连接器而异)。这些事件不能由 BinaryDataConverter
序列化,因此必须提供额外的配置,以便转换器了解如何序列化这些事件。例如,以下配置演示了使用没有模式的 Apache Kafka JsonConverter
:
transforms=outbox,... transforms.outbox.type=io.debezium.transforms.outbox.EventRouter value.converter=io.debezium.converters.BinaryDataConverter value.converter.delegate.converter.type=org.apache.kafka.connect.json.JsonConverter value.converter.delegate.converter.type.schemas.enable=false
transforms=outbox,...
transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
value.converter=io.debezium.converters.BinaryDataConverter
value.converter.delegate.converter.type=org.apache.kafka.connect.json.JsonConverter
value.converter.delegate.converter.type.schemas.enable=false
delegate Converter
实现由 delegate.converter.type
选项指定。如果转换器需要额外的配置选项,也可以指定它们,如上述模式的禁用使用 schemas.enable=false
。
自 Debezium 版本 1.9 起,转换器 io.debezium.converters.ByteBufferConverter
已被弃用,并在 2.0 中删除。另外,在使用 Kafka Connect 时,必须在升级到 Debezium 2.x 前更新连接器的配置
12.7.6. 在 Debezium outbox 信息中记录其他字段 复制链接链接已复制到粘贴板!
您的 outbox 表可能会包含您要添加到发送的消息中的列。例如,假设一个 outbox 表在 aggregatetype
列中具有 purchase-order
值,另一个列 eventType
,其可能的值是 order-created
和 order-shipped
。可以使用 syntax 列添加其他字段 :placement:alias
。
放置
允许的值是: - header
- envelope
- partition
要在 outbox 消息标头中发出 eventType
列值,请配置 SMT,如下所示:
transforms=outbox,... transforms.outbox.type=io.debezium.transforms.outbox.EventRouter transforms.outbox.table.fields.additional.placement=eventType:header:type
transforms=outbox,...
transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
transforms.outbox.table.fields.additional.placement=eventType:header:type
结果将是 Kafka 消息的标头,其 type
作为其键,eventType
列的值作为其值。
要在 outbox message envelope 中发出 eventType
列值,请配置 SMT,如下所示:
transforms=outbox,... transforms.outbox.type=io.debezium.transforms.outbox.EventRouter transforms.outbox.table.fields.additional.placement=eventType:envelope:type
transforms=outbox,...
transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
transforms.outbox.table.fields.additional.placement=eventType:envelope:type
要控制生成 outbox 信息的分区,请配置 SMT,如下所示:
transforms=outbox,... transforms.outbox.type=io.debezium.transforms.outbox.EventRouter transforms.outbox.table.fields.additional.placement=partitionColumn:partition
transforms=outbox,...
transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
transforms.outbox.table.fields.additional.placement=partitionColumn:partition
请注意,对于 分区
放置,添加别名将无效。
12.7.7. 将转义的 JSON 字符串扩展为 JSON 复制链接链接已复制到粘贴板!
您可能已注意到 Debezium outbox 消息包含以 String 表示 的有效负载
。因此,当此字符串实际上为 JSON 时,它会在结果 Kafka 信息中显示为转义,如下所示:
借助 outbox 事件路由器,您可以将此消息内容扩展到"real"JSON,并将 companion 模式从 JSON 文档本身分离。这样,在 Kafka 信息中的结果类似如下:
要启用此转换,您必须将 table.expand.json.payload
设置为 true,并使用类似如下的 JsonConverter
:
transforms=outbox,... transforms.outbox.type=io.debezium.transforms.outbox.EventRouter transforms.outbox.table.expand.json.payload=true value.converter=org.apache.kafka.connect.json.JsonConverter
transforms=outbox,...
transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
transforms.outbox.table.expand.json.payload=true
value.converter=org.apache.kafka.connect.json.JsonConverter
12.7.8. 配置开箱即用事件路由器转换的选项 复制链接链接已复制到粘贴板!
下表描述了您可以为 outbox 事件路由器 SMT 指定的选项。在表中,Group 列表示 Kafka 的配置选项分类。
选项 | 默认 | 组 | 描述 |
---|---|---|---|
| 表 |
决定在 outbox 表中存在
开箱即用表中的所有更改都应该是 | |
| 表 |
指定包含唯一事件 ID 的 outbox 表列。此 ID 将存储在 | |
| 表 | 指定包含事件键的 outbox 表列。当此列包含一个值时,SMT 将该值用作发出的 outbox 消息中的键。这对于在 Kafka 分区中维护正确顺序非常重要。 | |
表 | 默认情况下,发出的 outbox 消息的时间戳是 Debezium 事件时间戳。要在开箱即用消息中使用不同的时间戳,请将此选项设置为 outbox 表列,其中包含您要发出的时间戳。 | ||
| 表 | 指定包含事件有效负载的 outbox 表列。 | |
| 表 |
指定是否应进行 String 有效负载的 JSON 扩展。如果没有找到内容,或者在解析错误时保存内容,则内容将保持不变。 | |
| 表 |
启用 JSON 扩展属性
| |
表,Envelope | 指定您要添加到 outbox 消息标头或 envelopes 的一个或多个 outbox 表列。指定以逗号分隔的对列表。在每个对中,指定列的名称以及是否希望该值位于标头还是 envelope 中。使用冒号分隔对中的值,例如:
要为列指定一个别名,请使用别名指定为第三个值,例如:
第二个值是放置,它必须始终是 | ||
表,Schema | 设置后,这个值将用作 schema 版本,如 Kafka Connect Schema Javadoc 所述。 | ||
| 路由器 | 指定 outbox 表中列的名称。默认行为是此列中的值成为连接器向其发出外部消息的主题名称的一部分。示例位于 预期 outbox 表的描述 中。 | |
| 路由器 |
指定 outbox SMT 在 RegexRouter 中应用到 outbox 表记录的正则表达式。这个正则表达式是 | |
| 路由器 |
指定连接器向其发送消息的主题名称。默认主题名称为
| |
| 路由器 |
指明空还是 |
12.8. 配置 Debezium MongoDB 连接器以使用 outbox 模式 复制链接链接已复制到粘贴板!
此 SMT 仅用于 Debezium MongoDB 连接器。有关将 outbox 事件路由器 SMT 用于关系数据库的详情,请参考 Outbox 事件路由器。
开箱即用模式是一种在多个(micro)服务间安全、可靠地交换数据的方法。开箱即用模式实施可避免服务内部状态(通常在其数据库中保留)和状态,以及需要相同数据的服务所消耗的事件的状态。
要在 Debezium 应用程序中实施 outbox 模式,请将 Debezium 连接器配置为:
- 捕获 outbox 集合中的更改
- 应用 Debezium MongoDB outbox 事件路由器单消息转换(SMT)
配置为应用 MongoDB outbox SMT 的 Debezium 连接器应该只捕获在 outbox 集合中发生的更改。如需更多信息,请参阅有 选择应用转换的选项。
只有每个 outbox 集合具有相同的结构时,连接器才能捕获多个 outbox 集合中的更改。
要使用此 SMT,必须作为多文档事务的一部分(从 MongoDB 4.0 开始),对实际业务集合和插入到 outbox 集合中的操作作为多文档事务的一部分完成,以防止业务集合和 outbox 集合之间的潜在的数据不一致。对于将来的更新,要更新现有数据并在 ACID 事务中没有多文档事务的情况下插入现有数据,我们计划支持以现有集合的子文档而不是独立集合的形式存储外部事件的额外配置。
有关 outbox 模式的更多信息,请参阅使用 Outbox 模式的可靠的交换数据交换。
以下主题提供详情:
12.8.1. Debezium MongoDB outbox 消息示例 复制链接链接已复制到粘贴板!
要了解如何配置 Debezium MongoDB outbox 事件路由器 SMT,请考虑以下 Debezium outbox 信息示例:
被配置为应用 MongoDB outbox 事件路由器 SMT 的 Debezium 连接器通过转换原始 Debezium 更改事件信息来生成前面的消息,如下例所示:
这个 Debezium outbox 消息示例基于 默认的 outbox 事件路由器配置,它假定一个基于聚合的集合结构和事件路由。要自定义行为,outbox 事件路由器 SMT 提供了大量 配置选项。
要应用默认的 MongoDB outbox 事件路由器 SMT 配置,假设您的 outbox 集合具有以下字段:
字段 | 效果 |
---|---|
|
包含事件的唯一 ID。在 outbox 消息中,这个值是一个标头。您可以使用此 ID 删除重复的消息。 |
|
包含 SMT 附加到主题名称中的值,连接器向这个主题发出一个 outbox 信息。默认行为是,这个值替换了 |
|
包含 event 键,它为有效负载提供 ID。SMT 使用这个值作为发送的 outbox 消息中的键。这对于在 Kafka 分区中维护正确顺序非常重要。 |
|
开箱即用更改事件的表示。默认结构为 JSON。默认情况下,Kafka message 值仅由 |
其他自定义字段 |
outbox 集合中的任何其他字段都可以 添加到 payload 部分中或作为消息标头的 outbox 事件中。 |
12.8.3. 基本 Debezium MongoDB outbox 事件路由器 SMT 配置 复制链接链接已复制到粘贴板!
要配置 Debezium MongoDB 连接器来支持 outbox 模式,请配置 outbox.MongoEventRouter
SMT。要获取 SMT 的默认行为,请将其添加到连接器配置中,而不指定任何选项,如下例所示:
transforms=outbox,... transforms.outbox.type=io.debezium.connector.mongodb.transforms.outbox.MongoEventRouter
transforms=outbox,...
transforms.outbox.type=io.debezium.connector.mongodb.transforms.outbox.MongoEventRouter
自定义配置
连接器可能会发出多种类型的事件信息(如心跳消息、tombstone 消息或有关事务的元数据消息)。要将转换应用到源自在 outbox 集合中的事件,请定义一个 SMT predicate 语句,用于选择性地将转换应用到 这些事件。
12.8.4. 用于有选择地应用 MongoDB outbox 事件路由器转换的选项 复制链接链接已复制到粘贴板!
除了 Debezium 连接器在发生数据库更改时发出的更改事件消息外,连接器还会发出其他类型的消息,包括心跳消息以及有关架构更改和事务的元数据消息。由于这些消息的结构与 SMT 旨在处理的更改事件消息的结构不同,因此最好将连接器配置为有选择地应用 SMT,以便它只处理预期的数据更改消息。您可以使用以下方法之一将连接器配置为有选择地应用 SMT:
- 为转换配置 SMT predicate。
-
将
route.topic.regex
配置选项用于 SMT。
12.8.5. 在 Debezium MongoDB outbox 消息中使用 Avro 作为有效负载格式 复制链接链接已复制到粘贴板!
MongoDB outbox 事件路由器 SMT 支持任意有效负载格式。outbox 集合中的 payload
字段值以透明方式传递。使用 JSON 的替代方案是使用 Avro。这对消息格式监管非常有用,并确保外部事件模式以向后兼容的方式演进。
源应用程序如何为开箱即用消息有效负载生成 Avro 格式的内容不在本文档范围内。一种可能是利用 KafkaAvroSerializer
类来序列化 GenericRecord
实例。要确保 Kafka message 值是确切的 Avro 二进制数据,请将以下配置应用到连接器:
transforms=outbox,... transforms.outbox.type=io.debezium.connector.mongodb.transforms.outbox.MongoEventRouter value.converter=io.debezium.converters.ByteArrayConverter
transforms=outbox,...
transforms.outbox.type=io.debezium.connector.mongodb.transforms.outbox.MongoEventRouter
value.converter=io.debezium.converters.ByteArrayConverter
默认情况下,有效负载
字段值( Avro 数据)是唯一消息值。将 ByteArrayConverter
配置为值转换器会将 payload
字段值按原样传播到 Kafka 消息值。
请注意,这与为其他 SMT 推荐的 BinaryDataConverter
不同。这是因为 MongoDB 在内部存储字节阵列的方法不同。
Debezium 连接器可以配置为发出心跳、事务元数据或模式更改事件(根据连接器而异)。这些事件不能由 ByteArrayConverter
序列化,因此必须提供额外的配置,以便转换器了解如何序列化这些事件。例如,以下配置演示了使用没有模式的 Apache Kafka JsonConverter
:
transforms=outbox,... transforms.outbox.type=io.debezium.connector.mongodb.transforms.outbox.MongoEventRouter value.converter=io.debezium.converters.ByteArrayConverter value.converter.delegate.converter.type=org.apache.kafka.connect.json.JsonConverter value.converter.delegate.converter.type.schemas.enable=false
transforms=outbox,...
transforms.outbox.type=io.debezium.connector.mongodb.transforms.outbox.MongoEventRouter
value.converter=io.debezium.converters.ByteArrayConverter
value.converter.delegate.converter.type=org.apache.kafka.connect.json.JsonConverter
value.converter.delegate.converter.type.schemas.enable=false
delegate Converter
实现由 delegate.converter.type
选项指定。如果转换器需要额外的配置选项,也可以指定它们,如上述模式的禁用使用 schemas.enable=false
。
12.8.6. 在 Debezium MongoDB outbox 信息中记录其他字段 复制链接链接已复制到粘贴板!
您的 outbox 集合可能会包含您要添加到发出的消息中的值。例如,假设在 aggregatetype
字段中具有 product -order
值的 outbox 集合,另一个字段 eventType
,其可能的值是 order-created
和 order-shipped
。可以使用语法 字段添加其他字段:placement:alias
。
放置
允许的值是: - header
- envelope
- partition
要在 outbox 消息标头中发出 eventType
字段值,请配置 SMT,如下所示:
transforms=outbox,... transforms.outbox.type=io.debezium.transforms.outbox.EventRouter transforms.outbox.collection.fields.additional.placement=eventType:header:type
transforms=outbox,...
transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
transforms.outbox.collection.fields.additional.placement=eventType:header:type
结果将是 Kafka 消息的标头,其 type
作为其键,eventType
字段的值作为其值。
要在 outbox message envelope 中发出 eventType
字段值,请配置 SMT,如下所示:
transforms=outbox,... transforms.outbox.type=io.debezium.transforms.outbox.EventRouter transforms.outbox.collection.fields.additional.placement=eventType:envelope:type
transforms=outbox,...
transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
transforms.outbox.collection.fields.additional.placement=eventType:envelope:type
要控制生成 outbox 信息的分区,请配置 SMT,如下所示:
transforms=outbox,... transforms.outbox.type=io.debezium.transforms.outbox.EventRouter transforms.outbox.collection.fields.additional.placement=partitionField:partition
transforms=outbox,...
transforms.outbox.type=io.debezium.transforms.outbox.EventRouter
transforms.outbox.collection.fields.additional.placement=partitionField:partition
请注意,对于 分区
放置,添加别名将无效。
12.8.7. 将转义的 JSON 字符串扩展为 JSON 复制链接链接已复制到粘贴板!
默认情况下,Debebe outbox 消息 的有效负载
表示为字符串。当字符串的原始源采用 JSON 格式时,生成的 Kafka 消息使用转义序列来表示字符串,如下例所示:
您可以配置 outbox 事件路由器来扩展消息内容,将转义的 JSON 转换为其原始未转义的 JSON 格式。在转换的字符串中,companion 模式从原始 JSON 文档中分离。以下示例显示了生成的 Kafka 信息中展开的 JSON:
要在转换中启用字符串转换,请将 collection.expand.json.payload
的值设置为 true
,并使用 StringConverter
,如下例所示:
transforms=outbox,... transforms.outbox.type=io.debezium.connector.mongodb.transforms.outbox.MongoEventRouter transforms.outbox.collection.expand.json.payload=true value.converter=org.apache.kafka.connect.storage.StringConverter
transforms=outbox,...
transforms.outbox.type=io.debezium.connector.mongodb.transforms.outbox.MongoEventRouter
transforms.outbox.collection.expand.json.payload=true
value.converter=org.apache.kafka.connect.storage.StringConverter
12.8.8. 配置开箱即用事件路由器转换的选项 复制链接链接已复制到粘贴板!
下表描述了您可以为 outbox 事件路由器 SMT 指定的选项。在表中,Group 列表示 Kafka 的配置选项分类。
选项 | 默认 | 组 | 描述 |
---|---|---|---|
| 集合 | 决定在 outbox 集合上有更新操作时 SMT 的行为。可能的设置有:
开箱即用集合中的所有更改都应该是插入或删除操作。也就是说,一个 outbox 集合的功能是队列;不允许对 outbox 集合中的文档进行更新。SMT 会在开箱即用的集合中自动过滤删除删除操作(用于删除继续的事件)。 | |
| 集合 |
指定包含唯一事件 ID 的 outbox 集合字段。此 ID 将存储在 | |
| 集合 | 指定包含事件键的 outbox 集合字段。当此字段包含一个值时,SMT 将该值用作发出的 outbox 消息中的键。这对于在 Kafka 分区中维护正确顺序非常重要。 | |
集合 | 默认情况下,发出的 outbox 消息的时间戳是 Debezium 事件时间戳。要在开箱即用消息中使用不同的时间戳,请将此选项设置为 outbox collection 字段,其中包含您要发出的时间戳信息。 | ||
| 集合 | 指定包含事件有效负载的 outbox 集合字段。 | |
| 集合 |
指定是否应进行 String 有效负载的 JSON 扩展。如果没有找到内容,或者在解析错误时保存内容,则内容将保持不变。 | |
集合,Envelope | 指定您要添加到 outbox 消息标头或 envelopes 的一个或多个 outbox 集合字段。指定以逗号分隔的对列表。在每个对中,指定一个字段的名称,以及是否希望该值位于标头还是 envelope 中。使用冒号分隔对中的值,例如:
要为字段指定一个别名,请使用别名指定一个 trio 作为第三个值,例如:
第二个值是放置,它必须始终是 | ||
集合,Schema | 设置后,这个值将用作 schema 版本,如 Kafka Connect Schema Javadoc 所述。 | ||
| 路由器 | 指定 outbox 集合中字段的名称。默认情况下,此字段指定的值将成为连接器向其发出外部消息的主题名称的一部分。例如,请参阅 预期 outbox 集合的描述。 | |
| 路由器 |
指定 outbox SMT 在 RegexRouter 中应用到 outbox 集合文档中的正则表达式。这个正则表达式是
+ 默认行为是 SMT 将 | |
| 路由器 |
指定连接器向其发送消息的主题名称。默认主题名称为
+ 要更改主题名称,您可以:
| |
| 路由器 |
指明空还是 |
第 13 章 开发 Debezium 自定义数据类型转换器 复制链接链接已复制到粘贴板!
使用自定义开发的转换器只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的更多信息,请参阅 https://access.redhat.com/support/offerings/techpreview。
Debezium 更改事件记录中的每个字段代表源表或数据收集中的字段或列。当连接器向 Kafka 发出更改事件记录时,它会将源中的每个字段的数据类型转换为 Kafka Connect 模式类型。列值同样转换,以匹配目的地字段的 schema 类型。对于每个连接器,默认映射指定连接器如何转换每个数据类型。这些默认映射在每种连接器的数据类型文档中描述。
虽然默认映射通常足够了,但对于某些应用程序,您可能需要应用备用映射。例如,如果默认映射从 UNIX 时以毫秒格式导出列,但您的下游应用程序只能使用格式字符串来使用列值。您可以通过开发和部署自定义转换器来自定义数据类型映射。您可以将自定义转换器配置为对特定类型的所有列执行操作,或者您可以缩小其范围,以便它们只应用到特定的表列。converter 函数截获任何符合指定条件的列的数据类型转换请求,然后执行指定的转换。converter 忽略与指定条件不匹配的列。
自定义转换器是实施 Debezium 服务提供商接口(SPI)的 Java 类。您可以通过在连接器配置中设置 converters
属性来启用和配置自定义转换器。converters
属性指定连接器可用的转换器,并可包含进一步修改转换行为的子属性。
启动连接器后,连接器配置中启用的转换器会被实例化并添加到 registry 中。registry 将每个转换器与列或字段相关联。每当 Debezium 处理新的更改事件时,它会调用配置的转换器来转换它注册的列或字段。
13.1. 创建 Debezium 自定义数据类型转换器 复制链接链接已复制到粘贴板!
以下示例显示了实现接口 io.debezium.spi.converter.CustomConverter
的 Java 类的转换器实现:
自定义转换器方法
CustomConverter
接口的实现必须包括以下方法:
configure()
将连接器配置中指定的属性传递给转换器实例。
配置
方法在连接器初始化时运行。您可以将转换器与多个连接器搭配使用,并根据连接器的属性设置修改其行为。配置
方法接受以下参数:props
- 包含传递给转换器实例的属性。每个属性指定转换特定类型的列值的格式。
converterFor()
注册转换器来处理数据源中的特定列或字段。Debezium 调用
converterFor ()
方法,以提示转换器来调用转换的注册
。converterFor
方法为每个列运行一次。
方法接受以下参数:field
- 一个对象,用于传递处理字段或列的元数据。列元数据可以包含列或字段的名称、表或集合的名称、数据类型、大小等。
注册
-
一个类型为
io.debezium.spi.converter.CustomConverter.ConverterRegistration
的对象,它提供目标架构定义以及转换列数据的代码。当源列与转换器应该处理的类型匹配时,转换器会调用注册
参数。调用寄存器
方法来定义 schema 中每个列的转换器。模式使用 Kafka ConnectSchemaBuilder
API 代表。
13.1.1. Debezium 自定义转换器示例 复制链接链接已复制到粘贴板!
以下示例实现了一个简单的转换器,它执行以下操作:
-
运行
configure
方法,它根据连接器配置中指定的schema.name
属性的值配置转换器。转换器配置特定于每个实例。 运行
converterFor
方法,它将注册转换器来处理数据类型设置为isbn
的源列中的值。-
根据为
schema.name
属性指定的值来识别目标STRING
模式。 -
将源栏中的 ISBN 数据转换为
String
值。
-
根据为
例 13.1. 一个简单的自定义转换器
13.1.2. Debezium 和 Kafka Connect API 模块依赖项 复制链接链接已复制到粘贴板!
自定义转换器 Java 项目已编译 Debezium API 和 Kafka Connect API 库模块的依赖关系。这些编译依赖关系必须包含在项目的 pom.xml
中,如下例所示:
13.2. 使用带有 Debezium 连接器的自定义转换器 复制链接链接已复制到粘贴板!
自定义转换器对源表中的特定列或列类型执行操作,以指定如何将源中的数据类型转换为 Kafka Connect 模式类型。要将自定义转换器与连接器搭配使用,您需要部署 converter JAR 文件以及连接器文件,然后将连接器配置为使用转换器。
13.2.1. 部署自定义转换器 复制链接链接已复制到粘贴板!
先决条件
- 您有一个自定义转换器 Java 程序。
流程
-
要将自定义转换器与 Debezium 连接器搭配使用,请将 Java 项目导出到 JAR 文件,并将文件复制到包含您要与之搭配使用的每个 Debezium 连接器的 JAR 文件的目录中。
例如,在典型的部署中,Debezium 连接器文件存储在 Kafka Connect 目录的子目录中(/kafka/connect
),每个连接器 JAR 位于其自己的子目录中(/kafka/connect/debezium-connector-db
2、/kafka/connect/debezium-mysql
等)。要将转换器与连接器搭配使用,请将 converter JAR 文件添加到连接器的子目录。
要将转换器与多个连接器搭配使用,您必须将 converter JAR 文件的副本放在每个连接器子目录中。
13.2.2. 将连接器配置为使用自定义转换器 复制链接链接已复制到粘贴板!
要启用连接器使用自定义转换器,您可以在指定转换器名称和类的连接器配置中添加属性。如果转换器需要更多信息来自定义特定数据类型的格式,您也可以定义其他协调选项以提供该信息。
流程
通过在连接器配置中添加以下强制属性来为连接器实例启用转换器:
converters: <converterSymbolicName> <converterSymbolicName>.type: <fullyQualifiedConverterClassName>
converters: <converterSymbolicName>
1 <converterSymbolicName>.type: <fullyQualifiedConverterClassName>
2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow converters: isbn isbn.type: io.debezium.test.IsbnConverter
converters: isbn isbn.type: io.debezium.test.IsbnConverter
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要将其他属性与自定义转换器关联,请将属性名称与转换器的符号链接名称添加前缀,后跟点(
.
)。符号名称是您指定为converters
属性的值的标签。例如,要为上述isbn
converter 添加属性,以指定要传递给转换器代码中的configure
方法的schema.name
,请添加以下属性:isbn.schema.name: io.debezium.postgresql.type.Isbn
isbn.schema.name: io.debezium.postgresql.type.Isbn
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
更新于 2023-05-04