Kafka高效读写数据的原因及如何提升Kafka的吞吐量

 更新时间:2026年05月02日 15:33:08   作者:ha_lydms  
本文主要介绍了Kafka的高效读写数据的原因及如何提升Kafka的吞吐量,Kafka通过分区、稀疏索引等零拷贝等技术提高了读写效率,增加缓冲区大小、调整batch、linger等参数可以提升生产者端的吞吐量,调整fetch.max.size等max.poll.records等参数可以提升消费者端的吞吐量

1、Kafka 为什么能高效读写数据

  • 1)Kafka 本身是分布式集群,可以采用分区技术,并行度高

  • 2)读数据采用稀疏索引,可以快速定位要消费的数据

  • 3)顺序写磁盘

Kafka 的 producer 生产数据,要写入到 log 文件中,写的过程是一直追加到文件末端,

为顺序写。官网有数据表明,同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。这

与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。

  • 4)页缓存+ 零拷贝技术

2、副本数设定

一般我们设置成2个或3个,很多企业设置为2个。

副本的优势:提高可靠性;副本劣势:增加了网络IO传输。

3、如何提升吞吐量

如何提升吞吐量?

  • 1)提升生产吞吐量

    • (1)buffer.memory:发送消息的缓冲区大小,默认值是32m,可以增加到64m。
    • (2)batch.size:默认是16k。如果batch设置太小,会导致频繁网络请求,吞吐量下降;如果batch太大,会导致一条消息需要等待很久才能被发送出去,增加网络延时。
    • (3)linger.ms,这个值默认是0,意思就是消息必须立即被发送。一般设置一个5-100毫秒。如果linger.ms设置的太小,会导致频繁网络请求,吞吐量下降;如果linger.ms太长,会导致一条消息需要等待很久才能被发送出去,增加网络延时。
    • (4)compression.type:默认是none,不压缩,但是也可以使用lz4压缩,效率还是不错的,压缩之后可以减小数据量,提升吞吐量,但是会加大producer端的CPU开销。
  • 2)增加分区

  • 3)消费者提高吞吐量

    • (1)调整fetch.max.bytes大小,默认是50m。
    • (2)调整max.poll.records大小,默认是500条。

4、Kafka丢不丢数据

  • 1)Producer角度

    • acks=0,生产者发送过来数据就不管了,可靠性差,效率高;
    • acks=1,生产者发送过来数据Leader应答,可靠性中等,效率中等;
    • acks=-1,生产者发送过来数据Leader和ISR队列里面所有Follwer应答,可靠性高,效率低;
    • 在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;acks=-1,一般用于传输和钱相关的数据,对可靠性要求比较高的场景。
  • 2)Broker角度

    • 副本数大于等于2。
    • min.insync.replicas大于等于2。

5、Kafka数据重复

去重 = 幂等性 + 事务

1)幂等性配置参数

参数名称描述
enable.idempotence是否开启幂等性,默认true,表示开启幂等性。
max.in.flight.requests.per.connection1.0.X版本前,需设置为1,1.0.X之后,小于等于5
retries失败重试次数,需要大于0
acks需要设置为all

2)Kafka的事务一共有如下5个API

// 1初始化事务
void initTransactions();

// 2开启事务
void beginTransaction() throws ProducerFencedException;

// 3在事务内提交已经消费的偏移量(主要用于消费者)
void sendOffsetsToTransaction(Map<TopicPartition, OffsetAndMetadata> offsets,
                              String consumerGroupId) throws ProducerFencedException;

// 4提交事务
void commitTransaction() throws ProducerFencedException;

// 5放弃事务(类似于回滚事务的操作)
void abortTransaction() throws ProducerFencedException;

3)小结

  • (1)生产者角度
    • acks设置为-1 (acks=-1)。
    • 幂等性(enable.idempotence = true) + 事务 。
  • (3)broker服务端角度
    • 分区副本大于等于2 (–replication-factor 2)。

    • ISR里应答的最小副本数量大于等于2 (min.insync.replicas = 2)。

    • (3)消费者

      • 事务 + 手动提交offset (enable.auto.commit = false)。
      • 消费者输出的目的地必须支持事务(MySQL、Kafka)。

总结

 本文主要介绍了Kafka的高效读写数据的原因及如何提升Kafka的吞吐量,Kafka通过分区、稀疏索引等零拷贝等技术提高了读写效率,提升吞吐量可以从生产者和消费者两个方面入手,增加缓冲区大小、调整batch、linger等参数可以提升生产者端的吞吐量,调整fetch.max.size等max.poll.records等参数可以提升消费者端的吞吐量,Kafka在生产者、Broker和消费者三个角度都有措施保证数据不丢失,Kafka通过开启幂等性、事务等措施保证数据去重和幂等性。

到此这篇关于Kafka高效读写数据的原因及如何提升Kafka的吞吐量的文章就介绍到这了,更多相关Kafka提高读写效率内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • DeveloperSharp 高效分页使用详解

    DeveloperSharp 高效分页使用详解

    这篇文章主要为大家介绍了DeveloperSharp 高效分页使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 聚合函数和group by的关系详解

    聚合函数和group by的关系详解

    大家好,本篇文章主要讲的是聚合函数和group by的关系详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Navicat恢复数据库连接及查询sql的完美解决办法

    Navicat恢复数据库连接及查询sql的完美解决办法

    因为公司给电脑加域,导致使用新的用户账户,原先的很多配置都失效了,这篇文章主要介绍了Navicat恢复数据库连接及查询sql的解决办法,需要的朋友可以参考下
    2023-08-08
  • DBeaver执行外部sql文件详细图文教程

    DBeaver执行外部sql文件详细图文教程

    DBeaver最近才使用,以前使用的PL/SQL,有些不是很熟悉,记录下来,下面这篇文章主要给大家介绍了关于DBeaver执行外部sql文件的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • sql小计汇总 rollup用法实例分析

    sql小计汇总 rollup用法实例分析

    rollup在oracle ,sql-server里面都有有。
    2009-06-06
  • Navicat图形化界面之Navicat Premium 12 安装与使用教程

    Navicat图形化界面之Navicat Premium 12 安装与使用教程

    Navicat premium 是一款数据库管理工具,它可以让你以单一程式同时连线到 MySQL、SQLite、Oracle 及 PostgreSQL 资料库,让管理不同类型的资料库更加的方便,下面通过本文给大家介绍Navicat Premium 12 安装使用教程,需要的朋友参考下吧
    2021-12-12
  • 图文详解如何用IDEA和Navicat导入导出数据库

    图文详解如何用IDEA和Navicat导入导出数据库

    这篇文章主要介绍了如何用IDEA和Navicat导入导出数据库的相关资料,包括使用数据库工具界面或mysqldump命令,并提示MySQL版本兼容性问题及Navicat导出文件不带注释的原因,需要的朋友可以参考下
    2025-06-06
  • 介绍PostgreSQL中的Lateral类型

    介绍PostgreSQL中的Lateral类型

    这篇文章主要介绍了介绍PostgreSQL中的Lateral类型,Lateral是PostgreSQL9.3版本以来加入的内置类型,需要的朋友可以参考下
    2015-04-04
  • 如何在一个千万级的数据库查询中提高查询的效率?

    如何在一个千万级的数据库查询中提高查询的效率?

    今天小编就为大家分享一篇关于如何在一个千万级的数据库查询中提高查询的效率?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • SQL WHERE IN参数化编译写法简单示例

    SQL WHERE IN参数化编译写法简单示例

    这篇文章主要给大家介绍了关于SQL WHERE IN参数化编译写法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11

最新评论