Kafka是如何实现高性能的

原创:享学课堂讲师
转发请注明出处

Kafka是一个单机支持百万吞吐的高效中间件,在互联网领域经常将它用作消息队列,那么Kafka是如何实现这么性能的呢?

宏观架构层面利用Partition实现并行处理

Kafka中每个Topic都包含一个或多个Partition,不同Partition可位于不同节点。同时Partition在物理上对应一个本地文件夹,每个Partition包含一个或多个Segment,每个Segment包含一个数据文件和一个与之对应的索引文件。在逻辑上,可以把一个Partition当作一个非常长的数组,可通过这个“数组”的索引(offset)去访问其数据。

一方面,由于不同Partition可位于不同机器,因此可以充分利用集群优势,实现机器间的并行处理。另一方面,由于Partition在物理上对应一个文件夹,即使多个Partition位于同一个节点,也可通过配置让同一节点上的不同Partition置于不同的磁盘上,从而实现磁盘间的并行处理,充分发挥多磁盘的优势。

具体实现层面高效使用磁盘特性和操作系统特性

将写磁盘的过程变为顺序写

Kafka的整个设计中,Partition相当于一个非常长的数组,而Broker接收到的所有消息顺序写入这个大数组中。同时Consumer通过Offset顺序消费这些数据,并且不删除已经消费的数据,从而避免了随机写磁盘的过程。

由于磁盘有限,不可能保存所有数据,实际上作为消息系统Kafka也没必要保存所有数据,需要删除旧的数据。而这个删除过程,并非通过使用“读-写”模式去修改文件,而是将Partition分为多个Segment,每个Segment对应一个物理文件,通过删除整个文件的方式去删除Partition内的数据。这种方式清除旧数据的方式,也避免了对文件的随机写操作。

在存储机制上,使用了Log Structured Merge Trees(LSM) 。

注:Log Structured Merge Trees(LSM),谷歌 “BigTable” 的论文,中提出,LSM是当前被用在许多产品的文件结构策略:HBase, Cassandra, LevelDB, SQLite,Kafka。LSM被设计来提供比传统的B+树或者ISAM更好的写操作吞吐量,通过消去随机的本地更新操作来达到这个目标。这个问题的本质还是磁盘随机操作慢,顺序读写快。这二种操作存在巨大的差距,无论是磁盘还是SSD,而且快至少三个数量级。

充分利用Page Cache

Page Cache,其中文名称为页高速缓冲存储器,简称页高缓。page cache的大小为一页,通常为4K。在Linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问。 是Linux操作系统的一个特色。

使用Page Cache的好处如下

- I/O Scheduler会将连续的小块写组装成大块的物理写从而提高性能

- I/O Scheduler会尝试将一些写操作重新按顺序排好,从而减少磁盘头的移动时间

- 充分利用所有空闲内存

- 读操作可直接在Page Cache内进行。如果消费和生产速度相当,甚至不需要通过物理磁盘(直接通过Page Cache)交换数据

Kafka收到数据后,写磁盘时只是将数据写入Page Cache,并不保证数据一定完全写入磁盘。从这一点看,可能会造成机器宕机时,Page Cache内的数据未写入磁盘从而造成数据丢失。但是这种丢失只发生在机器断电等造成操作系统不工作的场景,而这种场景完全可以由Kafka层面的复制机制去解决。如果为了保证这种情况下数据不丢失而强制将Page Cache中的数据Flush到磁盘,反而会降低性能。

如果数据消费速度与生产速度相当,甚至不需要通过物理磁盘交换数据,而是直接通过Page Cache交换数据。同时,Follower从Leader Fetch数据时,也可通过Page Cache完成。

零拷贝

Kafka中存在大量的网络数据持久化到磁盘(Producer到Broker)和磁盘文件通过网络发送(Broker到Consumer)的过程。这一过程的性能直接影响Kafka的整体吞吐量。

而Linux 2.4+内核通过sendfile系统调用,提供了零拷贝。数据通过DMA拷贝到内核态Buffer后,直接通过DMA拷贝到NIC Buffer,无需CPU拷贝。这也是零拷贝这一说法的来源。除了减少数据拷贝外,因为整个读文件-网络发送由一个sendfile调用完成,整个过程只有两次上下文切换,因此大大提高了性能。

从具体实现来看,Kafka的数据传输通过Java NIO的FileChannel的transferTo和transferFrom方法实现零拷贝。

在线直播教学课程:

双11技术复盘 高并发秒杀系统解密
app存活心得 我真的还想再活五百年

喜欢请关注「享学课堂online」官方账号
第一时间获取最新资讯信息哟~

发布了137 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/EnjoyEDU/article/details/104244714