我非常高兴地宣布 Debezium 0.10.0.Alpha1 的发布!

Debezium 0.10 的主要主题是进行一些清理(这是您在这个时间该做的事情,对吗?);我们计划删除一些已弃用的功能,并简化 Debezium 连接器生成的 CDC 事件结构中的一些细节。

这意味着,与之前的升级相比,将 Debezium 0.10 升级到早期版本可能需要更多的计划和考虑,具体取决于您对 0.9 及更早版本中已标记为已弃用的功能和选项的使用情况。但不用担心,我们在本文和发布说明中详细描述了所有更改。

为什么?

首先,我们来简单讨论一下为什么要做这些改变。

在过去三年里,Debezium 从只支持一个数据库发展成为一系列支持不同关系型数据库和 MongoDB 的 CDC 连接器,以及配套组件,例如用于 主题路由实现 outbox 模式 的消息转换。

与任何成熟的项目一样,随着时间的推移,我们发现代码库中有一些地方应该像最初设想的那样做,而不是现在这样。例如,我们从一个手动编写的解析器来处理 MySQL DDL 语句,转向了一个基于 Antlr 的更健壮的实现。我们还意识到,某些时间列类型导出的方式在某些条件下有值溢出的风险,因此我们增加了一种新的模式来避免这些问题。最后一个例子是,我们使快照时的批量大小等选项在不同连接器之间保持一致。

幸运的是,Debezium 很快获得了关注,尽管版本号是 0.x,但它在许多组织的生产环境中被大量使用,用户依赖于它的稳定性。因此,每当我们进行这些更改时,我们的目标都是使升级体验尽可能顺畅;通常这意味着之前的行为仍然可用,但在文档中被标记为已弃用,同时会添加一个新的改进选项、实现等并将其设为默认行为。

与此同时,我们意识到连接器之间存在一些不应该存在的差异。特别是,更改事件的 `source` 块存在一些差异,使得消费者统一处理比应有的更复杂;例如,MySQL 事件中的时间戳字段名为 "ts_sec",而 Postgres 的时间戳字段名为 "ts_usec"。

考虑到以上所有因素,我们决定是时候解决这些问题了。这有几个目的:

  • 通过移除遗留代码(例如已弃用的选项及其处理方式以及遗留的 MySQL DDL 解析器),保持代码库的可维护性并为未来的开发开放。

  • 通过尽可能统一不同连接器创建的 `source` 块,使不同连接器的 CDC 事件更容易被消费。

  • 为项目迁移到 1.0 版本做准备,并提供比今天已实践的更强的向后兼容性保证。

什么?

既然我们已经讨论了为什么觉得是时候进行一些“清理”了,那么让我们更仔细地看看最相关的更改。请也参考迁移说明的 “breaking changes” 部分以获取更多详细信息。

  • 已移除 MySQL 的遗留 DDL 解析器(DBZ-736);如果您还没有使用基于 Antlr 的解析器(它在 0.8 中引入,并在 0.9 中成为默认),强烈建议您在您的数据库上进行测试。如果您遇到任何解析错误,请报告它们,以便我们可以在 0.10 最终版本中修复。

  • 用于从更改事件中检索新记录/文档状态的 SMT 已从 `io.debezium.transforms.UnwrapFromEnvelope` 和 `io.debezium.connector.mongodb.transforms.UnwrapFromMongoDbEnvelope` 重命名为 `ExtractNewRecordState` 和 `ExtractNewDocumentState`(DBZ-677)。在 0.10 版本中仍然可以使用旧名称,但这样做会发出警告。它们计划在 Debezium 0.11 版本中移除。

  • 先前 Debezium 版本中已弃用的几个连接器选项已被移除(DBZ-1234):新记录/文档状态提取 SMT 的 `drop.deletes` 选项(被 `delete.handling.mode` 选项取代)、MySQL 的 `rows.fetch.size` 选项(被 `snapshot.fetch.size` 取代)、MySQL 的 `time.precision.mode` 选项的 `adaptive` 值(有值丢失风险,请使用 `adaptive_microseconds` 代替)以及 MySQL 连接器的 `snapshot.minimal.locks`(被 `snapshot.locking.mode` 取代)。

  • 为了保持一致性,(孵化中的)outbox 模式 SMT 的几个选项名称已被重命名(DBZ-1289)。

  • 为了保持一致性,CDC 事件的 `source` 块中的几个字段已重命名(DBZ-596);由于这在技术上是使用 Avro 和 Schema Registry 的向后不兼容更改,我们添加了一个连接器选项 `source.struct.version`,当设置为 `v1` 值时,连接器将生成之前的 `source` 结构。`v2` 是默认值,任何消费者都应尽快进行调整以适应新的 `source` 结构。

新功能和错误修复

除了这些更改之外,0.10.0.Alpha1 版本还包含了一些功能添加和错误修复。

  • SQL Server 连接器支持快照的自定义 SELECT 语句(DBZ-1224)。

  • 数据库、模式和表/集合名称已一致地添加到所有连接器的 CDC 事件的 `source` 块中(DBZ-875)。

  • MySQL 连接器支持客户端身份验证(DBZ-1228)。

  • 嵌入式引擎在重启后不再重复发送事件(DBZ-1276)。

  • 修复了一个与 `CREATE INDEX` 语句相关的解析器错误(DBZ-1264)。

总而言之,在此次发布中解决了 30 个问题。非常感谢 Arkoprabho ChakrabortiRam SatishYuchao Wang 对本次发布的贡献!

说到贡献者,我们还对 Debezium 历来所有贡献者的 列表进行了一些整理。到目前为止,已有不少于 **111 位个人贡献了代码**,这真是太棒了!非常感谢大家,你们太棒了!

展望

展望未来,在发布 Debezium 0.10 最终版本之前,我们还有一些细节需要统一到不同连接器中。例如,`source` 属性 `snapshot` 将被修改,使其可以接受三个状态之一:`true`、`false` 或 `last`(表示该事件是在初始快照过程中创建的最后一个事件)。

我们将继续努力,将现有的 Postgres 连接器迁移到为 SQL Server 和 Oracle 连接器建立的框架类。我们还在积极探索的一个问题是,Postgres 如何能够利用 Postgres 10 中新增的“逻辑复制”功能。这可能为我们提供一种摄取更改事件的方式,而无需自定义服务器端的逻辑解码插件,这在云环境中通常只能提供有限的逻辑解码选项,因此会带来挑战。

Gunnar Morling

Gunnar 是一位软件工程师,内心是一个开源爱好者,目前在 Confluent 担任技术专家。此前,他曾帮助构建一个基于 Apache Flink 的实时流处理平台,并领导了 Debezium 项目,这是一个用于变更数据捕获的分布式平台。他是 Java Champion,并创立了多个开源项目,如 JfrUnit、kcctl 和 MapStruct。Gunnar 是一位热情的博主 (morling.dev),并曾在 QCon、Java One 和 Devoxx 等各种会议上发表演讲。他居住在德国汉堡。

   


关于 Debezium

Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。

参与进来

我们希望您觉得 Debezium 有趣且有用,并希望尝试一下。在 Twitter @debezium 上关注我们,在 Zulip 上与我们聊天,或加入我们的 邮件列表 与社区交流。所有代码都在 GitHub 上开源,因此请在本地构建代码,帮助我们改进现有连接器并添加更多连接器。如果您发现问题或有改进 Debezium 的想法,请告诉我们或 记录一个问题

版权所有 © Debezium 及其作者。保留所有权利。有关我们的商标详情,请访问我们的 商标政策商标列表。第三方商标属于其各自所有者,在此提及并不表示任何认可或关联。
×