同样是消息队列,Kafka凭什么速度那么快?


戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg


作者 | 邴越

来源 | 技术琐话

Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间,但是实际上,Kafka的特性之一就是高吞吐率。


即使是普通的服务器,Kafka也可以轻松支持每秒百万级的写入请求,超过了大部分的消息中间件,这种特性也使得Kafka在日志处理等海量数据场景广泛应用。


针对Kafka的基准测试可以参考,Apache Kafka基准测试:每秒写入2百万(在三台廉价机器上)


下面从数据写入和读取两方面分析,为什么Kafka速度这么快。


一、写入数据


Kafka会把收到的消息都写入到硬盘中,它绝对不会丢失数据。为了优化写入速度Kafka采用了两个技术, 顺序写入和MMFile 。


1、顺序写入


磁盘读写的快慢取决于你怎么使用它,也就是顺序读写或者随机读写。在顺序读写的情况下,磁盘的顺序读写速度和内存持平。


因为硬盘是机械结构,每次读写都会寻址->写入,其中寻址是一个“机械动作”,它是最耗时的。所以硬盘最讨厌随机I/O,最喜欢顺序I/O。为了提高读写硬盘的速度,Kafka就是使用顺序I/O。


而且Linux对于磁盘的读写优化也比较多,包括read-ahead和write-behind,磁盘缓存等。如果在内存做这些操作的时候,一个是JAVA对象的内存开销很大,另一个是随着堆内存数据的增多,JAVA的GC时间会变得很长,使用磁盘操作有以下几个好处:


  • 磁盘顺序读写速度超过内存随机读写

  • JVM的GC效率低,内存占用大。使用磁盘可以避免这一问题

  • 系统冷启动后,磁盘缓存依然可用


下图就展示了Kafka是如何写入数据的, 每一个Partition其实都是一个文件 ,收到消息后Kafka会把数据插入到文件末尾(虚框部分):


640?wx_fmt=png


这种方法有一个缺陷——没有办法删除数据 ,所以Kafka是不会删除数据的,它会把所有的数据都保留下来,每个消费者(Consumer)对每个Topic都有一个offset用来表示读取到了第几条数据 。


640?wx_fmt=png


两个消费者:


  • Consumer1有两个offset分别对应Partition0、Partition1(假设每一个Topic一个Partition);

  • Consumer2有一个offset对应Partition2。


这个offset是由客户端SDK负责保存的,Kafka的Broker完全无视这个东西的存在;一般情况下SDK会把它保存到Zookeeper里面,所以需要给Consumer提供zookeeper的地址。


如果不删除硬盘肯定会被撑满,所以Kakfa提供了两种策略来删除数据:


  • 一是基于时间;

  • 二是基于partition文件大小。


具体配置可以参看它的配置文档。


2、Memory Mapped Files


即便是顺序写入硬盘,硬盘的访问速度还是不可能追上内存。所以Kafka的数据并不是实时的写入硬盘 ,它充分利用了现代操作系统分页存储来利用内存提高I/O效率。


Memory Mapped Files(后面简称mmap)也被翻译成 内存映射文件 ,在64位操作系统中一般可以表示20G的数据文件,它的工作原理是直接利用操作系统的Page来实现文件到物理内存的直接映射。


完成映射之后你对物理内存的操作会被同步到硬盘上(操作系统在适当的时候)。


通过mmap,进程像读写硬盘一样读写内存(当然是虚拟机内存),也不必关心内存的大小有虚拟内存为我们兜底。


使用这种方式可以获取很大的I/O提升,省去了用户空间到内核空间复制的开销(调用文件的read会把数据先放到内核空间的内存中,然后再复制到用户空间的内存中。)


也有一个很明显的缺陷——不可靠,写到mmap中的数据并没有被真正的写到硬盘,操作系统会在程序主动调用flush的时候才把数据真正的写到硬盘。


Kafka提供了一个参数——producer.type来控制是不是主动flush,如果Kafka写入到mmap之后就立即flush然后再返回Producer叫 同步 (sync);写入mmap之后立即返回Producer不调用flush叫异步 (async)。


二、读取数据


Kafka在读取磁盘时做了哪些优化?


2、基于sendfile实现Zero Copy


传统模式下,当需要对一个文件进行传输的时候,其具体流程细节如下:


  • 调用read函数,文件数据被copy到内核缓冲区

  • read函数返回,文件数据从内核缓冲区copy到用户缓冲区

  • write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。

  • 数据从socket缓冲区copy到相关协议引擎。


以上细节是传统read/write方式进行网络文件传输的方式,我们可以看到,在这个过程当中,文件数据实际上是经过了四次copy操作:


硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎


而sendfile系统调用则提供了一种减少以上多次copy,提升文件传输性能的方法。


在内核版本2.1中,引入了sendfile系统调用,以简化网络上和两个本地文件之间的数据传输。sendfile的引入不仅减少了数据复制,还减少了上下文切换。


sendfile(socket, file, len);


运行流程如下:


  • sendfile系统调用,文件数据被copy至内核缓冲区

  • 再从内核缓冲区copy至内核中socket相关的缓冲区

  • 最后再socket相关的缓冲区copy到协议引擎


相较传统read/write方式,2.1版本内核引进的sendfile已经减少了内核缓冲区到user缓冲区,再由user缓冲区到socket相关缓冲区的文件copy,而在内核版本2.4之后,文件描述符结果被改变,sendfile实现了更简单的方式,再次减少了一次copy操作。


在Apache、Nginx、lighttpd等web服务器当中,都有一项sendfile相关的配置,使用sendfile可以大幅提升文件传输性能。


Kafka把所有的消息都存放在一个一个的文件中,当消费者需要数据的时候Kafka直接把文件发送给消费者,配合mmap作为文件读写方式,直接把它传给sendfile。


2、批量压缩


在很多情况下,系统的瓶颈不是CPU或磁盘,而是网络IO,对于需要在广域网上的数据中心之间发送消息的数据流水线尤其如此。进行数据压缩会消耗少量的CPU资源,不过对于kafka而言,网络IO更应该需要考虑。


  • 如果每个消息都压缩,但是压缩率相对很低,所以Kafka使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩

  • Kafka允许使用递归的消息集合,批量的消息可以通过压缩的形式传输并且在日志中也可以保持压缩格式,直到被消费者解压缩

  • Kafka支持多种压缩协议,包括Gzip和Snappy压缩协议


三、总结


Kafka速度的秘诀在于,它把所有的消息都变成一个批量的文件,并且进行合理的批量压缩,减少网络IO损耗,通过mmap提高I/O速度,写入数据的时候由于单个Partion是末尾添加所以速度最优;读取数据的时候配合sendfile直接暴力输出。


640?wx_fmt=png


640?wx_fmt=png


福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


推荐阅读:

  • 苹果宣布加入CNCF;华为要求美国运营商支付专利费;微软删除最大的公开人脸识别数据集

  • 如何给老婆解释什么是微服务?

  • 阿里巴巴杨群:高并发场景下Python的性能挑战

  • 那些去德国的程序员后来怎么样了?

  • 新技术“红”不过十年,半监督学习为什么是个例外?

  • 独家对话V神! 质疑之下的以太坊路在何方?


640?wx_fmt=png真香,朕在看了!

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

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

相关文章

企业实战_10_Mycat集成ZK实现配置同步

主机名IP地址角色数据库mycat192.168.43.32MYCAT ,MYSQL,ZKmycat(全局自增id)node1192.168.43.104ZKMYSQLorder_db01和order_db01node2192.168.43.217ZK,MYSQLorder_db03和order_db04node3192.168.43.172MYCAT ,MYSQLmycat(全局自增id&#x…

亚马逊重组游戏开发部门:数个未发布游戏被“扼杀”;台积电明年开始为苹果iPhone生产5nm处理器……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 盒马送餐机器人、无人化再进…

psp中java,PSP编程概述

元旦准备买NDS,顺带关注了下PSP,其实是想,或许买PSP也不错~PSP很像一个平台,提供了很多东西,譬如官方的PS模拟器~在上面编程也是个不错的想法。国外的一个网站提供了很多信息,PS2Dev Network (http://www.p…

企业实战_18_MyCat_ZK集群安装部署

接上一篇:企业实战_17_MyCat水平扩展_跨分片查询_ER分片 https://gblfy.blog.csdn.net/article/details/100066013 文章目录一、使用ZK记录Mycat的配置1. 操作步骤2. 服务器部署分布二、zk集群安装部署2.1. 安装jdk并验证2.2. ZK下载2.3. node1下载同步zk2.4. 基础配…

分布式精华问答 | 分布式与集群的区别是什么?

什么是分布式计算?所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。1Q:…

Mycat设置开机自启

接上一篇:实战_21_Mycat_MySql更新数据库失败 --read-only https://blog.csdn.net/weixin_40816738/article/details/100059688 下载mycat wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz解压即安装mycat tar -zxf Mycat…

最近,京东AR又爆出哪般神奇?

戳蓝字“CSDN云计算”关注我们哦!作者 | 刘晶晶只用一部手机就可在线“试用”口红,效果堪比美妆男主李佳琪,厉不厉害?只要轻轻一点就可一目了然购买的家具在家中摆放的效果怎样,神不神奇?时间飞快&#xff…

zookeeper开机自启动

编辑rc.local vim /etc/rc.d/rc.local2.需要指定jdk路径以及zookeeper启动路径 export JAVA_HOME/app/jdk1.8.0_144 /app/zookeeper-3.4.11/bin/zkServer.sh start3. 启动zookeeper cd /app/zookeeper-3.4.11/bin ./zkServer.sh start查看zk启动状态 /app/zookeeper-3.4.11…

10分钟读懂什么是容器云?

戳蓝字“CSDN云计算”关注我们哦!作者 | 宝哥devops运维来源 | http://t.cn/ECwSNgj容器技术是近几年云行业发展中不可缺少的一环。Docker和k8s的大热极大可能会推动云计算PAAS层的完善和普及。那么容器云到底是怎样的技术形态?究竟是概念还是可落地的应…

企业实战_19_MyCat初始化ZK并配置Mycat支持ZK

接上一篇:企业实战_18_MyCat_ZK集群安装部署 https://gblfy.blog.csdn.net/article/details/100075631 文章目录一、初始化集群中的数据1. 配置复制2. 初始化zookeeper集群中的数据二、验证数据是否被初始化到集群中2.1. 进入mycat01服务节点2.2. 使用ls命令查看当前…

Hadoop精华问答 | 基于Hadoop的数据中心有什么好处?

戳蓝字“CSDN云计算”关注我们哦!2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce。到现在的13个年头,这个单词代表的是“核心”,今天我们就来看看关于Hadoop的精华问答。1Q:基于Hadoop的数据中心有什么好处&…

企业实战_20_MyCat使用HAPpoxy对Mycat负载均衡

上一篇:企业实战_19_MyCat初始化ZK并配置Mycat支持ZK https://gblfy.blog.csdn.net/article/details/100087824 解决了引入多个mycat节点之间配置文件信息同步问题 如何在多个mycat之间进行负载均衡的问题? 在某一个mycat节点出现宕机之后,我…

安全,从写第一行代码开始!

戳蓝字“CSDN云计算”关注我们哦!作者 | 刘晶晶伴随5G时代的脚步渐进,物联网发展也将成井喷式增长,“网络安全”这个老生常谈的话题似乎进入了新阶段。数据是天使?还是魔鬼?归根结底,没有安全保障的物联网终…

Linux zookeeper下载、单点部署

说明地址ziphttp://mirror.bit.edu.cn/apache/zookeeper/stable/apache-zookeeper-3.5.5-bin.tar.gz命令下载wget http://mirror.bit.edu.cn/apache/zookeeper/stable/apache-zookeeper-3.5.5-bin.tar.gz http://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zoo…

聚科技精英,享开源之美- 2019 Open Source Summit 主题演讲+项目亮点

2019年6月24-26日,在上海世博中心,由Linux基金会主办的LinuxCon ContainerCon CloudOpen大会(简称LC3)将与CNCF主办的KubeCon CloudNativeCon大会合体,自此,大会正式更名为KubeCon CloudNativeCon Ope…

_Mycat-Web之UI监控

接上一篇:企业实战_19_Mycatkeepalived 安装配置验证 https://blog.csdn.net/weixin_40816738/article/details/100103518 文章目录1、zip下载2、wget 下载方式3、解压4、在安装mycat-web之前首先要安装一下5、设置zookeeper服务路径6、启动mycat-web7、浏览器验证8…

企业实战_21_MyCat_keepalived 安装配置验证

接上一篇:企业实战_20_MyCat使用HAPpoxy对Mycat负载均衡 https://gblfy.blog.csdn.net/article/details/100087884 主机名IP地址角色mycat192.168.43.32MYCAT MYSQL,ZK,Haproxy,Keepalivednode1192.168.43.104MYSQL,ZKnode2192.168.43.217MYSQL,ZKnode3192.168.43.1…

为什么说 5G 是物联网的时代?

受 5G 冲击最大的领域终将会是谁?作者 | 屠敏 整理出品 | CSDN(ID:CSDNnews)提及当前科技圈有哪些热点词,那 5G 必是其中之一。6 月 6 日,工业和信息化部正式向中国移动、中国联通、中国电信和中国广电发布…

企业实战_24_MyCat实现读写分离

接上一篇:企业实战_23_MyCat SQL防火墙 https://gblfy.blog.csdn.net/article/details/100074335 文章目录一、MyCat读写分离操作流程二、环境部署安排:三、主机操作103(node3)3.1. 数据备份3.2. 将node3.sql复制到节点53.3. 导入数据3.4. 在查看是否创建…

Storm精华问答 | 为什么要用Storm?不用Spark?

戳蓝字“CSDN云计算”关注我们哦!Apache Storm是一个分布式实时大数据处理系统。Storm设计用于在容错和水平可扩展方法中处理大量数据。它是一个流数据框架,具有最高的摄取率。今天,我们就挑一些Storm的安装配置问题来看看吧。1Q:…