Debezium发布历史93

原文地址: https://debezium.io/blog/2020/09/15/debezium-auto-create-topics/

欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.

自动创建 Debezium 更改数据主题

2020 年 9 月 15 日 作者: René Kerner

kafka 主题 生产 新闻 讨论

创建新主题/管道

当您使用分布式 Kafka Connect 时,您可能已经意识到,一旦启动 Kafka Connect,就已经为您创建了一些与 Kafka Connect 相关的内部主题:

$ kafka-topics.sh --bootstrap-server $HOSTNAME:9092 --list

connect_configs

connect_offsets

connect_statuses

Kafka Connect 会使用适合这些内部主题需求的合理、自定义的默认主题配置自动为您完成此操作。

当您启动 Debezium 连接器时,Kafka 代理将根据代理中的默认配置(可能是自定义配置)创建捕获事件的主题(如果auto.create.topics.enable = true在代理配置中启用):

auto.create.topics.enable = true

default.replication.factor = 1

num.partitions = 1

compression.type = producer

log.cleanup.policy = delete

log.retention.ms = 604800000 ## 7 days

但通常,当您在生产环境中使用 Debezium 和 Kafka 时,您可能会选择使用 禁用 Kafka 的主题自动创建功能auto.create.topics.enable = false,或者您希望连接器主题的配置与默认值不同。在这种情况下,您必须预先为 Debezium 捕获的数据源创建主题。

但有好消息!从 Kafka Connect 版本 2.6.0 开始,这可以自动化,因为实现了KIP-158以支持使用 Kafka Connect 创建可定制的主题。

卡夫卡连接

自 Kafka 2.6.0 起,Kafka Connect 就启用了主题创建:

topic.creation.enable = true

如果您不想允许连接器自动创建主题,您可以false在 Kafka Connect 配置中将此值设置为(connect-distributed.properties文件或在使用Debezium 的 Kafka Connect 容器映像时通过环境变量CONNECT_TOPIC_CREATION_ENABLE)。

更新连接器配置

Kafka Connect 主题创建适用于组。default当没有定义与主题匹配的其他组时,总会使用一个组。

每个组都可以指定主题配置属性的集合,以及配置应应用的主题名称的正则表达式列表。

您可以指定所有主题级别配置参数来自定义如何创建组的匹配主题。

让我们看看如何扩展此 Postgres 配置以创建 Kafka Connect 主题:

{

"name": "inventory-connector",

"config": {

"connector.class": "io.debezium.connector.postgresql.PostgresConnector",

"tasks.max": 1,

"database.hostname": "postgres",

"database.port": 5432,

"database.user": "postgres",

"database.password": "postgres",

"database.dbname" : "postgres",

"database.server.name": "dbserver1",

"schema.include.list": "inventory"

}

}

默认配置

所有与其他组不匹配的主题都topic.creation将应用default组配置。

默认情况下replication.factor = 3,我们希望partitions = 10主题应该使用 key 进行压缩cleanup.policy = "compact",并且所有消息都应该使用 LZ4 压缩在硬盘上compression.type = "lz4"。

所以我们配置默认组:

{

"name": "inventory-connector",

"config": {

"connector.class": "io.debezium.connector.postgresql.PostgresConnector",

"tasks.max": 1,

"database.hostname": "postgres",

"database.port": 5432,

"database.user": "postgres",

"database.password": "postgres",

"database.dbname" : "postgres",

"database.server.name": "dbserver1",

"schema.include.list": "inventory",

    "topic.creation.default.replication.factor": 3,
    "topic.creation.default.partitions": 10,
    "topic.creation.default.cleanup.policy": "compact",
    "topic.creation.default.compression.type": "lz4"
}

}

产品日志配置

在数据库inventory模式中,存在product以表名开头的表。

默认情况下,完全限定的表名称将被捕获到与 Debezium 具有相同名称的主题,例如模式products中的表将被捕获到主题。inventorydbserver1dbserver1.inventory.products

我们希望所有转到表名以 开头的主题的消息product都存储在保留时间为 3 个月/90 天的主题中,并带有cleanup.policy": "delete"和retention.ms = 7776000000、replication.factor = 1、partitions = 20,并且仅使用生产者使用的压缩格式compression.type": "producer"。

您可以省略与集群默认值匹配的属性,但要小心,一旦更改 Kafka 代理上的默认配置,生成的主题配置可能会有所不同!

首先我们需要productlog使用该topic.creation.groups属性注册一个组。

然后我们可以定义该组中应包含哪些主题名称,并指定组的配置,就像我们对default组所做的那样:

{

"name": "inventory-connector",

"config": {

"connector.class": "io.debezium.connector.postgresql.PostgresConnector",

"tasks.max": 1,

"database.hostname": "postgres",

"database.port": 5432,

"database.user": "postgres",

"database.password": "postgres",

"database.dbname" : "postgres",

"database.server.name": "dbserver1",

"schema.include.list": "inventory",

"topic.creation.default.replication.factor": 3,

"topic.creation.default.partitions": 10,

"topic.creation.default.cleanup.policy": "compact",

"topic.creation.default.compression.type": "lz4",

    "topic.creation.groups": "productlog",  

    "topic.creation.productlog.include": "dbserver1\\.inventory\\.product.*",  
    "topic.creation.productlog.replication.factor": 1,
    "topic.creation.productlog.partitions": 20,
    "topic.creation.productlog.cleanup.policy": "delete",
    "topic.creation.productlog.retention.ms": 7776000000,
    "topic.creation.productlog.compression.type": "producer"
}

}

表 1. 用于自定义自动主题创建的连接器配置

物品 描述

1

topic.creation.groups定义附加组名称的逗号分隔列表。这里我们只定义我们的productlog组。

2

该topic.creation.productlog.include字段包含以逗号分隔的正则表达式列表,这些正则表达式与productlog应应用组配置的主题名称相匹配。该productlog组匹配所有以 开头的主题dbserver1.inventory.product。

探索结果

当我们现在启动连接器并使用它kafka-topics.sh来查看主题是如何创建的时,我们可以看到所有内容都按定义工作:

the dbserver1.inventory.products topic has the config from the productlog group:

$ kafka-topics.sh --bootstrap-server $HOSTNAME:9092 --describe --topic dbserver1.inventory.products

Topic: dbserver1.inventory.products PartitionCount: 20 ReplicationFactor: 1

Configs: compression.type=producer,cleanup.policy=delete,retention.ms=7776000000,segment.bytes=1073741824

the dbserver1.inventory.orders topic has the config from the default group:

$ kafka-topics.sh --bootstrap-server $HOSTNAME:9092 --describe --topic dbserver1.inventory.orders

Topic: dbserver1.inventory.orders PartitionCount: 10 ReplicationFactor: 3

Configs: compression.type=lz4,cleanup.policy=compact,segment.bytes=1073741824,delete.retention.ms=2592000000

结论

在许多环境中,特别是在生产环境中,我们通常不希望在 Kafka 代理端启用主题自动创建,或者我们需要与默认主题配置不同的配置。

在 Kafka 2.6 之前,这只有在预先手动创建主题或通过某些自定义设置过程(可能在部署期间)时才可能实现。

自 Kafka 2.6 起,Kafka Connect 就为连接器主题提供了内置主题创建功能,本文介绍了如何将其与 Debezium 一起使用。

您可以在 GitHub 上的 Debezium 示例存储库中找到示例。

相关推荐
宅小海11 分钟前
scala String
大数据·开发语言·scala
朝九晚五ฺ12 分钟前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
小白的白是白痴的白12 分钟前
11.17 Scala练习:梦想清单管理
大数据
java1234_小锋28 分钟前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
Kkooe1 小时前
GitLab|数据迁移
运维·服务器·git
聂 可 以1 小时前
Windows环境安装MongoDB
数据库·mongodb
web前端神器1 小时前
mongodb多表查询,五个表查询
数据库·mongodb
门牙咬脆骨1 小时前
【Redis】redis缓存击穿,缓存雪崩,缓存穿透
数据库·redis·缓存
门牙咬脆骨1 小时前
【Redis】GEO数据结构
数据库·redis·缓存
wusong9992 小时前
mongoDB回顾笔记(一)
数据库·笔记·mongodb