随着夏天的临近,我很高兴地宣布 Debezium 1.9.3.Final 发布!
此版本主要专注于错误修复和稳定性;但是,也有一些值得注意的功能增强。让我们花点时间来详细了解一下这些新功能:)。
使用 MongoDB 和 Outbox 解码二进制载荷
数据库从一开始就支持存储二进制数据,并且应用程序选择使用数据库存储二进制数据而不是其他替代方案有多种原因。二进制数据不一定总是像图像、缩略图或 PDF 等二进制文档一样的信息,它还可以包括序列化的对象。
当使用 MongoDB 和 Avro 序列化的 Outbox 模式时,Outbox 的 payload 字段是消息值中唯一发出的值。当 payload 是二进制数据时,如下所示,它会按原样发出,并可能导致主题的消费者在序列化时出现一些问题。
{
"payload": {
"$binary": ""RGViZXppdW0gaXMgdGhlIGJlc3Qu",
"$type": "0"
}
} 在此版本中,我们已弃用 ByteBufferConverter,并引入了两个新转换器来替代它:
-
ByteArrayConverter:将 payload 按原样转换为byte[]。 -
BinaryDataConverter:将 payload 转换为ByteBuffer或Byte[]。
对于此用例,我们将使用新的 ByteArrayConverter,因为我们希望将此 payload 的值作为原始 byte[] 发出。在连接器配置中,必须将 value.converter 配置选项设置为以处理此用例。
transforms=outbox,...
transforms.outbox.type=io.debezium.connector.monogdb.transforms.outbox.MongoEventRouter
value.converter=io.debezium.converters.ByteArrayConverter 现在,数据将按原样发送到代理,作为字节数组,消费者可以安全地消费。感谢 Nathan Bradshaw 的杰出贡献!
Oracle 的心跳操作查询
心跳操作查询是一项功能,允许 Debezium 连接器向源数据库写入记录,并在事件处理循环中捕获这些记录。此功能最初为 PostgreSQL 引入,用于处理捕获的表比其他非捕获表更改频率低,导致 WAL 无意中增长的情况。
对于使用 LogMiner 实现的 Oracle,会出现类似的问题,影响连接器因偏移量 SCN 未按固定间隔前进而导致的重新启动能力,原因在于其他未被捕获的表发生了更改,无论是同一可插拔数据库的一部分还是另一个数据库。
要启用心跳操作查询,必须使用以下配置:
heartbeat.interval.ms=1000
heartbeat.action.query=INSERT INTO heartbeat (id) values (SYSDATE)
table.include.list=MYSCHEMA.HEARTBEAT,... 心跳功能必须通过指定 heartbeat.interval.ms 来启用。此设置控制连接器生成心跳事件的频率。如果此值不大于 0,则心跳将被禁用。
接下来,要专门使用操作查询功能,必须提供 heartbeat.action.query 选项。此选项指定一个将在每次心跳间隔执行的 SQL 语句。该语句可以是 INSERT 或 UPDATE,只要生成的 SQL 操作会产生行更改。
最后,操作查询必须作用于包含在连接器过滤器配置中的表。与任何其他捕获的表一样,该表还必须配置正确的补充日志记录,以便捕获事件。
有了此配置,并且假设没有长时间运行的事务,偏移量 SCN 将在每次心跳时前进。
Oracle LogMiner 会话持续时间现在可控
Debezium Oracle 连接器的 LogMiner 会话持续时间一直以来都基于重做日志切换的频率。通常,这种行为在大多数环境中效果很好;但是,在低流量环境中或在非高峰时段,这可能会导致使用同一 LogMiner 会话的时间更长,从而在 PGA 内存耗尽时可能导致 ORA-04030 异常。
已添加了一个新的配置选项 log.mining.session.max.ms,允许完全控制 Oracle LogMiner 会话的最大持续时间。当设置为大于 0 的值时,连接器将在达到最大持续时间或日志切换时(以先发生的为准)自动关闭并重新启动挖掘会话。低流量的 Oracle 环境,尤其是在非高峰时段,启用此新选项后,应不再遇到 PGA 内存问题。请与您的数据库管理员团队协调,以根据您环境的配置和活动确定最佳值。
其他更改
但这还不是全部,还有许多值得注意的错误修复,包括但不限于:
-
MySQL 连接器增量快照在连接器设置“snapshot.fetch.size”: 20000 时解析 datetime 列长度失败 DBZ-4939
-
在 MongoDB 连接器指标注册期间发生 InstanceAlreadyExistsException DBZ-5011
-
DateTimeParseException: Postgres 连接器中无法解析文本 'infinity' DBZ-5014
-
每个连接器 (postgres) 4 个连接 DBZ-5074
-
Oracle Logminer:在快照切换到流式传输模式期间错过记录 DBZ-5085
-
无法将 debezium.sink.kafka.producer.ssl.endpoint.identification.algorithm 设置为空值 DBZ-5105
-
SQL Server 连接器未报告 MilliSecondsBehindSource DBZ-5137
-
ExtractNewRecordState SMT 将 Null 值替换为列的默认值 DBZ-5166
-
Oracle 连接器对回滚和已放弃事务的指标跟踪可能导致高内存使用 DBZ-5179
我们强烈建议升级到 1.9.3.Final,以获得最新的性能和稳定性改进。
非常感谢社区以下为 Debezium 1.9.3.Final 做出贡献的个人:Alexey Miroshnikov、Anisha Mohanty、Bob Roldan、Chris Cranford、Connor Szczepaniak、César Martínez、Harvey Yue、Himanshu Mishra、Jakub Cechacek、Jiri Pechanec、Mark Allanson、Mark Bereznitsky、Nathan Bradshaw、Sergei Morozov、Stefan Miklosovic、Vadzim Ramanenka,以及 Vojtech Juranek!
展望
Debezium 1.9 版本系列将在接下来的三个月内保持当前长期支持版本。在此期间,我们将继续评估用户报告,并根据严重性发布小型版本来解决错误和回归问题。
此外,Debezium 2.0 也投入了大量工作。我们计划在下周发布 Debezium 2.0.0.Alpha2,之后大约每三周发布一次。
请继续关注未来几周的更多信息,并保持冷静!
关于 Debezium
Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。