高吞吐低延迟的高并发、高性能的KAFKA原理
kafka在大数据领域有着极其广泛的应用。一个配置好的kafka集群能够达到几十万甚至上百万的并发写入。
kafka的这种高性能可以从两个方面来进行描述:
写
在kafka进行数据写入时,采用 页缓存技术和磁盘顺序写。
页缓存技术:
在kafka每次接收到数据都会往上磁盘进行写数据。
但是这样是有一个问题:把数据写入到磁盘上,这样的工作效率是很低的。
在kafka中,已经解决掉了这个问题,采用的是:页缓存技术。
如上图所示:在kafka把数据写入到磁盘之前,先写入到一块叫page cache的缓存中。
page cache:操作系统本身有一层缓存,叫做 page cache ,是内存里的缓存,也可以称之为 OS cache 。即操作系统自己管理的缓存。
在kafka中是把消息写入到OS cache缓存中,也仅仅是写入到OS cache 中,然后由这块内存自己来决定什么时候来写入到磁盘中。
磁盘顺序写:
将数据追加到文件的末尾,而不是随便找到位置来写入。
对于普通的机械硬盘来说,如果随机找位置进行数据的写入,性能会极差。如果是采用顺序的方式进行写入数据,其性能堪比写内存。
所以如上图所示:
1.kafka在写数据时,基于OS层面的page cache 来进行写入,其实质就是写入内存,性能极高。
2.另一方面,kafka采用顺序写的方式,即使数据刷新到磁盘的时候,其性能也是可以堪比写内存的。
以上两点使kafka在写数据方面性能极高。
读
kafka在写方面进行设置性能优化,同样在读方面也进行了设置优化—零拷贝技术
我们把数据给kafka进行数据写入,当我们需要数据的时候也是从kafka中进行读数据进行消费。
消费的实际过程:从kafka的磁盘文件中读取到某条文件然后给消费者。
如果kafka不进行读取数据的优化,就像上图一样,消费者的数据是从磁盘文件中获得即:
在读取数据时,先从OS cache中获得数据,没有则从磁盘文件中得到数据后放入到OS cache中。然后操作系统将OS cache中拷贝到应用进程缓存中,然后再从应用进程缓存中拷贝到Socket缓存中(两次拷贝),最后把数据从Socket缓存中发送到网卡,网卡发送给消费者进行消费。如下图:
在上图,能看到两次拷贝,这两次拷贝是没有必要的,并且会影响到性能。
在kafka中,对这两次拷贝进行了优化—零拷贝技术
即直接让操作系统的OS cache中的数据发送给消费者,直接跳过两次拷贝数据。在Scoket缓存中,仅仅是会存储一个描述,不会把数据拷贝到Socket缓存中。
零拷贝技术:不用再把数据拷贝到应用进程缓存中,再拷贝到Scoket缓存中,省略了两次拷贝。
对Scoket缓存仅仅是拷贝了拷贝数据的描述符过去,数据直接发送给了网卡给了消费者,这样大大提升了数据消费读取文件数据的性能。
综上:
经过良好调优后的kafka集群,可以实现把数据直接缓存到OS cache内存中,然后读数据直接从OS cache中进行读取。整个过程都在内存中进行数据的存储和读取,集群的整体性能会极高。