Kafka的高速磁盘访问能力是如何实现的?
我们知道,Kafka有以下特性:
时间复杂度O(1)的方式提供消息持久化能力,即使对TB以上的数据也能保证常数时间的访问性能。
如何实现的呢?
概括来说,有以下三点:
1,磁盘线性写入,或者从Kafka应用程序的角度来说是消息顺序追加。
怎么理解呢?什么是磁盘线性写入?什么是消息顺序追加?
磁盘的读写分为随机读写和线性读写。线性读写的效率比随机读写快6000倍。Kafka在设计时采用了文件追加的方式来写入消息,即只能在日志文件的尾部追加新的消息,并且不允许修改已经写入的消息。这样就可以利用磁盘的线性读写来提高磁盘访问速度。
2,磁盘页缓存
什么是页缓存?
页缓存是磁盘缓存。
页缓存是操作系统实现的磁盘缓存。
页缓存的目的是为了减少对磁盘的IO操作。
具体来说就是把磁盘的数据缓存到内存中,把对磁盘的访问变成对内存的访问。Kafka中大量使用了页缓存,这是Kafka实现高吞吐的关键因素之一。
3,零拷贝
什么是零拷贝?
零拷贝是一种避免CPU将数据从一块存储拷贝到另外一块存储的技术。零拷贝可以有效的改善数据传输的性能,在内核驱动程序处理IO数据的时候,零拷贝技术可以在某种程度上减少不必要的CPU拷贝操作。