为什么读写这么快

Kafka的快是从底层设计、到充分利用硬件、系统、压缩等特性,综合产生的结果。
从以下几个方面解释:
1、磁盘读写原理
2、利用Pagecache+mmap
3、零拷贝
4、存储设计
5、批量读写
6、批量压缩
7、消息写入过程
8、消息读取过程

1、磁盘读写原理

一次访盘请求(读/写)完成过程由三个动作组成:
1、寻道时间:磁头移动到指定磁道
2、旋转时间:等待指定扇区从磁头下旋转而过
3、数据传输时间:数据在磁盘、内存与网络之间到实际传输

Kafka根据数据的局部性原理,有以下两种方法提高磁盘的读写效率

1、预读或者提前读;
2、合并写——多个逻辑上的写操作合并成一个大的物理写操作中
即采用磁盘顺序读写(不需要寻道时间,只需很少的旋转时间)

2、利用Pagecache+mmap

Pagecache:

以Page为单位,缓存文件内容。缓存在PageCache中的文件数据,能够更快地被用户读取。同时对于带buffer的写入操作,数据在写入到PageCache中即可立即返回,而不需要等待数据被持久化到磁盘,进而提高了上层应用读写文件到整体性能。
利用pagecache的好处是什么:
1、避免broker的内存消耗
2、避免GC问题
3、应用重启数据不会丢失
相比于JVM或者In-memory cache,page cache的优势
1、首先,操作系统层面的的缓存利用率更高,因为存储的是紧凑的字节结构而不是独立的对象
2、其次,操作系统本身也对于PageCache做了大量优化,提供了write-behind、read-ahead以及flush等多种机制
3、再者,即使服务进程重启,系统缓存依然不会消失,避免了in-process cache重建缓存的过程

Mmap是什么

内存文件映射,其实就是把物理上的磁盘文件的一些地址和page cache地址进行一层映射,使得进程像读写磁盘一样读写内存,定时os帮助我们将数据刷写到磁盘。30s

3、零拷贝

想要明白必须要了解linux的用户态、内核态、以及磁盘的数据是如何通过网卡发送到消费者的。
应用程序要将磁盘数据通过网卡发出去非零拷贝需要:
1、操作系统将数据从磁盘拷贝到内核区的pagecache
2、用户程序将内核区的pagecache拷贝到用户区缓存
3、用户程序将用户区的缓存拷贝到socket缓存中
4、操作系统将socket缓存中的数据拷贝到网卡到buffer上发送数据
一次IO请求操作进行了2次上下文切换和4次系统调用,而同一份数据在缓存中多次拷贝,实际上完全可以直接在内核中进行,也就是省去2、3步骤

4、存储设计

1、topic进行分区,也即是分成partition
2、partition为了方便超时删除等管理,又进一步划分segment
3、每个segment又包括了index文件和log文件,可以二分查找快速定位数据
4、segment数据只允许追加的形式
5、offset是连续的支持预读和批量写

5、批量发送

很多情况下,系统的瓶颈不是cpu,内存、磁盘io,而是网络IO,为了减少网络通信的次数,往往需要批量发送
kafka支持batch.size消息条数积累到阈值,立即发送
kafka支持linger.ms不管消息是否有积累足够条数,超过该时间就立即发送

6、压缩

对于消息队列很多情况下,系统的瓶颈不是cpu、内存、磁盘io,而是网络IO
1、kafka使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩
2、kafka允许使用递归的消息集合,批量的消息可以通过压缩的形式传输并且在日志中也可以保持压缩格式,直到被消费者解压缩
3、kafka支持多种压缩协议,包括gzip和snappy压缩协议

7、消息写的过程

kafka生产者发送批量压缩的数据到broker,broker通过MappedByteBuffer的map()函数映射其地址到你的虚拟内存地址。接着就可以对这个MappedByteBuffer执行写入操作。写入的时候,他会直接进入PageCache中,然后过一段时间,由os的线程异步刷入到磁盘中。
只有一次数据拷贝的过程,其实就是从PageCache里拷贝到磁盘文件里而已,这个就是使用mmap技术之后,相比于传统磁盘IO的一个性能优化

8、消息读的过程

读取数据时,会先判断page cache中是否存在,存在就直接从page cache中消费,所以消费实时数据就快很多(因为数据是写到page cache再被定时刷到磁盘的),但是消费历史数据就不得不将历史数据重新加载到page cache,而且会污染掉page cache

PageCache技术加载历史数据的时候,还会将你加载的数据快的临近的其他数据块也一起加载到PageCache里去,这其实就是一个预读的过程,对于连续读取历史数据的,也是性能的不小优化。

为什么这么能存

从存储机制和物理结构角度分析
1、topic中partition存储分布
2、partition中文件存储方式
3、partition中segment文件存储结构
4、在partition中如何通过offset查找message