原创 闭关学习一周kafka,原来他这么快是有原因的!

发布时间:2021-06-24 04:32:37 浏览 1673 来源:猿笔记 作者:麒麟才子

    也可通过配置让同一节点上的不同Partition置于不同的磁盘上。从而实现磁盘间的并行处理?那磁盘读写的速度可以控制吗。那就先简单扯扯磁盘/IO的那些事,如何根据磁盘I/O特性来进行系统设计:硬盘内部主要部件为磁盘盘片、传动手臂、读写磁头和主轴马达,实际数据都是写在盘片上,然后传动手臂可伸展让读取头在盘片上进行读写操作,影响磁盘的关键因素是磁盘服务时间,机械硬盘的连续读写性能很好。这主要是因为磁头移动到正确的磁道上需要时间,磁盘读写的快慢取决于你怎么使用它,实际上作为消息系统Kafka也没必要保存所有数据。每个Segment对应一个物理文件。


    前言

    -

    无论卡夫卡是MQ还是存储层,它都有两个功能(这么简单),一个是生产者产生的数据存储在代理中,另一个是消费者从代理中读取数据。那么卡夫卡的速度在阅读和写作上都有体现。先说卡夫卡快的原因。

    1\\.利用Partition实现并行处理

    --------------------

    众所周知,卡夫卡是一个Pub-Sub消息系统,无论是发布还是订阅都要指定Topic。

    Topic只是一个逻辑的概念。每个Topic都包含一个或多个Partition,不同Partition可位于不同节点。

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

    如果能并行的话,速度肯定会提高,很多工人肯定比一个工人快。

    可以并行写入不同的磁盘?读写磁盘的速度可以控制吗?

    然后简单的先拉一下磁盘/IO的东西

    # # #卡夫卡为什么这么快?高效读写数据,原来是这样的

    硬盘性能的制约因素是什么?如何根据磁盘I/O的特点设计系统?

    硬盘内部的主要部件是磁盘盘片、传输臂、读写头和主轴电机。实际数据写入光盘,读写主要由传输臂上的读写头完成。在实际操作中,主轴旋转磁盘,然后传动臂可以伸出,允许读取头在磁盘上读写。磁盘的物理结构如下图所示:

    由于单个磁盘的容量有限,一般硬盘有两个以上的磁盘,每个磁盘都有两面,可以记录信息,所以一个磁盘对应两个磁头。圆盘被分成许多扇形区域,每个区域被称为一个扇区。在圆盘表面,不同半径的同心圆称为轨迹,不同圆盘半径相同的轨迹组成的圆柱体称为圆柱体。轨道和圆柱是半径不同的圆。在许多情况下,履带和油缸可以互换使用。磁盘的垂直视角如下图所示:

    # # #影响磁盘的关键因素是什么?

    影响磁盘的关键因素是磁盘服务时间,即磁盘完成一个I/O请求所需的时间,由寻道时间、旋转延迟和数据传输时间三部分组成。

    机械硬盘连续读写性能好,随机读写性能差,主要是磁头移动到正确磁道需要时间。随机读写时,磁头需要不断移动,时间浪费在寻址磁头上,性能不高。IOPS和吞吐量是衡量磁盘的关键指标。

    在很多开源框架中,比如卡夫卡和糖化血红蛋白,通过额外写入的方式,尽可能将随机I/O转换为顺序I/O,以减少寻址时间和轮换延迟,最大化IOPS。

    感兴趣的同学可以看看磁盘I/O。

    磁盘读写的速度取决于你如何使用,即顺序读写还是随机读写。

    2\\.顺序写入磁盘

    ------

    ###Kafka的分区

    * *卡夫卡中的每一个分区都是一个有序的、不可变的消息序列* *,新的消息不断追加到分区的末尾,这就是所谓的顺序写入。

    由于磁盘有限,不可能保存所有数据。事实上,作为一个消息系统,卡夫卡不需要保存所有的数据,只需要删除旧的数据。因为顺序写入,卡夫卡在使用各种删除策略删除数据的时候,并不是使用“读写”模式来修改文件,而是将Partition分成多个Segment,每个Segment对应一个物理文件,通过删除整个文件来删除Partition中的数据。这样就清除了旧数据,也避免了对文件的随机写入操作。

    3\\.充分利用PageCache

    ----------------

    引入Cache层的目的是为了提高Linux操作系统访问磁盘的性能。缓存层将磁盘上的一些数据缓存在内存中。当数据请求到达时,如果数据存在于缓存中并且是最新的,则数据被直接传输到用户程序,这避免了在底层磁盘上的操作并提高了性能。缓存层也是磁盘IOPS能够超过200的主要原因之一。

    在Linux的实现中,文件Cache分为两个层面,一是PageCache,另一个BufferCache,每一个PageCache包含若干BufferCache。PageCache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。BufferCache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。

    ###使用PageCache的好处:

    * I/* I/OS scheduler会将连续的小写入组装成大的物理写入,以提高性能

    * I/* I/OSC scheduler将尝试按顺序重新排列一些写操作,从而减少磁盘磁头的移动时间

    *充分利用所有空闲内存(不是JVM内存)。如果使用应用层缓存(JVM堆内存),会增加GC负担

    *读取操作可以直接在页面缓存中执行。如果消耗和生产速度相等,您甚至不需要通过物理磁盘

作者信息

麒麟才子 [等级:3] 公众号:麒麟改bug
发布了 93 篇专栏 · 获得点赞 465 · 获得阅读 29298

相关推荐 更多