使用debezium、kafka-connect将postgres数据实时同步到kafka中,表topic重新路由

在很多场景下,需要将数据同步其他数据源进行计算,本文介绍通过debezium和kafka-connect将postgres数据同步到kafka中。

首先下载debezium,官网地址: https://debezium.io/
目前稳定版本是1.9.5,这是postgres对应的kafka-connect插件下载地址:

debezium-connector-postgres-1.9.5.Final-plugin.tar.gz

然后再kafka的目录下,新建一个plugins目录,将下载的包解压到这个目录:
在这里插入图片描述
然后我们配置kafka-coinect,我们这里以集群模式为例:

 vim config/connect-distributed.properties
 

主要调整如下几个地方:

# kafka集群地址
bootstrap.servers=node1:9092,node2:9092,node3:9092
# kafka-connect插件位置
plugin.path=/data1/service/kafka-2.7.2/plugins
#可以适当调整下面这个值,默认是 10000
offset.flush.timeout.ms=100000

然后我们就可以启动kafka-connect:

bin/connect-distributed.sh -daemon config/connect-distributed.properties

到这里,kafka-connect,就启动了起来。
kafka-connect提供了http restfule的接口供我们取操作,默认的端口地址是8083,常见如下:

GET /connector-plugins获取当前所有插件名称
GET /connectors获取当前所有connector
POST /connector添加一个connector
GET /connectors/{name}获取指定的connector的信息
GET /connectors/{name}/config获取指定的connector的配置信息
PUT /connectors/{name}/config更新connector的配置
GET /connectors/{name}/status获取指定connector的装填
GET /connectors/{name}/tasks/获取指定connector正在运行的task
GET /connectors/{name}/tasks/tasks/{taskid}/status获取connector的task状态信息
PUT /connectors/{name}/pause暂停connector和他运行task
POST /connectors/{name}/restart重启connector
POST /connectors/{name}/tasks/{taskid}/restart重启一个connector的task
DELETE /connectors/.{name}删除一个connector,停止关联的task并删除配置

在psotgres数据库侧,我们需要调整一下参数:

wal_level = logical
max_wal_senders = 2000
max_replication_slots = 2000
#下面两个参数可以根据需要调整
wal_sender_timeout = 60s
wal_receiver_timeout = 60s

配置完之后需要重启。
另外一点,如果PG版本比较老的话,需要装

  • decoderbufs(由Debezium社区维护,基于ProtoBuf)
  • wal2json(由wal2json社区维护,基于JSON)

而在PG10+默认自带pgoutput可以不用安装,我这里的是基于PG12,所以不用安装。

到这里所有准备工作就做好了,接下来就是想kafka-connect中添加connector了:

{
    "name": "prod-material-642",
    "config": {
        "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
        "database.dbname": "ad_dissectorprofile_000642",
        "database.user": "postgres",
        "slot.name": "prodmaterial642",
        "tasks.max": "1",
        "database.hostname": "localhost",
        "database.password": "postgres",
        "name": "prod-material-642",
        "database.server.name": "prod-material-642",
        "database.port": "5432",
        "plugin.name": "pgoutput",
        "table.whitelist": "public.ad_entity,public.campaign,public.media_entity,public.url_scheme,public.schedule_entity"
    }
}

这里添加完之后,我们可以查看天剑的connector和其对应的任务,然后再kafka中,会生成如下几个topic:

prod-material-642.public.ad_entity
prod-material-642.public.campaign
prod-material-642.public.media_entity
prod-material-642.public.schedule_entity
prod-material-642.public.url_scheme

而写入到topic中的数据内容大致如下:

{
    "before":null,
    "after": {
        "pk":"1",
        "value":"New data"
    },
    "source": {
        ...
        "snapshot":"incremental" 
    },
    "op":"r", 
    "ts_ms":"1620393591654",
    "transaction":null
}

如果需要详细内容,可以看下debezium官网上对于postgres同步的详细介绍:

Debezium connector for PostgreSQL

后续我们就可以消费对应的topic来进行相关的数据同步处理即可

另外,需要注意的是,默认情况下,这里debezium是针对每个库、每个schema、每个表都生成一个topic,如果表比较多,那么topic数量将会特别多,为此debezium可以对写入的topic进行重新路由:

{
    "name": "prod-material-642",
    "config": {
        "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
        "database.dbname": "ad_dissectorprofile_000642",
        "database.user": "postgres",
        "slot.name": "prodmaterial642",
        "tasks.max": "1",
        "database.hostname": "localhost",
        "database.password": "postgres",
        "name": "prod-material-642",
        "database.server.name": "prod-material-642",
        "database.port": "5432",
        "plugin.name": "pgoutput",
        "table.whitelist": "public.ad_entity,public.campaign,public.media_entity,public.url_scheme,public.schedule_entity",
         "transforms": "Combine",
        "transforms.Combine.type": "io.debezium.transforms.ByLogicalTableRouter",
        "transforms.Combine.topic.regex": "(.*)",
        "transforms.Combine.topic.replacement": "prod-material-sync"
    }
}

如上,这样会将所有的同步数据都写入到prod-material-sync这一个topic中去。详细可以参考官网:
topic-routing

Debezium 是一个开源的分布式平台,用于捕获数据库中的数据更改。它基于 Apache Kafka,并利用 Kafka 的流处理能力来实现对数据库中数据变更的实时同步使用 Debezium 可以将 PostgreSQL 数据库中的数据变更(如插入、更新和删除操作)捕获并发送到 Kafka 中,从而实现与 Kafka数据同步。 ### 安装和配置 Debezium 1. **安装 Kafka 和 ZooKeeper** 首先需要安装并运行 Kafka 和 ZooKeeper,因为 Debezium 依赖于它们来进行消息传递和协调。 ```bash # 下载 Kafka 并解压 wget https://downloads.apache.org/kafka/3.0.0/kafka_2.13-3.0.0.tgz tar -xzf kafka_2.13-3.0.0.tgz cd kafka_2.13-3.0.0 # 启动 ZooKeeper bin/zookeeper-server-start.sh config/zookeeper.properties # 启动 Kafka bin/kafka-server-start.sh config/server.properties ``` 2. **安装 Debezium Kafka Connect 插件** Debezium 提供了一个 Kafka Connect 插件,用于连接 PostgreSQL 数据库并捕获数据变更。可以从 [Debezium 官方网站](https://debezium.io/)下载适用于 PostgreSQL 的插件。 下载后,将其解压并将插件目录添加到 Kafka Connect 的插件路径中。 3. **启动 Kafka Connect** Kafka ConnectKafka 提供的一个工具,用于在 Kafka 和其他系统之间进行大规模的数据传输。可以通过以下命令启动 Kafka Connect: ```bash bin/connect-distributed.sh config/connect-distributed.properties ``` 4. **创建 PostgreSQL 连接器配置文件** 创建一个 JSON 文件(例如 `debezium-postgres.json`),其中包含 PostgreSQL 数据库的连接信息以及 Debezium 的相关配置。 ```json { "name": "debezium-postgres-connector", "config": { "connector.class": "io.debezium.connector.postgresql.PostgresConnector", "database.hostname": "localhost", "database.port": "5432", "database.user": "postgres", "database.password": "dbpassword", "database.dbname": "testdb", "database.server.name": "inventory-server", "database.schema.include.list": "public", "table.include.list": "public.inventory", "database.connection.adapter": "postgresql", "database.ssl.mode": "require", "plugin.name": "pgoutput" } } ``` 5. **注册 PostgreSQL 连接器** 使用 Kafka Connect 的 REST API 注册 PostgreSQL 连接器。 ```bash curl -X POST -H "Content-Type: application/json" --data @debezium-postgres.json http://localhost:8083/connectors ``` 6. **验证数据同步** 可以通过 Kafka 消费者订阅相应的主题来验证数据是否成功同步。 ```bash bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic dbserver1.public.inventory --from-beginning ``` ### 数据同步的工作原理 Debezium 利用 PostgreSQL 的逻辑复制功能(Logical Replication)来捕获数据变更[^1]。PostgreSQL 在 9.4 版本之后引入了逻辑解码(Logical Decoding),允许从 WAL(Write-Ahead Log)中提取逻辑更改。Debezium 使用 `pgoutput` 插件作为逻辑解码的输出插件,将数据变更转换为 Kafka 可以理解的格式,并发布到 Kafka 主题中。 ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值