kafka誕生於linkin公司。當時linkin需要對使用者和**上產生的活動資料進行處理,什麼是活動資料呢?比如頁面訪問量、使用者行為、搜尋情況等,對這些資料的分析將被應用於廣播、排序、個性化 推薦、運營監控等。這類資料有個特點,需要實時處理,最好當下使用者的一些行為資料能馬上被後台感知、計算,並給出一些推薦等等,另外乙個是資料量大,毫無疑問,每個使用者的活動資料是遠遠多於諸如表單這樣的業務資料的,而linkin對這類資料採用傳統的批處理方法顯然是不能符合需求的,前端伺服器先寫檔案,然後通過批量的方式送入hadoop這樣的大資料分析器裡慢慢整。於是乎linkin便開發了kafka專門處理這類資料,這類資料的特點決定了kafka需要做到低延時處理海量資料,實際上kafka的一大特點就是高吞吐,在普通的廉價虛擬機器上,據linkin統計,最新資料是每天利用kafka處理一萬億條資料,峰值時每秒會發布百萬條資料。它的快和在儲存和網路上做的優化不無關係。
能夠儲存到幾乎無限大的磁碟空間而無需付出效能代價是kafka的一**寶,意味著它有著從容面對海量資料的能力。
kafka的訊息儲存是嚴重依賴於檔案系統的,訊息持久化時只是簡單的檔案讀寫。這種方式有個優勢,操作的複雜度都是o(1),讀寫操作互不干擾,這樣效能就完全同資料大小脫離的關係,資料量大簡單加磁碟就行了。從直覺來看,讀寫磁碟速度會很慢,實際上由於kafka採用了順序讀寫磁碟的方式,這種i/o的效率並不慢,某些情況下比操作記憶體更快。
相對於人們傳統的直覺,磁碟的吞吐效能可快可慢,這取決於磁碟的使用方式,在乙個由6個7200rpm的sata硬碟組成的raid-5磁碟陣列上,線性寫入(linear write)的速度大約是300mb/秒,但隨即寫入卻只有50k/秒,其中的差別接近10000倍。這是由於隨即寫入時磁碟需要再次尋道,嚴重影響了讀寫的效能,再加之作業系統採用預讀和預寫的方式對磁碟讀寫進行優化,進一步提公升了順序讀寫磁碟的效率。
kafka充分利用了檔案系統這一特性。
這是某個kafka節點收發訊息圖。partition是訊息收發的主體,每乙個broker內部都至少有乙個partiton。
這是partition的儲存結構圖,每個partition都被分成了若干個segment,而每個segment又由log和index檔案組成。log檔案用來儲存produces推送的訊息,index是訊息的索引。從這個結構圖可以看出,在partition中以log檔案的形式存在。每乙個推送到partition中的訊息都會以追加的形式存到這個檔案中,這些訊息不是立即重新整理到磁碟上的,而是按照作業系統預寫的方式存到了記憶體的頁面快取裡,等達到一定量級,再由flush到磁碟上,讓partition支援線性寫入。
在讀訊息時,kafka規定每個partition只能同時給乙個consumer推送訊息。這一設計避免了在同乙個partition多個consumer對資料對競爭,降低了磁頭移動的機率,讓partition盡可能按照線性讀盤的方式獲取資料,提高吞吐量。
除了訊息大容量之外,kafka在網路傳輸上的零拷貝是另一**寶,這種優化讓訊息的使用速度接近網路連線的極限。
零拷貝的方式主要應用在訊息傳送上。我們知道平常我們要把磁碟裡的資料依靠網路傳送出去要經歷4個階段:
1、作業系統從磁碟中讀取資料到核心空間的頁面快取
2、應用程式將資料從頁面快取拷貝到應用程式空間
3、應用程式將資料拷貝到socket核心空間
4、作業系統將資料從socket緩衝區拷貝到網絡卡中,經網路傳送
從磁碟裡傳送一次資料要經歷四次拷貝,顯然會降低資料傳送的效率,kafka將這四步簡化到了一步,直接從記憶體的頁面快取中拷貝到網絡卡傳送出去,只有一次拷貝,可想而知它的效率有多高。
近乎無限的資料容量加上接近頻寬極限的訊息發布速率,使單個機子的吞吐量達到了極限,但這還不是高吞吐秘密的全部,下一節將從集群的角度剖析高吞吐的奧秘。
Kafka 高吞吐率的實現
kafka是分布式訊息系統,需要處理海量的訊息,kafka的設計是把所有的訊息都寫入速度低容量大的硬碟,以此來換取更強的儲存能力,但實際上,使用硬碟並沒有帶來過多的效能損失。kafka主要使用了以下幾個方式實現了超高的吞吐率 順序讀寫 kafka的訊息是不斷追加到檔案中的,這個特性使kafka可以充...
kafka高吞吐量的原因
kafka的訊息是不斷追加到檔案中的,這個特性使kafka可以充分利用磁碟的順序讀寫效能 順序讀寫不需要硬碟磁頭的尋道時間,只需很少的扇區旋轉時間,所以速度遠快於隨機讀寫 生產者負責寫入資料,kafka會將訊息持久化到磁碟,保證不會丟失資料,kafka採用了倆個技術提高寫入的速度。1.順序寫入 在大...
kafka吞吐量高的原因
1 順序讀寫 基於磁碟的隨機讀寫確實很慢,但磁碟的順序讀寫效能卻很高,一些情況下磁碟順序讀寫效能甚至要高於記憶體隨機讀寫。kafka的message是不斷追加到本地磁碟檔案末尾的,而不是隨機的寫入,這使得kafka寫入吞吐量得到了顯著提公升 2 page cache 為了優化讀寫效能,kafka利用...