变更数据捕获是一个热门话题。开云体育官方注册网址Debezium的目标是为多个dbms轻松地捕获变更数据,但不可否认的是,我们仍然是一个年轻的开源项目,到目前为止我们只发布了一个MySQL连接器与一个MongoDB连接器就在拐角处。因此,看到其他人如何使用和实现变更数据捕获是非常棒的。在这篇文章中,我们将回顾Yelp的方法,看看它与Debezium的MySQL连接器有多么惊人的相似。开云体育官方注册网址

Yelp的流媒体数据

Yelp工程博客最近开始了一系列描述他们的实时流数据基础设施。的第一篇文章提供了很好的介绍,并解释了如何从整体架构转移到面向服务的架构来提高工作效率,但同时也增加了处理分布在拥有数据的100个服务中的数据的挑战性。完全值得你现在就去读。

正如Justin在文章中所写的,有几个原因促使他们创建自己的实时流数据管道:

  • 确保跨服务的数据始终保持一致始终是一项艰巨的任务,但当出现问题时尤其如此。跨服务的事务在某些情况下可能有用,但它们并不简单,成本很高,并且可能导致请求放大,即一个服务调用另一个服务,后者与其他两个服务进行协调,等等。

  • 在多个后端服务中更新数据的服务会受到双写问题,即在一个备份服务更新之后,而在另一个备份服务更新之前发生故障,这总是会导致数据不一致,难以跟踪和纠正。

  • 组合和集成分布在多个服务中的数据也很困难和昂贵,但当数据不断变化时就更难了。一种方法是使用批量api,但是当服务需要不断接收无休止的数据更新时,创建这些api可能会导致不一致,并造成真正的可伸缩性问题。

Yelp的实时数据管道(Real-Time Data Pipeline)在完全有序的分布式日志上记录对数据的更改,以便下游消费者能够以完全相同的顺序接收和处理相同的更改。服务可以使用其他服务所做的更改,因此无需显式的服务间通信就可以保持同步。该系统使用Kafka来记录事件日志,这是一个名为MySQLStreamer捕获提交到MySQL表的更改,Avro用于消息格式和模式,并自定义系统化跟踪消费者的服务,并在每个Kafka主题上执行用于消息的Avro模式。

Yelp如何捕捉MySQL的变化

对于Debezium来说,最有趣的可能是Yelp如何在My开云体育官方注册网址SQL数据库中捕获已提交的更改并将其写入Kafka主题。开云体育电动老虎机他们的本系列的第二篇文章详细介绍了MySQLStreamer进程,该进程读取MySQL二进制日志,并不断处理日志中出现的DDL语句和DML操作,生成相应的插入更新删除,刷新事件,并为每个MySQL表将这些事件消息写入单独的Kafka主题。我们已经之前提到的MySQL由DML操作产生的行级binlog事件不包括列的完整定义,因此要知道每个事件中的列意味着什么,就需要处理binlog中出现的DDL语句。Yelp使用一个单独的MySQL实例架构跟踪器数据库开云体育电动老虎机,它的行为就像一个MySQL slave,只应用从binlog中读取的DDL语句。这种技术允许Yelp的MySQLStreamer系统在binlog中处理事件时知道数据库模式的状态和表的结构。开云体育电动老虎机这非常有趣,因为它使用MySQL引擎来处理DDL解析。

Yelp的MySQLStreamer进程使用另一个MySQL数据库来跟踪描述其在binlog中的开云体育电动老虎机位置的内部状态,已经成功发布到Kafka的事件,以及(因为binlog在每个副本上的位置不同)关于每个事务的与副本无关的信息。后一个信息类似于MySQL gtid,尽管Yelp使用的是不支持gtid的MySQL早期版本。

当然,对于已经存在了很长时间的数据库,需要特别考虑。开云体育电动老虎机MySQL的二进制日志是有上限的,不会包含整个因此Yelp的MySQLStr开云体育电动老虎机eamer进程通过启动另一个干净的MySQL副本来引导旧数据库的更改数据捕获过程,该副本将使用内置的MySQL复制机制MySQL黑洞数据库引擎开云体育电动老虎机获取主节点的一致快照,以便所有活动都记录在副本的binlog中,而副本实际上不存储任何数据。

Yelp的MySQLStreamer机制非常巧妙,它使用MySQL和多个额外的数据库来捕获MySQL数据库的更改并将其写入Kafka主题。开云体育电动老虎机当然,这样做的缺点是会增加系统的操作复杂性。

相似的目的,相似的方法

开云体育官方注册网址Debezium是一个开源项目,它正在为各种dbms构建变更数据捕获。比如Yelp的MySQLStreamer, Debez开云体育官方注册网址ium的MySQL连接器可以连续地捕获提交到MySQL数据库行的更改,并在每个表的单独Kafka主题中记录这些事件。开云体育电动老虎机当第一次启动时,Debezium的MyS开云体育官方注册网址QL连接器可以执行初始一致的快照,然后开始读取MySQL binlog。它直接使用binlog中出现的DDL和DML操作解析和使用DDL语句了解对每个表结构的更改以及每个插入、更新和删除binlog事件的映射。每个写入Kafka的结果更改事件都包括关于原始MySQL服务器及其binlog位置的信息,以及受影响行之前和/或之后的状态。

然而,与Yelp的MySQLStreamer不同,Debezium MySQL连接器开云体育官方注册网址不需要或使用额外的MySQL数据库来解析DDL或存储连接器的状态。开云体育电动老虎机相反,Debezi开云体育官方注册网址um构建在Kafka Connect的基础上,Kafka Connect是一个新的Kafka库,它提供了许多通用功能,可以可靠地从外部系统提取数据,将数据推入Kafka主题,并跟踪已经处理的数据。Kafka Connect将此状态存储在Kafka本身中,简化了操作足迹。开云体育官方注册网址Debezium的MySQL连接器可以专注于在需要时执行一致快照的细节,读取binlog,并将binlog事件转换为有用的更改事件。

Yelp的实时数据管道使用自定义Avro模式注册表,并使用这些Avro模式将每个事件编码为紧凑的二进制表示,同时保留关于事件结构的元数据。使用Debezium也可以做到这一点:简单地运行开云体育官方注册网址Confluent的模式注册表作为服务,然后配置Kafka Connect worker来使用Avro转换器.当转换器序列化每个事件时,它会查看连接器定义的结构,当该结构发生变化时,生成更新的Avro Schema并将其注册到Schema Registry。然后使用新的Avro模式将事件(以及其他具有相同结构的事件)编码为写入Kafka的紧凑二进制形式。当然,消费者也使用相同的Avro转换器,以便在反序列化事件时,转换器在需要它不知道的Avro模式时与Schema Registry进行协调。因此,事件以紧凑的方式存储,而事件的内容和元数据仍然可用,而Schema Registry捕获并维护每个表的Avro模式的历史,因为它随着时间的推移而发展。

使用Debezium从MySQL中捕获更改开云体育官方注册网址

如果您对使用MySQL(或任何其他dbms)进行变更数据捕获感兴趣,请尝试使用Debezium开云体育官方注册网址我们的教程它将引导你启动Kafka、Kafka Connect和Debezium的MySQL连接器,以确切地了解更改数据事件的开云体育官方注册网址样子以及如何使用它们。最重要的是,它是开源的,越来越多的开发者社区受益于在最近创建的Kafka Connect框架上进行构建。我们的MySQL连接器现在已经准备好了,但我们还在继续工作用于其他dbms的连接器.具体来说,我们即将发布的0.3版本将包括我们的MongoDB连接器,包括PostgreSQL和/或Oracle的连接器。

更正:这篇文章的前一个版本错误地说Yelp正在使用一个支持gtid的MySQL版本,而实际上他们正在使用一个支持gtid的版本支持MySQL gtid。文章已被更正,作者对此错误表示遗憾。

兰德尔Hauch

Randall是Red Hat的一名开源软件开发人员,在数据集成领域工作了近20年。他是Debezium的创始人,并参与了其他开云体育官方注册网址几个开源项目。他住在伊利诺伊州圣路易斯附近的爱德华维尔。


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

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

参与

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

Baidu
map