Kafka簡介
轉載請註明出處:http://www.cnblogs.com/BYRans/
數據庫
Apache Kafka發源於LinkedIn,於2011年成爲Apache的孵化項目,隨後於2012年成爲Apache的主要項目之一。Kafka使用Scala和Java進行編寫。Apache Kafka是一個快速、可擴展的、高吞吐、可容錯的分佈式發佈訂閱消息系統。Kafka具備高吞吐量、內置分區、支持數據副本和容錯的特性,適合在大規模消息處理場景中使用。apache
接下來先介紹下消息系統的基本理念,而後再介紹Kafka。安全
消息系統介紹
一個消息系統負責將數據從一個應用傳遞到另一個應用,應用只需關注於數據,無需關注數據在兩個或多個應用間是如何傳遞的。分佈式消息傳遞基於可靠的消息隊列,在客戶端應用和消息系統之間異步傳遞消息。有兩種主要的消息傳遞模式:點對點傳遞模式、發佈-訂閱模式。大部分的消息系統選用發佈-訂閱模式。服務器
點對點消息系統
在點對點消息系統中,消息持久化到一個隊列中。此時,將有一個或多個消費者消費隊列中的數據。可是一條消息只能被消費一次。當一個消費者消費了隊列中的某條數據以後,該條數據則從消息隊列中刪除。該模式即便有多個消費者同時消費數據,也能保證數據處理的順序。這種架構描述示意圖以下:markdown
![p2pMsgQueue](http://static.javashuo.com/static/loading.gif)
發佈-訂閱消息系統
在發佈-訂閱消息系統中,消息被持久化到一個topic中。與點對點消息系統不一樣的是,消費者能夠訂閱一個或多個topic,消費者能夠消費該topic中全部的數據,同一條數據能夠被多個消費者消費,數據被消費後不會立馬刪除。在發佈-訂閱消息系統中,消息的生產者稱爲發佈者,消費者稱爲訂閱者。該模式的示例圖以下:架構
![pub-subMsgQueue](http://static.javashuo.com/static/loading.gif)
Kafka概述
Apache Kafka是一個分佈式的發佈-訂閱消息系統,可以支撐海量數據的數據傳遞。在離線和實時的消息處理業務系統中,Kafka都有普遍的應用。Kafka將消息持久化到磁盤中,並對消息建立了備份保證了數據的安全。Kafka在保證了較高的處理速度的同時,又能保證數據處理的低延遲和數據的零丟失。異步
Kafka的優點在於:分佈式
- 可靠性:Kafka是一個具備分區機制、副本機制和容錯機制的分佈式消息系統
- 可擴展性:Kafka消息系統支持集羣規模的熱擴展
- 高性能:Kafka在數據發佈和訂閱過程當中都能保證數據的高吞吐量。即使在TB級數據存儲的狀況下,仍然能保證穩定的性能。
Kafka術語
在深刻理解Kafka以前,先介紹一下Kafka中的術語。下圖展現了Kafka的相關術語以及之間的關係:工具
![KafkaTerminologies](http://static.javashuo.com/static/loading.gif)
上圖中一個topic配置了3個partition。Partition1有兩個offset:0和1。Partition2有4個offset。Partition3有1個offset。副本的id和副本所在的機器的id剛好相同。post
若是一個topic的副本數爲3,那麼Kafka將在集羣中爲每一個partition建立3個相同的副本。集羣中的每一個broker存儲一個或多個partition。多個producer和consumer可同時生產和消費數據。
各個術語的詳細介紹以下:
- Topic:在Kafka中,使用一個類別屬性來劃分數據的所屬類,劃分數據的這個類稱爲topic。若是把Kafka看作爲一個數據庫,topic能夠理解爲數據庫中的一張表,topic的名字即爲表名。
- Partition:topic中的數據分割爲一個或多個partition。每一個topic至少有一個partition。每一個partition中的數據使用多個segment文件存儲。partition中的數據是有序的,partition間的數據丟失了數據的順序。若是topic有多個partition,消費數據時就不能保證數據的順序。在須要嚴格保證消息的消費順序的場景下,須要將partition數目設爲1。
- Partition offset:每條消息都有一個當前Partition下惟一的64字節的offset,它指明瞭這條消息的起始位置。
- Replicas of partition:副本是一個分區的備份。副本不會被消費者消費,副本只用於防止數據丟失,即消費者不從爲follower的partition中消費數據,而是從爲leader的partition中讀取數據。
- Broker:
- Kafka 集羣包含一個或多個服務器,服務器節點稱爲broker。
- broker存儲topic的數據。若是某topic有N個partition,集羣有N個broker,那麼每一個broker存儲該topic的一個partition。
- 若是某topic有N個partition,集羣有(N+M)個broker,那麼其中有N個broker存儲該topic的一個partition,剩下的M個broker不存儲該topic的partition數據。
- 若是某topic有N個partition,集羣中broker數目少於N個,那麼一個broker存儲該topic的一個或多個partition。在實際生產環境中,儘可能避免這種狀況的發生,這種狀況容易致使Kafka集羣數據不均衡。
- Producer:生產者即數據的發佈者,該角色將消息發佈到Kafka的topic中。broker接收到生產者發送的消息後,broker將該消息追加到當前用於追加數據的segment文件中。生產者發送的消息,存儲到一個partition中,生產者也能夠指定數據存儲的partition。
- Consumer:消費者能夠從broker中讀取數據。消費者能夠消費多個topic中的數據。
- Leader:每一個partition有多個副本,其中有且僅有一個做爲Leader,Leader是當前負責數據的讀寫的partition。
- Follower:Follower跟隨Leader,全部寫請求都經過Leader路由,數據變動會廣播給全部Follower,Follower與Leader保持數據同步。若是Leader失效,則從Follower中選舉出一個新的Leader。當Follower與Leader掛掉、卡住或者同步太慢,leader會把這個follower從「in sync replicas」(ISR)列表中刪除,從新建立一個Follower。
Kafka架構
Kafka的架構示意圖以下:
![kfkArchi](http://static.javashuo.com/static/loading.gif)
- Broker:Kafka的broker是無狀態的,broker使用Zookeeper維護集羣的狀態。Leader的選舉也由Zookeeper負責。
- Zookeeper:Zookeeper負責維護和協調broker。當Kafka系統中新增了broker或者某個broker發生故障失效時,由ZooKeeper通知生產者和消費者。生產者和消費者依據Zookeeper的broker狀態信息與broker協調數據的發佈和訂閱任務。
- Producer:生產者將數據推送到broker上,當集羣中出現新的broker時,全部的生產者將會搜尋到這個新的broker,並自動將數據發送到這個broker上。
- Consumer:由於Kafka的broker是無狀態的,因此consumer必須使用partition offset來記錄消費了多少數據。若是一個consumer指定了一個topic的offset,意味着該consumer已經消費了該offset以前的全部數據。consumer能夠經過指定offset,從topic的指定位置開始消費數據。consumer的offset存儲在Zookeeper中。
Kafka工做流程
Kafka將某topic的數據存儲到一個或多個partition中。一個partition內數據是有序的,每條數據都有一個惟一的index,這個index叫作offset。新來的數據追加到partition的尾部。每條數據能夠在不一樣的broker上作備份,從而保證了Kafka使用的可靠性。
生產者將消息發送到topic中,消費者能夠選擇多種消費方式消費Kafka中的數據。下面介紹兩種消費方式的流程。
一個消費者訂閱數據:
- 生產者將數據發送到指定topic中
- Kafka將數據以partition的方式存儲到broker上。Kafka支持數據均衡,例如生產者生成了兩條消息,topic有兩個partition,那麼Kafka將在兩個partition上分別存儲一條消息
- 消費者訂閱指定topic的數據
- 當消費者訂閱topic中消息時,Kafka將當前的offset發給消費者,同時將offset存儲到Zookeeper中
- 消費者以特定的間隔(如100ms)向Kafka請求數據
- 當Kafka接收到生產者發送的數據時,Kafka將這些數據推送給消費者
- 消費者受到Kafka推送的數據,並進行處理
- 當消費者處理完該條消息後,消費者向Kafka broker發送一個該消息已被消費的反饋
- 當Kafka接到消費者的反饋後,Kafka更新offset包括Zookeeper中的offset。
- 以上過程一直重複,直到消費者中止請求數據
- 消費者能夠重置offset,從而能夠靈活消費存儲在Kafka上的數據
消費者組數據消費流程
Kafka支持消費者組內的多個消費者同時消費一個topic,一個消費者組由具備同一個Group ID的多個消費者組成。具體流程以下:
- 生產者發送數據到指定的topic
- Kafka將數據存儲到broker上的partition中
- 假設如今有一個消費者訂閱了一個topic,topic名字爲「test」,消費者的Group ID爲「Group1」
- 此時Kafka的處理方式與只有一個消費者的狀況同樣
- 當Kafka接收到一個一樣Group ID爲「Group1」、消費的topic一樣爲「test"的消費者的請求時,Kafka把數據操做模式切換爲分享模式,此時數據將在兩個消費者上共享。
- 當消費者的數目超過topic的partition數目時,後來的消費者將消費不到Kafka中的數據。由於在Kafka給每個消費者消費者至少分配一個partition,一旦partition都被指派給消費者了,新來的消費者將不會再分配partition。即一個partition只能分配給一個消費者,一個消費者能夠消費多個partition。
Kafka自帶工具
Kafka tool包在org.apache.Kafka.tools.*
下,分爲系統工具和複製工具兩類,重點介紹幾個系統工具:
- Kafka Migration Tool:該工具用於將broker的版本從一個版本更新或還原爲另外一版本。
- Mirror Maker:該工具用於將源Kafka集羣的數據鏡像到目的集羣。
- Consumer Offset Checker:該工具用於顯示指定topic和消費者組的信息,信息包括:消費者組名、topic名、partition、offset、logSize、owner等。