Debezium系列之:Debezium JDBC 连接器支持批量同步数据

Debezium系列之:Debezium JDBC 连接器支持批量同步数据

  • 一、设置批次
  • 二、配置消费者最大轮询记录
  • 三、性能测试结果
  • 四、结论

一、设置批次

由于我们之前的版本主要关注核心功能,因此我们的最新版本致力于解决与连接器相关的主要痛点:性能。

  • 目标是提高每秒处理的事件数 (EPS) 的吞吐量。为了实现这一目标,我们重新访问了连接器以支持批量事件的处理。
  • 您现在可以使用新属性来微调批次的大小:batch.size。
  • batch.size 属性定义尝试批处理到目标表中的记录数。然而,值得注意的是,处理记录的实际大小取决于 Kafka Connect 工作线程的 Consumer.max.poll.records 属性。
  • 需要注意的是,如果您将 Connect Worker 属性中的 Consumer.max.poll.records 设置为低于batch.size的值,则批处理将受到consumer.max.poll.records和预期batch.size的限制。可能无法实现。

二、配置消费者最大轮询记录

  • 如果您不想在 Connect 工作线程上全局配置consumer.max.poll.records 属性,则可以选择使用consumer.override.max.poll.records 为特定连接器设置底层消费者的max.poll.records连接器配置。
  • 要启用每个连接器的配置属性并覆盖默认工作线程属性,请将以下参数添加到工作线程属性文件中:connector.client.config.override.policy。
  • 此属性定义连接器可以覆盖哪些配置。默认实现是“All”,但其他可能的策略包括“None”和“Principal”。
  • 当 Connector.client.config.override.policy=All 时,属于工作线程的每个连接器都可以覆盖工作线程配置。您现在可以使用以下覆盖前缀进行接收器连接器配置:consumer.override.。
  • 值得注意的是,即使您设置了 max.poll.records(默认值为 500),您收到的记录也可能会更少。这是由于其他属性可能会影响从主题/分区获取记录。
参数默认值
fetch.max.bytes52428800 (52MB)
max.partition.fetch.bytes1048576 (1MB)
message.max.bytes1048588 (1MB)
max.message.bytes1048588 (1MB)

因此,根据您预期的有效负载大小调整这些,以达到所需的轮询记录数。

三、性能测试结果

性能测试的目的是了解批量支持如何改进 EPS。因此,这些数字并不反映任何实际场景,而是展示了与旧 JDBC 版本相比的相对改进。

用于测试的配置
所有测试均在 ThinkPad T14s Gen 2i 上执行

CPU:Intel® Core™ i7-1185G7 @ 3.00GHz(8 核)
内存:32GB
磁盘:512G​​B NVMe

Docker 容器内的所有必需组件(Kafka、Connect、Zookeeper 等)。

用于测试的表具有以下结构:

CREATE TABLE `aviation` (`id` int NOT NULL,`aircraft` longtext,`airline` longtext,`passengers` int DEFAULT NULL,`airport` longtext,`flight` longtext,`metar` longtext,`flight_distance` double DEFAULT NULL
)

测试计划

我们计划执行这些测试:

  • 来自单个表的 100K 事件
    • MySQL 批处理与无批处理
  • 来自三个不同表的 100K 事件
    • MySQL 批处理与无批处理
  • 来自单个表的 100 万个事件
    • MySQL 批处理,批处理大小:500、1000、5000、10000 与无批处理
    • MySQL 批处理,批量大小:500、1000、5000、10000(使用 JSONConverter)
    • MySQL 批处理,批处理大小:500、1000、5000、10000(使用 Avro)
    • MySQL 批处理,批处理大小:500、1000、5000、10000,使用 Avro,目标表上没有索引

在这里插入图片描述
图 1 说明了处理单个表中 100,000 个事件所需的总执行时间,比较了具有和不具有批处理支持的 MySQL 连接器。

尽管batch.size和consumer.max.poll.records的默认值都设置为500,但由于有效负载大小的考虑,观察到的实际大小被减少到337条记录。

正如预期的那样,我们可以观察到具有批量支持的 Debezium JDBC 连接器速度更快。

在这里插入图片描述
在图 2 中,我们观察到将 100,000 个事件拆分到三个表中不会影响结果。与非批处理版本相比,具有批处理支持的 Debezium JDBC 连接器仍然更快。

在这里插入图片描述
在图 3 中,很明显,当事件数达到 1,000,000 时,性能提升变得更加明显。具有批量支持的 Debezium JDBC 连接器大约需要 7 分钟才能插入所有事件,平均吞吐量为 2300 eps,而没有批量支持的过程需要 570 分钟(9.5 小时)。因此,具有批量支持的 Debezium JDBC 连接器比不具有批量支持的版本快 79 倍。

在这里插入图片描述
在图 4 中,我们观察 Debezium JDBC 连接器使用 org.apache.kafka.connect.json.JsonConverter 转换器并使用不同的 batch.size 设置写入 MySQL 的行为。虽然最初的差异很明显,但吞吐量明显持续下降。平均而言,所有batch.size配置大约需要7分钟来处理所有事件。

这引起了我们的担忧。在进行彻底的分析(分析)后,我们发现了另一个问题:事件反序列化。这很有可能是导致batch.size设置不可扩展的原因。

尽管序列化提高了可扩展性,但我们仍然缺乏关于测试运行期间 EPS 减速的答案。一个假设可能涉及某处某种类型的缓冲区。

在这里插入图片描述
然后我们使用 Avro 进行了实验,如图 5 所示,结果显示了显着的改进。正如预期的那样,使用batch.size = 500处理1,000,000个事件比使用batch.size = 10000慢。值得注意的是,在我们的测试配置中,batch.size 的最佳值为 1000,从而实现最快的处理时间。

虽然结果比 JSON 更好,但仍然存在一些性能下降。

为了识别代码中的潜在瓶颈,我们添加了一些指标,发现大部分时间都花在了在数据库上执行批处理语句。

进一步的调查显示,我们的表在主键上定义了一个索引,这会减慢插入速度。

在这里插入图片描述
在图 6 中,您可以看到使用 Avro 且没有主键索引时性能的提高。较高的batch.size 值也可以明显提高性能。

四、结论

我们探索了调整batch.size如何增强Debezium JDBC连接器的性能,并讨论了最大化其优势的正确配置。同样重要的是遵守针对特定数据库量身定制的高效插入的性能提示和一般准则。

这里有一些例子:

  • MySQL - 优化 INSERT 语句
  • MySQL - 性能扩展
  • PostgreSQL - 填充数据库

虽然某些设置可能特定于某些数据库,但一些通用原则适用于大多数数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/294467.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql_lab之sqli中的报错注入,less13

报错注入&#xff08;less-13&#xff09; 正常报错注入&#xff1a; 1.输入用户名和密码123 123显示登录错误 2.输入用户名和密码123’ 123显示登录错误 123后面有’)说明是’)注入 3.查询数据库名 1) and updatexml(<a><b></b></a>,concat(1111…

c语言:文件操作(2),认识各种文件操作函数

fgets 作用 fgets是C语言标准库中用于从文件中读取字符串的函数。 fgets函数从指定的文件流stream中读取最多n-1个字符&#xff0c;或者直到遇到换行符&#xff08;包括换行符在内&#xff09;&#xff0c;并将其存储到以str指向的字符数组中。读取的字符串会以null字符\0结…

硬核实战!mysql 错误操作整个表全部数据后如何恢复?附解决过程、思路(百万行SQL,通过binlog日志恢复)

mysql 错误操作整个表全部数据后如何恢复&#xff1f;&#xff08;百万行SQL&#xff0c;通过binlog日志恢复&#xff09; 事件起因 事情起因&#xff1a;以为某个表里的数据都是系统配置的数据&#xff0c;没有用户数据&#xff0c;一个字段需要覆盖替换为新的url链接&#x…

6. 行为模式 - 观察者模式

亦称&#xff1a; 事件订阅者、监听者、Event-Subscriber、Listener、Observer 意图 观察者模式是一种行为设计模式&#xff0c; 允许你定义一种订阅机制&#xff0c; 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 问题 假如你有两种类型的对象&#xff1a; ​ 顾…

【Earth Engine】协同Sentinel-1/2使用随机森林回归实现高分辨率相对财富(贫困)制图

目录 1 简介与摘要2 思路3 效果预览4 代码思路5 完整代码6 后记 1 简介与摘要 最近在做一些课题&#xff0c;需要使用Sentinel-1/2进行机器学习制图。 然后想着总结一下相关数据和方法&#xff0c;就花半小时写了个代码。 然后再花半小时写下这篇博客记录一下。 因为基于多次拍…

浅谈Guava Cache的参数使用

CacheLoader 用于数据加载方式比较固定且统一的场景&#xff0c;在缓存容器创建的时候就需要指定此具体的加载逻辑。通常开发中使用时我们需要继承CacheLoader类或写一个匿名实现类实现其load方法和reload方法 load方法 当执行get操作没有命中缓存或者判断缓存已经超出expir…

NiNNet

目录 一、网络介绍 1、全连接层存在的问题 2、NiN的解决方案(NiN块) 3、NiN架构 4、总结 二、代码实现 1、定义NiN卷积块 2、NiN模型 3、训练模型 一、网络介绍 NiN&#xff08;Network in Network&#xff09;是一种用于图像识别任务的卷积神经网络模型。它由谷歌研究…

Linux学习小结

目录结构 tree -L 1 / # /root #root用户的家目录 /home #存储普通用户家目录 lostfound #这个目录平时是空的&#xff0c;存储系统非正常关机而留下“无家可归”的文件 /usr #系统文件&#xff0c;相当于C:\Windows /usr/local #软件安装的目录&#xff0c;相当于C:\Progra…

跨境电商独立站深度分析演示网站

对于跨境电商卖家来说&#xff0c;多平台、多站点的布局是非常重要的战略。这样做可以规避”鸡蛋放在同一个篮子里”的风险也能够追求更高的销售额和利润。同时&#xff0c;市场的变化也带来了新的发展机会&#xff0c;因此很多出海企业都希望抓住独立站的新机遇&#xff0c;抢…

【华为数据之道学习笔记】6-4 打造数据供应的“三个1”

数据服务改变了传统的数据集成方式&#xff0c;所有数据都通过服务对外提供&#xff0c;用户不再直接集成数据&#xff0c;而是通过服务获取。因此&#xff0c;数据服务应该拉动数据供应链条的各个节点&#xff0c;以方便用户能准确地获取数据为重要目标。 数据供应到消费的完整…

【Linux笔记】文件和目录操作

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 ls (List): pwd (Print Working Directory): cp (Copy): mv (Move): rm (Remove): 结语 我的其他博客 前言 学习Linux命令…

开发知识点-HTML/JavaScript

HTML/JavaScript xlinksvgviewBoxuse基础预热与语法基础知识js 如何运行页面适用js 及输出 面向对象抽奖功能 json 支持 字符串转数组数组转字符串数组元素删除长度0位添加一个元素// 表示在下标为1处添加一项tttarray.splice(1,0,ttt)//[123,ttt,456]// 数组是否包含某个元素a…