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

相关推荐
RussellFans1 分钟前
Linux 文本三剑客(grep, awk, sed)
linux·运维·服务器
吹牛不交税6 分钟前
sqlsugar WhereIF条件的大于等于和等于查出来的坑
数据库·mysql
猴哥聊项目管理10 分钟前
什么是DevOps智能平台的核心功能?
运维·项目管理·制造·devops·软件·项目管理软件·软件分享
Chuncheng's blog14 分钟前
CentOS 7如何编译安装升级gcc至7.5版本?
linux·运维·c++·centos
Theodore_102215 分钟前
大数据(1) 大数据概述
大数据·hadoop·数据分析·spark·hbase
Aurora_NeAr24 分钟前
Apache Spark详解
大数据·后端·spark
hshpy29 分钟前
setting up Activiti BPMN Workflow Engine with Spring Boot
数据库·spring boot·后端
aitav01 小时前
⚡️ Linux Docker 基本命令参数详解
linux·运维·docker
Nazi61 小时前
docker数据管理
运维·docker·容器
静水楼台x1 小时前
nginx日志的一点理解
运维·nginx