使用 Postgres、Debezium 和 Kafka 流式传输数据


通过流处理,我们可以在数据可用时持续处理数据
我们以事件流的形式从事件源(例如数据库)实时捕获数据,并将数据移动到目标系统(例如数据仓库和数据库)。

什么是事件?
事件就是你将数据概念化的时候。
我这么说是什么意思?考虑一下下面的语句
"我买了咖啡"
"我在周一下午2点从Starbites买了咖啡"
第一个语句只是数据,但第二个语句是一个事件。


变更数据采集(CDC)和Debezium
这个想法很简单。它是关于从数据库中获取变化。CDC将使我们能够捕获已经在数据库中的一切,以及第一次捕获后的任何变化。

比方说,你有一个Postgres数据库。现在,当我们在数据库中插入任何新的记录,更新数据库中现有的记录或从数据库中删除记录时,Debezium通过挖掘数据库的交易日志来获得有关变化的通知。Debezium捕捉到这些变化,并将它们流向Kafka主题。Kafka Connect是Apache Kafka框架的一部分,负责将这些变化发送到Kafka。它充当了流式数据进出Kafka的桥梁。你可以用它来连接你的Kafka数据库和数据源。

现在,当数据在Kafka中时,我们的目标系统可以订阅Kafka主题,这样就可以把变化流传给他们。

有人会问,"为什么你要做这个基于日志的CDC?为什么不是基于查询的CDC?


有2种类型的CDC:基于查询的CDC和基于日志的CDC

使用基于查询的CDC:
你只是写一个SQL来获得你需要的数据。该查询将包括一个谓词,以确定什么已经改变。这可能是基于一个时间戳字段。

让我们假设我们在数据库中有4条记录。当我们运行查询时,我们得到了所有的记录(因为之前的时间戳是从0开始的,所有的ts_cols都大于0)。现在,如果一条新的记录被插入数据库,当我们再次运行我们的查询时会发生什么。现在时间戳被设置为我们最后一次运行查询的时间,我们可以提取被插入的新记录。

这就是基于查询的CDC的工作方式。

请注意这个方法,因为我们必须尽可能频繁地运行查询以获得新的记录。

JDBC连接器是一个例子,你将会使用它来进行基于查询的CDC

基于日志的CDC
然而,对于基于日志的CDC来说,情况就不一样了。对于基于日志的 CDC,我们不是在写任何时间戳大于的查询来提取新记录。相反,我们要看的是数据库的交易日志,而连接器必须以某种方式获得对这些数据的访问。任何时候,只要有插入,它就会被写入事务长,由于我们也在事务日志上保持一个标签,我们可以看到它们,然后从它们的内部格式中解码,并将它们写成Avro/JSON的格式化信息。

有了基于日志的CDC,我们不仅可以看到新的记录,我们还可以看到它是如何到达那里的,所以有某种历史。另外,当我们进行删除时,它会被追加到日志中,所以我们可以看到它们。这些是你在使用基于查询的CDC时不会看到的一些东西。你只看到更新

Debezium项目的所有连接器都是基于日志的CDC连接器的例子。

使用Debezium从Postgres中串流数据,开启了我们可以利用的一系列可能性。
我希望这篇文章能达到它的目的,作为对用Debezium和Kafka建立一个事件驱动系统的一个可理解的介绍。