分散式訊息系統Kafka介紹
轉載自董的部落格,文章地址:http://dongxicheng.org/search-engine/kafka/
1、 概述
Kafka是Linkedin於2010年12月份開源的訊息系統,它主要用於處理活躍的流式資料。活躍的流式資料在web網站應用中非常常見,這些資料包括網站的pv、使用者訪問了什麼內容,搜尋了什麼內容等。 這些資料通常以日誌的形式記錄下來,然後每隔一段時間進行一次統計處理。
傳統的日誌分析系統提供了一種離線處理日誌資訊的可擴充套件方案,但若要進行實時處理,通常會有較大延遲。而現有的消(佇列)系統能夠很好的處理實時或者近似實時的應用,但未處理的資料通常不會寫到磁碟上,這對於Hadoop之類(一小時或者一天只處理一部分資料)的離線應用而言,可能存在問題。Kafka正是為了解決以上問題而設計的,它能夠很好地離線和線上應用。
2、 設計目標
(1)資料在磁碟上存取代價為O(1)。一般資料在磁碟上是使用BTree儲存的,存取代價為O(lgn)。
(2)高吞吐率。即使在普通的節點上每秒鐘也能處理成百上千的message。
(3)顯式分散式,即所有的producer、broker和consumer都會有多個,均為分散式的。
(4)支援資料並行載入到Hadoop中。
3、 KafKa部署結構
kafka是顯式分散式架構,producer、broker(Kafka)和consumer都可以有多個。Kafka的作用類似於快取,即活躍的資料和離線處理系統之間的快取。幾個基本概念:
(1)message(訊息)是通訊的基本單位,每個producer可以向一個topic(主題)釋出一些訊息。如果consumer訂閱了這個主題,那麼新發布的訊息就會廣播給這些consumer。
(2)Kafka是顯式分散式的,多個producer、consumer和broker可以執行在一個大的叢集上,作為一個邏輯整體對外提供服務。對於consumer,多個consumer可以組成一個group,這個message只能傳輸給某個group中的某一個consumer.
4、 KafKa關鍵技術點
(1) zero-copy
在Kafka上,有兩個原因可能導致低效:1)太多的網路請求 2)過多的位元組拷貝。為了提高效率,Kafka把message分成一組一組的,每次請求會把一組message發給相應的consumer。 此外, 為了減少位元組拷貝,採用了sendfile系統呼叫。為了理解sendfile原理,先說一下傳統的利用socket傳送檔案要進行拷貝:
Sendfile系統呼叫:
(2) Exactly once message transfer
怎樣記錄每個consumer處理的資訊的狀態?在Kafka中僅儲存了每個consumer已經處理資料的offset。這樣有兩個好處:1)儲存的資料量少 2)當consumer出錯時,重新啟動consumer處理資料時,只需從最近的offset開始處理資料即可。
(3)Push/pull
Producer 向Kafka(push)推資料,consumer 從kafka 拉(pull)資料。
(4)負載均衡和容錯
Producer和broker之間沒有負載均衡機制。
broker和consumer之間利用zookeeper進行負載均衡。所有broker和consumer都會在zookeeper中進行註冊,且zookeeper會儲存他們的一些元資料資訊。如果某個broker和consumer發生了變化,所有其他的broker和consumer都會得到通知。
【參考資料】
【1】Kafka主頁:http://sna-projects.com/kafka/design.php
【2】Zero-copy原理:https://www.ibm.com/developerworks/linux/library/j-zerocopy/
【3】Kafka與Hadoop:http://sna-projects.com/sna/media/kafka_hadoop.pdf