在數(shù)據(jù)為王的時代,對于海量數(shù)據(jù)的存儲、傳輸、分析變得尤為重要。在數(shù)據(jù)的存儲上有clickhouse、Hbase等大數(shù)據(jù)庫來完成,在數(shù)據(jù)的分析上一般也是借助clickhouse或hbase的特性將數(shù)據(jù)分維度進行,而在數(shù)據(jù)的傳輸上,大家都不約而同使用了Kafka。高并發(fā)、高性能、快速成為了Kafka的代名詞。

Kafka+clickhouse+zookeeper成為了大數(shù)據(jù)分析處理行業(yè)的三件套,不過今天我們只聊Kafka,你所知道的一線大廠,如阿里、百度、騰訊、頭條、美團、滴滴等,均在Kafka上做了二次開發(fā),集合業(yè)務擴展了它的能力,你所不知道的互聯(lián)網(wǎng)企業(yè)則利用了Kafka的原生能力來輔助做業(yè)務處理。那么Kafka為什么可以做到這么快呢?今天我們就來聊一聊。
在第一點便是Kafka的特性,使用partition分區(qū)來做并行處理。Kafka作為一個發(fā)布-訂閱系統(tǒng),它所操作的最小單元便是topic主題消息,而每一個topic可以劃分為多個partition。不同partition一般位于不同的機器中,利用集群的優(yōu)勢就可以實現(xiàn)機器間的并行處理。另外因為一個partition在機器上對應一個文件夾,即使存在多個partition位于同一個機器節(jié)點,也可以配置同一個機器節(jié)點的partition處于不同的磁盤,實現(xiàn)磁盤間的并行處理,提高速度。
第二點便是順序?qū)懭氪疟P,我們知道Kafka數(shù)據(jù)是存儲在磁盤上的,磁盤讀取數(shù)據(jù)的時間主要由尋道時間(正確的找到磁道)、旋轉(zhuǎn)延遲(讀寫磁頭旋轉(zhuǎn))、數(shù)據(jù)傳輸時間組成。如果磁盤是順序讀寫數(shù)據(jù),磁頭只要找到正確的磁道就可以不斷的旋轉(zhuǎn)獲取數(shù)據(jù)了,而如果磁盤是隨機讀寫數(shù)據(jù),最差的情況每一份數(shù)據(jù)都在不同的磁道上,那么就需要每次尋道、旋轉(zhuǎn)磁頭,非常的耗時,性能也很差。在Kafka中每個分區(qū)的數(shù)據(jù)是有序的、不可變的消息隊列,新的消息來到分區(qū)就會追加在最末尾,順序?qū)懙姆绞骄吞岣吡怂俣?。當我們要去刪除數(shù)據(jù)的時候,也是通過把partition分為多個segment,直接刪除segment即可,也是非常的快。
第三點是利用pagecache。我們知道Kafka一般都是裝在Linux系統(tǒng)使用的,在Linux系統(tǒng)的設計中,為了提高對磁盤訪問的性能,將文件的cache分為pagecache、buffercache兩部分,在pagecache模塊緩存文件系統(tǒng)的數(shù)據(jù),支持進程對文件的讀寫,在buffercache緩存塊數(shù)據(jù),支持系統(tǒng)對塊設備的讀寫。在Kafka中,服務器節(jié)點broker收到數(shù)據(jù)后,在寫磁盤時把數(shù)據(jù)寫入pagecache,把連續(xù)的小塊組裝成大塊的物理寫提高了性能,在讀磁盤數(shù)據(jù)時從pagecache讀,不通過物理磁盤獲取,提高了速度。
第四點是Kafka的零拷貝機制。我們知道操作系統(tǒng)的核心是內(nèi)核,為了避免用戶直接操作內(nèi)核,操作系統(tǒng)一般把內(nèi)核劃分成兩部分,即內(nèi)核空間、用戶空間。在Linux系統(tǒng)中,讀取數(shù)據(jù)操作都是基于數(shù)據(jù)拷貝完成的,也就是說數(shù)據(jù)會在內(nèi)核地址空間的緩沖區(qū)和用戶地址空間的緩沖區(qū)進行拷貝,正常的數(shù)據(jù)讀取流程一般包含四部分。
1、操作系統(tǒng)需要先從磁盤里讀取文件到內(nèi)核頁面的緩存;
2、用戶態(tài)的應用程序從內(nèi)核態(tài)讀取數(shù)據(jù)到用戶空間緩存區(qū),由于內(nèi)核態(tài)的資源比較寶貴會經(jīng)常釋放;
3、用戶態(tài)的應用程序還需要將數(shù)據(jù)寫回內(nèi)核空間并放入socket緩沖區(qū);
4、最后操作系統(tǒng)將數(shù)據(jù)從socket緩沖區(qū)復制到網(wǎng)卡接口,再經(jīng)由網(wǎng)絡發(fā)送給到消費者進程。
在消費者consumer讀取Kafka消息隊列的數(shù)據(jù)時,按理說也要經(jīng)過這四次copydata的流程,但是Kafka內(nèi)置了零拷貝技術,將磁盤文件的數(shù)據(jù)復制到頁面緩存中,然后將數(shù)據(jù)從頁面緩存直接發(fā)送到網(wǎng)絡給到不同的訂閱者,避免了重復拷貝操作,極大的提高了速度。
第五點是壓縮批處理。在Kafka的producer往broker服務器節(jié)點發(fā)送數(shù)據(jù)時,會累積多條消息壓縮后一起發(fā)送,通過批處理和壓縮的方式提高了速度,也提高了網(wǎng)絡帶寬使用率。