当前位置: 首页 > 面试题库 >

Kafka Connect JDBC与Debezium CDC

司徒高寒
2023-03-14
问题内容

JDBC连接器和Debezium SQL Server CDC连接器(或任何其他关系数据库连接器)之间有什么区别?何时应该选择一个
,寻找一种在两个关系数据库之间进行同步的解决方案?

不确定此讨论是否应该针对CDC与JDBC连接器,而不是
Debezium SQL Server CDC连接器,甚至不是Debezium,期待
以后进行编辑,取决于给出的答案(尽管我的情况是关于SQL
Server接收器)。


问题答案:

Debezium仅用作源连接器,记录所有行级更改。
Debezium文档说:

Debezium是一组分布式服务,用于捕获
数据库中的更改,以便您的应用程序可以查看这些更改并对
它们做出响应。Debezium将每个数据库表中的所有行级更改记录在
更改事件流中,应用程序只需读取这些流即可以发生
更改的顺序查看更改事件。

用于SQL Server的Debezium Connector首先记录数据库的快照,然后将行级更改的记录发送到Kafka,每个表发送到不同的Kafka主题。
用于SQL Server文档的Debezium连接器说:

Debezium的SQL Server连接器可以监视和记录SQL Server数据库架构中的行级更改。

第一次连接到SQL Server数据库/群集时,它将读取所有架构的一致快照。该快照完成后,连接器将继续流式传输提交到SQLServer的更改,并生成相应的插入,更新和删除事件。每个表的所有事件都记录在一个单独的Kafka主题中,应用程序和服务可以轻松使用它们。

Kafka Connect JDBC
Kafka Connect JDBC可用作Kafka的源连接器或接收器连接器
,支持任何带有JDBC驱动程序的数据库。
JDBC连接器文档说:

您可以使用Kafka Connect JDBC源连接器
通过JDBC驱动程序将任何关系数据库中的数据导入ApacheKafka®主题。您可以
使用JDBC接收器连接器
,通过JDBC驱动程序将数据从Kafka主题导出到任何关系数据库。JDBC连接器支持
各种各样的数据库,而每个数据库都不需要自定义代码。

他们有一些有关在Microsoft SQL
Server上安装的规范,我发现与本次
讨论无关。

因此,如果JDBC连接器同时支持源和接收器,而Debezium仅支持
源(不提供接收器),我们可以理解,为了
使用JDBC驱动程序(接收器)将数据从Kafka写入数据库,使用JDBC连接器是可行的
(包括SQL)服务器)。

现在,应仅将比较范围缩小到“源”字段。
乍看之下,JDBC Source Connector
文档还不多说

通过定期执行SQL查询并
为结果集中的每一行创建输出记录来加载数据。默认情况下,数据库
中的所有表都被复制,每个表都复制到其自己的输出主题。监视数据库中的新
表或删除表,并自动进行调整。从表中复制数据时,
连接器可以通过指定
应使用哪些列来检测新数据或修改后的数据来仅加载新行或修改后的行。

为了进一步了解它们之间的差异,在这个
Debezium博客中,该博客使用Debezium MySQL Connector作为源,并使用JDBC Connector
作为接收器,其中有关于两者之间差异的解释,
通常告诉我们Debezium提供了以下记录:
有关数据库更改的更多信息,而JDBC连接器提供的记录
更侧重于将数据库更改转换为简单的
插入/更新命令:

Debezium MySQL连接器旨在专门捕获数据库
更改,并提供
除每一行的新状态之外的有关这些事件的尽可能多的信息。同时,Confluent JDBC Sink
连接器旨在根据消息
的结构将每个消息简单地转换为数据库插入/向上插入。因此,两个
连接器的消息结构不同,但是它们还使用
不同的主题命名约定和代表已删除
记录的行为。

此外,它们具有不同的主题命名和不同的删除方法:

Debezium对代表
其管理的每个表的目标主题使用完全限定的命名。命名遵循模式[逻辑名称]。[数据库
名称]。[表名称]。Kafka Connect JDBC连接器使用简单名称
[table-name]。

当Debezium连接器检测到行被删除时,它将创建两个事件
消息:一个delete事件和一个逻辑删除消息。删除消息
在前字段中包含一个信封,其中包含已删除行的状态,在后
字段中为空。逻辑删除消息包含与删除
消息相同的密钥,但是整个消息值均为空,并且Kafka日志压缩
利用该消息知道可以使用相同的
密钥删除任何较早的消息。许多接收
器连接器,包括Confluent的JDBC Sink连接器,都不希望收到这些消息,如果
看到任何一种消息,它们都将失败。

这个Confluent博客详细解释了CDC和
JDBC连接器的工作方式,它(JDBC连接器)
每隔固定的时间间隔执行一次对源数据库的查询,这不是一个可扩展的解决方案,而CDC的
频率更高,从数据库事务日志流式传输:

连接器通过在JDBC上对源
数据库执行查询来工作。这样做是为了拉入所有行(批量)或
自上次以来已更改的行(增量)。该查询
以poll.interval.ms中定义的间隔执行。根据所涉及的数据量,
物理数据库设计(索引等)以及
数据库上的其他工作负载,这可能不是最可扩展的选择。

正确完成后,CDC基本上可以使您将每个事件从
数据库流式传输到Kafka。概括地说,关系数据库使用事务日志
(根据DB的风格也称为binlog或重做日志),
数据库中的每个事件都写入该日志中。更新一行,插入一行,删除一行-
所有这些都进入数据库的事务日志。CDC工具通常
通过利用此事务日志以极低的延迟和低
影响来提取数据库(或其中的架构/表
)中发生的事件来工作。

该博客还陈述了CDC和JDBC连接器之间的区别,主要是
说JDBC连接器不支持同步已删除的记录,因此适合
原型制作,而CDC适合更成熟的系统:

JDBC连接器无法获取已删除的行。因为,您如何查询
不存在的数据?

我对CDC与JDBC的一般指导是JDBC非常适合用于原型设计和
精细的小批量工作负载。使用JDBC连接器时要考虑的事项:

不会提供真正的CDC(捕获删除记录,需要记录
版本之前/之后的延迟)检测新事件的延迟
持续轮询源数据库的影响(并将其与所需的延迟进行平衡),除非
您从表中,您需要具有
可用于发现新记录的ID和/或时间戳。如果您不拥有该架构,
这将成为一个问题。

tl; dr结论
Debezium和JDBC连接器之间的主要区别是:

Debezium仅用作Kafka源,而JDBC Connector可用作Kafka源和接收器。
对于来源:

JDBC连接器不支持同步已删除的记录,而Debezium支持。
JDBC连接器每隔固定的时间间隔查询数据库,这不是一个非常可扩展的解决方案,而CDC从数据库事务日志中流式传输的频率更高。
Debezium为记录提供了有关数据库更改的更多信息,而JDBC连接器提供的记录更侧重于将数据库更改转换为简单的插入/更新命令。
不同的主题命名。



 类似资料:
  • 在C语言中,假设每个算法被赋予完全相同的一组进程,那么先到先得、最短作业优先和循环之间的周转时间是否相等?还是调度算法不同?

  • 问题内容: 为了为 HTML5 Doctype 定义字符集,我应该使用哪种表示法? 短: 长: 问题答案: 在HTML5中,它们是等效的。使用较短的一个,更容易记住和键入。浏览器支持很好,因为它是为向后兼容而设计的。

  • 连接的多个输入都相当于Yes的时候才会输出Yes。 用法 Your browser does not support the video tag. 案例:小闹钟 功能:今天15:10:00,响起猫叫声小闹钟 工作原理 当所有的输入都是Yes的时候,与节点才输出Yes。

  • 问题内容: 似乎有三种 相同的 方法可以独立于平台获取依赖于平台的“文件分隔符”: 我们如何决定何时使用哪个? 它们之间甚至有什么区别吗? 问题答案: 可以通过调用命令行参数或使用命令行参数覆盖 获取默认文件系统的分隔符。 获取默认文件系统。 获取文件系统的分隔符。请注意,作为一种实例方法,在需要代码在一个JVM中对多个文件系统进行操作的情况下,可以使用该方法将不同的文件系统传递给代码(而不是默认

  • 问题内容: 我今天刚刚与一些同事讨论了python的db-api fetchone vs fetchmany vs fetchall。 我确定每个应用程序的用例都取决于我正在使用的db-api的实现,但是总的来说,fetchone,fetchmany,fetchall的用例是什么? 换句话说,以下等效项是什么?还是其中之一比其他人更受青睐?如果是这样,在哪些情况下? 问题答案: 我认为这确实取决于

  • 问题内容: 即时创建元素并能够移动元素的最佳方法是什么?例如,假设我要创建一个矩形,圆形和多边形,然后选择这些对象并四处移动。 我了解HTML5提供了三个使之成为可能的元素:svg,canvas和div。对于我想做什么,这些元素中的哪一个将提供最佳性能? 为了比较这些方法,我正在考虑创建三个视觉上相同的网页,每个网页中都有页眉,页脚,小部件和文本内容。第一页中的小部件将完全使用元素创建,第二页中的

  • 问题内容: 之间有什么区别,和? 问题答案: 将等待,直到所有资产完成下载为止,例如图像和脚本。 DOM准备就绪,直到您可以通过API访问DOM为止。 作为一个方面说明,在当今这个时代,你应该使用或较旧的IE。