昨天,我有机会将Debezium和变更数据捕获(CDC)的想法介绍给开云体育官方注册网址Darmstadt Java用户组.这是一个很棒的晚上,有很多有趣的讨论和问题。其中一个问题是:使用基于日志的变更数据捕获工具(如Debezium)与简单地轮询更新记录相比有什么优势?开云体育官方注册网址

首先,这两种方法有什么不同?使用基于轮询(或基于查询)的CDC,您可以重复运行查询(例如通过JDBC)以从要捕获的表中检索任何新插入或更新的行。相比之下,基于日志的CDC通过对数据库日志文件(例如MySQL的binlog或MongoDB的op日志)的任何更改做出反应来工作。开云体育电动老虎机

因为这不是第一次出现这个问题,我想我可以在博客上提供一个更广泛的答案。这样,如果这个问题再次出现,我将来就可以参考这篇文章了:)

废话不多说,下面是基于日志的CDC相对于基于轮询的方法的五个优点。

捕获所有数据更改

通过读取数据库的日志,您可以按开云体育电动老虎机照应用程序的确切顺序获得所有数据更改的完整列表。这对于您感兴趣的记录更改的完整历史的许多用例来说是至关重要的。相反,使用基于轮询的方法,您可能会错过两次轮询循环运行之间发生的中间数据更改。例如,可能会在两次民意调查之间插入和删除记录,在这种情况下,基于民意调查的CDC永远不会捕获该记录。

与此相关的是停机时间,例如在更新CDC工具时。使用基于轮询的CDC,一旦CDC工具重新联机,将只捕获给定记录的最新状态,而忽略停机期间发生的对记录的任何早期更改。基于日志的CDC工具将能够从关闭之前停止的位置恢复读取数据库日志,从而捕获数据更改的完整历史。开云体育电动老虎机

低事件延迟,同时避免增加CPU负载

对于轮询,您可能想要增加轮询尝试的频率,以减少错过中间更新的可能性。虽然这在某种程度上是可行的,但过于频繁的轮询可能会导致性能问题(因为用于轮询的查询会导致源数据库负载)。开云体育电动老虎机另一方面,扩大轮询间隔将降低CPU负载,但不仅可能导致错过更改事件,还可能导致传播数据更改的更长的延迟。基于日志的CDC允许您近乎实时地对数据更改做出反应,而无需花费CPU时间重复运行轮询查询。

对数据模型无影响

民意调查需要一些指标来确定自上次民意调查以来已更改的记录。所以所有被捕获的表都需要有一些列LAST_UPDATE_TIMESTAMP可用于查找已更改的行。在某些情况下,这可能没问题,但在其他情况下,这种要求可能不可取。具体来说,你需要确保所有表上的更新时间戳都被正确维护,以便写入应用程序或通过触发器捕获。

可以捕获删除

当然,轮询将不允许您识别自上次轮询以来已删除的任何记录。通常,对于类似复制的用例来说,这是一个问题,在这种情况下,您希望源数据库和复制目标上有相同的数据集,这意味着如果源数据库中删除了接收端上的记录,那么您还希望删除它们。开云体育电动老虎机

可以捕获旧记录状态和进一步的元数据吗

根据源数据库的功能,基于日志的CDC可以为更新和开云体育电动老虎机删除事件提供旧记录状态。而使用轮询,您只能获得当前行的状态。在单个更改事件中使用旧行状态对于许多用例来说都是有趣的,例如,如果您希望将包含旧列值和新列值的完整数据更改显示给应用程序用户以进行审计。

此外,基于日志的方法通常可以提供模式更改的流(例如,以应用DDL语句的形式),并公开额外的元数据,例如事务id或应用某个更改的用户。这些事情通常也可以通过基于查询的方法实现(取决于数据库的功能),但我还没有真正看到它在实践中实现。开云体育电动老虎机

总结

以上就是基于日志的变更数据捕获的五个优点。注意,这并不是说基于轮询的CDC没有它的应用。例如,如果您的用例可以通过每小时传播一次更改来满足,并且错过中间有效记录的中间版本也不是问题,那么就完全没问题。

但是,如果您对近乎实时地捕获数据更改感兴趣,并确保不会错过任何更改事件(包括删除),那么我强烈建议您探索Debezium启用的基于日志的CDC的可能性。开云体育官方注册网址Debe开云体育官方注册网址zium连接器为您完成了所有繁重的工作,也就是说,您不必处理各个数据库的所有底层细节以及从它们的日志中获取更改的方法。开云体育电动老虎机相反,您可以使用Debezium生成的通用的、大体上统一的变更数据事件。开云体育官方注册网址

贡纳Morling

Gunnar是Decodable的软件工程师,也是一名不折不扣的开源爱好者。多年来,他一直是Debezium的项目负责人。开云体育官方注册网址Gunnar创建了kcctl、JfrUnit和MapStruct等开源项目,并且是Bean验证2.0 (JSR 380)的规范负责人。他在德国汉堡工作。


关于Debe开云体育官方注册网址zium

开云体育官方注册网址Debezium是一个开源的分布式平台,它将现有数据库转换为事件流,因此应用程序几乎可以立即看到并响应数据库中提交的每一个行级更改。开云体育电动老虎机开云体育官方注册网址Debezium是建立在卡夫卡并提供卡夫卡连接监控特定数据库管理系统的兼容连接器。开云体育电动老虎机开云体育官方注册网址Debezium在Kafka日志中记录了数据更改的历史,所以你的应用程序可以在任何时候停止和重新启动,并且可以很容易地使用它没有运行时错过的所有事件,确保所有事件都被正确和完整地处理。开云体育官方注册网址Debezium是开源Apache许可证,版本2.0

参与

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

Baidu
map