【问题标题】:Debezium connector with TimescaleDB extension带有 TimescaleDB 扩展的 Debezium 连接器
【发布时间】: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"
    }
}

提前谢谢!

【问题讨论】:

    标签: postgresql apache-kafka apache-kafka-connect debezium timescaledb


    【解决方案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
      猜你喜欢
      • 2021-12-28
      • 2018-09-10
      • 2014-10-10
      • 2019-07-22
      • 2021-09-03
      • 2020-09-22
      • 2021-07-24
      • 2019-10-20
      • 2019-10-18
      相关资源
      最近更新 更多