Kafka如何实现每秒百万级高并发写入?

来源:mikechen的互联网架构


Kafka可以做到每秒百万级的超高并发写入,为什么"Kafka可以做到如此快",下面我就重点讲解Kafka高性能背后的4大核心原因


磁盘顺序写

Kafka 采用顺序写入日志文件的方式,这种方式比随机写入快得多。

为什么采用磁盘顺序写要快很多呢?如下图所示:

一般,完成一次磁盘 I/O(输入/输出)操作,通常需要经历以下三个主要步骤:寻道、旋转、和数据传输。

  1. 寻道:磁头从当前位置,移动到包含目标数据的轨道,这个过程可能需要几毫秒时间;

  2. 旋转:盘片旋转直到目标数据正好位于磁头下方,通常也需要几毫秒时间;

  3. 传输:磁头读取、或写入数据,数据通过磁盘接口传输到主存储器、或从主存储器传输到磁盘。

由于寻道时间、和旋转延迟,是机械硬盘中较为耗时的部分,如果减少这两者的操作,就会极大的提升数据“读和写”的性能。

怎么才能减少呢?那就是采用顺序写,如下图所示:

采用顺序写入,可以极大的减少了磁头移动、和盘片旋转所需的时间,而且,数据还可以连续地写入、或读取数据。

即使在固态硬盘(SSD)上,顺序写入也优于随机写入,尽管 SSD 没有机械运动部件,但其内部的闪存块管理、和写入放大效应也会使得顺序写入更加高效。


零拷贝

Kafka 的零拷贝技术是其高性能的关键因素之一,因为:零拷贝技术通过减少数据在内存中的复制次数,从而,提高了数据传输的效率。

在传统的数据传输过程中,数据从磁盘读取到应用程序的内存,再从应用程序的内存,写入到网络缓冲区,这涉及多次数据拷贝。

如下图所示:

上图的:“1”、和“2”就是涉及到多次数据拷贝,如果能减少拷贝次数,也必然会提升性能。

优化后,如下图所示:

减少了:“1”、和“2”的数据拷贝,直接从os cache把数据发送到了网卡,也就是说:数据直接从内核空间的文件缓存传输到网络缓冲区。

这样就减少了数据拷贝的次数,不需要:把 ”os cache 里的数据拷贝到应用缓存“,再从”应用缓存拷贝到 Socket 缓存“,减少了两次拷贝。

这样,Kafka 采用零拷贝技术,通过减少数据在内存中的复制次数,降低了 CPU 和内存带宽的负担,也显著提高了数据传输性能。


页缓存技术

Kafka 在写入磁盘文件时,可以利用操作系统的页缓存机制,从而实现先写入内存(即操作系统缓存)。

然后由操作系统,异步地将数据刷写到磁盘,这种方法提高了写入性能,减少了延迟。

如下图所示:

大致流程如下:

1、应用程序写入数据

Kafka 调用文件系统接口,将数据写入文件。

2、操作系统缓存

操作系统将数据写入页缓存,而不是立即写入磁盘。

3、异步刷写

操作系统在后台异步地将页缓存中的数据写入磁盘,这通常由操作系统的脏页写回(Dirty Page Writeback)机制来完成,定期将脏页写入磁盘。

通过以上利用页缓存步骤,Kafka 的写入操作可以快速完成,减少了写入延迟,提高了系统的吞吐量。


内存映射文件

Kafka 利用内存映射文件(Memory-Mapped Files),将磁盘上的数据直接映射到内存中,从而加快数据的访问速度。

使用操作系统提供的 mmap 系统调用,将文件的一部分、或全部内容,映射到进程的虚拟内存地址空间。

映射完成后,文件内容可以像访问普通内存一样直接进行读写操作,无需显式的文件 I/O 调用。

这种方式,利用操作系统的虚拟内存管理机制来高效地管理大量数据。

除此之外,Kafka还优化了:消息存储格式、协议、集群...等,从而做到了如此高性能。

以上

请使用浏览器的分享功能分享到微信等