Debezium 心跳动作未触发
Posted
技术标签:
【中文标题】Debezium 心跳动作未触发【英文标题】:Debezium Heartbeat Action not firing 【发布时间】:2021-05-13 08:28:02 【问题描述】:在使用 Debezium 和 Postgres 时,我们发现心跳似乎无法正常工作的问题。我们在目标数据库中创建了一个虚拟表,用于执行心跳操作,但我们从未看到该表中的数据有任何变化。
我们已启用心跳,因为我们看到它旨在解决相同的行为,即https://issues.redhat.com/browse/DBZ-1815。
我们正在使用 Postgres 12 和 Debezium 1.3(或 1.5,两者都进行了试验)
配置是
"name": "my-service-outbox",
"config":
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
"plugin.name":"pgoutput",
"database.hostname": "dbhostname",
"database.port": "5432",
"database.user": "user",
"database.password": "password",
"database.dbname" : "dbname",
"database.server.name": "dbservername",
"table.include.list": "public.outbox",
"publication.autocreate.mode" : "filtered",
"snapshot.mode":"exported",
"heartbeat.interval.ms": 1000,
"heartbeat.action.query" :"INSERT INTO public.heartbeat (id, ts) VALUES (1, NOW()) ON CONFLICT(id) DO UPDATE SET ts=EXCLUDED.ts;"
相关,但没有解决方案:https://***.com/a/60808620/97879
感觉就像我们错过了启用心跳的东西,但除了确保设置了间隔之外什么也没看到。
编辑:心跳正在工作,因为我们可以在心跳主题中看到消息。但是没有执行数据库操作。
有什么建议吗?
【问题讨论】:
【参考方案1】:文档中有一个零宽度空格,所以如果你复制它,字符串包含它,这意味着它不是 Debezium 期望的选项名称。
【讨论】:
澄清一下,零宽度空格在“heartbeat.action”之后(当您在编辑器/IDE 中使用光标单步执行属性名称时,您会注意到它,似乎多了一个步骤没有进展)。我们在文档中添加了它们,用于在小屏幕上包装长选项名称,假设它们不能复制/粘贴。看来我们错了。我们会解决这个问题,我已经为它登录了DBZ-3087。 好的,最初看起来并没有改变任何东西。一旦我手动重新输入并再次发布配置,似乎什么都没有改变。从心跳表中选择返回相同的静态时间。但是——在我的“table.include.list”中的表中添加了一些数据后,心跳开始工作。感谢您的帮助!【参考方案2】:我的心跳动作也不起作用,除非数据库中有动作,如果数据库中没有发生任何事情,除非我手动插入一些东西,否则心跳动作不会触发。这造成了麻烦,因为对于任何空/新数据库,心跳动作都不会触发
【讨论】:
【参考方案3】:heartbeat.action.query 似乎也不适合我。 如果表中没有数据流动,则 wal 由于其他数据库中的活动而不断增长。 heartbeat.action.query 应该可以解决这个问题,我不应该等待另一个条目进入我正在流式传输的表中,以减小 Wal 大小,但似乎并非如此。
【讨论】:
这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review 我想添加评论,但由于声誉低,所以不允许我添加评论【参考方案4】:找到了这个 google 小组讨论(https://groups.google.com/g/debezium/c/39mmGEHii_8),Gunnar 提到了这一点 -
核心心跳功能 [1] 定期向心跳主题发送消息,允许确认已处理的 WAL 偏移量,以防仅发生过滤表中的事件(这是您观察到的)。心跳操作查询 [2](需要表并包含在发布中)对于解决具有多个数据库的情况很有用,其中连接器从一个数据库接收更改,否则没有/低流量,在这种情况下再次允许确认偏移量。 ——贡纳尔 [1]https://debezium.io/documentation/reference/connectors/postgresql.html#postgresql-property-heartbeat-interval-ms [2]https://debezium.io/documentation/reference/connectors/postgresql.html#postgresql-property-heartbeat-action-query
在小组讨论中,他提到我们必须将此心跳表添加到发布中才能使此功能正常工作。这应该会有所帮助。
我会尝试并及时更新。
编辑:更新:
将心跳表添加到发布中。没有任何区别。此问题仍未解决。
【讨论】:
【参考方案5】:对于它的价值,我刚刚遇到了类似的问题,尽管我认为它与您的问题不完全相同,但我在这里发布以防它对任何人有用。简而言之,连接器状态为 RUNNING,连接日志(也没有 postgres 的日志)中没有错误,但心跳表为空 - 表明操作未触发。
在我的例子中,数据库模式似乎也是空的(它是一个新的 prod 数据库),但我仍然期待心跳操作能够触发。同一个数据库中不同模式的类似设置正在工作 - 表中有节拍,尽管在模式表中我无法判断。
我发现对于在心跳表中没有行的架构没有心跳主题(带有或不带有 debezium 前缀);一切看起来都很好。所以我只是尝试手动插入心跳表,这足以启动心跳,当然心跳主题也被创建了。
【讨论】:
以上是关于Debezium 心跳动作未触发的主要内容,如果未能解决你的问题,请参考以下文章
Debezium - MySQL 连接器 - Kinesis - 服务未启动
成功创建 Always On SQL Server 快照后,Debezium 未跟踪 CDC
Debezium系列之:安装部署debezium详细步骤,并把debezium服务托管到systemctl