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 示例存储库中找到示例。

相关推荐
Arenaschi4 分钟前
在Tomcat中部署应用时,如何通过域名访问而不加端口号
运维·服务器
waicsdn_haha12 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
蜜獾云38 分钟前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
小屁不止是运维39 分钟前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
Hacker_Oldv43 分钟前
WPS 认证机制
运维·服务器·wps
bitcsljl1 小时前
Linux 命令行快捷键
linux·运维·服务器
ac.char1 小时前
在 Ubuntu 下使用 Tauri 打包 EXE 应用
linux·运维·ubuntu
Mr.131 小时前
数据库的三范式是什么?
数据库
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架