主题的路由
包含数据更改事件的每个Kafka记录都有一个默认的目标主题。如果你需要,你可以在记录到达Kafka Connect转换器之前将记录重新路由到你指定的主题。为此,Debezium提开云体育官方注册网址供了主题路由单消息转换(SMT)。在Debezium连接器的Kafka Connect配置中配置此转换。开云体育官方注册网址配置选项允许您指定以下内容:
用于标识要重新路由的记录的表达式
解析到目标主题的表达式
如何确保重新路由到目标主题的记录之间的唯一键
由您来确保转换配置提供您想要的行为。开云体育官方注册网址Debezium不验证转换配置产生的行为。
主题路由转换是一个Kafka连接SMT.
用例
默认行为是Debezium连接器将每个更改事件记录发送到一个主开云体育官方注册网址题,该主题的名称由数据库的名称和进行更改的表的名称组成。开云体育电动老虎机换句话说,一个主题接收一个物理表的记录。当您希望一个主题接收多个物理表的记录时,必须配置Debezium连接器以将记录重新路由到该主题。开云体育官方注册网址
逻辑表是将多个物理表的记录路由到一个主题的常见用例。在逻辑表中,有多个物理表,它们都具有相同的模式。例如,分片表具有相同的模式。逻辑表可能由两个或多个分片表组成:db_shard1.my_table
而且db_shard2.my_table
.这些表位于不同的碎片中,并且在物理上是不同的,但它们在一起形成了一个逻辑表。您可以将任何碎片中的表的更改事件记录重新路由到相同的主题。
当Debezium开云体育官方注册网址 PostgreSQL连接器捕获分区表中的更改时,默认行为是将更改事件记录路由到每个分区的不同主题。要将所有分区的记录发送到一个主题,请配置主题路由SMT。因为分区表中的每个键都保证是唯一的,所以配置key.enforce.uniqueness = false
使SMT不添加键字段,以确保键的唯一性。添加键字段是默认行为。
例子
要将多个物理表的更改事件记录路由到同一个主题,请在Debezium连接器的Kafka Connect配置中配置主题路由转换。开云体育官方注册网址主题路由SMT的配置要求您指定正则表达式,确定:
要为其路由记录的表。这些表必须都具有相同的模式。
目标主题名称。
例如,a中的配置. properties
文件是这样的:
transforms=Reroute transforms.Reroute.type=io.开云体育官方注册网址 debezum .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
-
指定应如何调整从结果主题名称派生的消息键模式名称,以与连接器使用的消息转换器兼容。取值为
没有一个
(默认)或avro
.
自定义可以定义的配置SMT谓词语句它指定希望转换处理或不处理的表。如果您将SMT配置为路由与正则表达式匹配的表,而不希望SMT重新路由与表达式匹配的特定表,则谓词可能很有用。
确保密钥唯一
De开云体育官方注册网址bezium更改事件键使用构成表主键的表列。要将多个物理表的记录路由到一个主题,事件键在所有这些表中必须是唯一的。但是,每个物理表都有一个主键,并且主键在该表中是唯一的。中的一行myserver.mydb.customers_shard1
表中的一行可能具有相同的键值myserver.mydb.customers_shard2
表格
为了确保每个事件键在变更事件记录进入相同主题的表中是唯一的,主题路由转换将一个字段插入到变更事件键中。缺省情况下,插入字段的名称为__dbz__physicalTableIdentifier
.插入字段的值是默认的目标主题名称。
如果需要,可以配置主题路由转换,将不同的字段插入到键中。要做到这一点,请指定key.field.name
选项,并将其设置为与现有主键字段名不冲突的字段名。例如:
transforms=Reroute transforms.Reroute.type=io.开云体育官方注册网址 debezum .transforms. bylogicaltablerouter transforms.Reroute.topic.regex=(.*)customers_shard(.*) transforms.Reroute.topic.replacement=$1customers_all_shardstransforms.Reroute.key.field.name=shard_id
此示例添加shard_id
字段转换为路由记录中的关键结构。
如果你想调整键的新字段的值,配置这两个选项:
-
key.field.regex
-
指定转换应用于默认目标主题名称的正则表达式,以捕获一组或多组字符。
-
key.field.replacement
-
指定一个正则表达式,用于根据捕获的组确定插入的关键字字段的值。
例如:
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
转换使用第二个捕获组中的值,即碎片号,作为键的新字段的值。在本例中,插入的键字段的值为1
,2
,或3.
.
如果您的表包含全局惟一的键,并且不需要更改键结构,则可以设置key.enforce.uniqueness
选项假
:
...transforms.Reroute.key.enforce。独特性= false……
选择性地应用主题路由转换的选项
除了发生数据库更改时Debezium连接器发出的更改事件消息外,连接器还发出其他类型的消息,包括开云体育官方注册网址心跳消息和关于模式更改和事务的元数据消息。开云体育电动老虎机因为这些其他消息的结构与SMT设计用来处理的更改事件消息的结构不同,所以最好将连接器配置为选择性地应用SMT,以便它只处理预期的数据更改消息。
您可以使用以下方法之一来配置连接器以选择性地应用SMT:
使用topic.regexSMT配置选项。
配置选项
下表描述了主题路由SMT配置选项。
选项 | 默认的 | 描述 |
---|---|---|
指定转换应用于每个更改事件记录的正则表达式,以确定是否应将其路由到特定主题。 |
||
指定表示目标主题名称的正则表达式。转换将每个匹配的记录路由到此表达式标识的主题。此表达式可以引用由指定的正则表达式捕获的组 |
||
|
指示是否向记录的更改事件键添加字段。添加键字段可以确保每个事件键在表中都是唯一的,这些表的更改事件记录都是相同的主题。这有助于防止具有相同键但起源于不同源表的记录的更改事件冲突。 |
|
|
要添加到更改事件键的字段的名称。该字段的值标识原来的表名。为了让SMT添加这个字段, |
|
指定转换应用于默认目标主题名称的正则表达式,以捕获一组或多组字符。为了让SMT应用这个表达式, |
||
指定正则表达式,用于根据指定的表达式捕获的组确定插入的关键字字段的值 |
||
没有一个 |
指定如何调整从结果主题名称派生的消息键模式名称,以与连接器使用的消息转换器兼容,包括: |
|
|
用于保存LRUCache中最大条目的大小。缓存将保存逻辑表键和值的旧/新模式,还将缓存派生键和主题正则表达式结果,以改进源记录转换。 |