带有 TimescaleDB 扩展的 Debezium 连接器
Posted
技术标签:
【中文标题】带有 TimescaleDB 扩展的 Debezium 连接器【英文标题】:Debezium connector with TimescaleDB extension 【发布时间】:2021-05-03 13:14:13 【问题描述】:我在检测 Postresql 超表(TimescaleDB 扩展)上的更改时遇到问题。
设置:
我安装了带有 TimescaleDB(ver 1.7.1) 扩展的 Postresql(ver 11.10)。 我有 2 个表,我想使用安装在 Kafka Connect 上的 Debezium(ver 1.3.1)连接器来监控它们,用于 CDC(捕获数据更改)。
表是 table1 和 table2hyper,但 table2hyper 是超表。
在 Kafka Connect 中创建 Debezium 连接器后,我可以看到创建了 2 个主题(每个表一个):
(A) kconnect.public.table1 (B) kconnect.public.table2hyper当使用 kafka-console-consumer 为主题 A 消费消息时,我可以在 table1 中看到行更新后的消息。
但是当使用来自主题 B(table2hyper 表更改)的消息时,例如 table2hyper 表中的行更新之后不会发出任何内容。
最初 Debezium 连接器对 table2hyper 表中的行进行快照并将它们发送到主题 B(使用 kafka-console-consumer 时我可以看到主题 B 中的消息),但是我在初始快照之后所做的更改不会发出.
为什么我无法从 table2hyper 看到后续更改(在初始快照之后)?
连接器创建负载:
"name": "alarm-table-connector7",
"config":
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
"tasks.max": "1",
"database.hostname": "xxx",
"database.port": "5432",
"database.user": "xxx",
"database.password": "xxx",
"database.dbname": "xxx",
"database.server.name": "kconnect",
"database.whitelist": "public.dev_db",
"table.include.list": "public.table1, public.table2hyper",
"plugin.name": "pgoutput",
"tombstones.on.delete":"true",
"slot.name": "slot3",
"transforms": "unwrap",
"transforms.unwrap.type":"io.debezium.transforms.ExtractNewRecordState",
"transforms.unwrap.drop.tombstones":"false",
"transforms.unwrap.delete.handling.mode":"rewrite",
"transforms.unwrap.add.fields":"table,lsn,op"
提前谢谢!
【问题讨论】:
【参考方案1】:尝试了一段时间后,我没有成功使用Debezium连接器从超表中流式传输数据。我使用的是 1.3.1 版。并升级到最新的 1.4.1。没有帮助。
不过,Confluent JDBC connector 确实成功了。
就我的研究和测试而言,这是结论,如有必要,请随时纠正我:
Debezium 在 INSERT、UPDATE 和 删除活动 Confluent 连接器仅捕获 INSERT 事件(除非您结合 一些用于检测变化的列)并适用于普通和 超级(TimescaleDB)表。【讨论】:
【参考方案2】:我们从未使用 TimescaleDB 测试过 Debezium。我建议您检查逻辑复制槽中是否存在 TimescaleDB 更新。如果是的话,让 Debezium 处理这些事件在技术上应该是可行的。如果没有,那根本不可能。
【讨论】:
在当前活动的复制槽上摆弄 pg_waldump 后,我发现 WAL 日志中存在更改。更新超表中的行列导致日志:... rmgr: Heap len (rec/tot): 262/ 7326, tx: 431132, lsn: 7/DF86DA70, prev 7/DF86DA38, desc: HOT_UPDATE off 31 xmax 431132 ; new off 32 xmax 0, blkref #0: rel 1663/100256/100315 blk 1 FPW ...
在列更新之后,*_lsn
列在使用select * from pg_replication_slots;
检查活动复制槽时增加了所以我想说 Debezium 没有选择超表更新。
如果你使用pg_recvlogical
工具你会看到什么?
首先我在 2 个表上创建了连接器。一个是超表,另一个不是。超表上的更新不会传播到主题。然后我删除了连接器并使用相同的复制槽“debezium3”和连接器创建的相同发布“dbz_publication”来获取数据。但是两个表的更新都没有给出任何输出。关于我做错了什么有什么建议吗? pg_recvlogical -d XXX -U YYY -W --slot debezium3 --start -o proto_version=1 -o publication_names=dbz_publication -P pgoutput -f -
如果没有 proto_version=1,它会说“但我们只支持协议 1 或更高版本”
这是更详细的输出link。 @JiriPechanec以上是关于带有 TimescaleDB 扩展的 Debezium 连接器的主要内容,如果未能解决你的问题,请参考以下文章
windows/linux 服务器 安装 TimescaleDB 时序数据库