kafka是存储到本地磁盘么_【漫画】Kafka是如何实现高性能的?

c9467001960c84f7966a22e447ca9233.png

ad0d549e427952ba597115a2297123c8.png

1efc72e914f827c52fd84ba444443993.png

98bebe6cb632087f2749eb1834526ad6.png

86d977ad730350c79e0d98561356db4b.png

4ac00c85b468e55db97759cdc1715469.png

e1fa881ba253d1a6ce9dba9c836c4ec3.png

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

Kafka中每个Topic都包含一个或多个Partition,不同Partition可位于不同节点。

同时Partition在物理上对应一个本地文件夹,每个Partition包含一个或多个Segment,每个Segment包含一个数据文件和一个与之对应的索引文件。

ea5bfa04344ae775abb665ab846f701d.png

一方面,由于不同Partition可位于不同机器,因此可以充分利用集群优势,实现机器间的并行处理。

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

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

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

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

5156cf66d32b545f3a2157b524c9bc31.png

而这个删除过程,并非通过使用“读-写”模式去修改文件,而是将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操作系统的一个特色。

8e5fe61e2c0325490bcd095f6a23d5e9.png

3691ed5820b34b44d51681f9524486e8.png
  • I/O Scheduler会将连续的小块写组装成大块的物理写从而提高性能
  • I/O Scheduler会尝试将一些写操作重新按顺序排好,从而减少磁盘头的移动时间
  • 读操作可直接在Page Cache内进行。如果消费和生产速度相当,甚至不需要通过物理磁盘(直接通过Page Cache)交换数据

Kafka收到数据后,写磁盘时只是将数据写入Page Cache,并不保证数据一定完全写入磁盘。

cf538d17d90fce22fcfe998d5e9e6aa2.png

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

零拷贝

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

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

761f0768623e89927945bb5296327a27.png


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部