1. 程式人生 > >初學Kafka工作原理流程介紹

初學Kafka工作原理流程介紹

Apache kafka 工作原理介紹

  • 訊息佇列技術是分散式應用間交換資訊的一種技術。訊息佇列可駐留在記憶體或磁碟上, 佇列儲存訊息直到它們被應用程式讀走。通過訊息佇列,應用程式可獨立地執行--它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程式接收此訊息。在分散式計算環境中,為了整合分散式應用,開發者需要對異構網路環境下的分散式應用提供有效的通訊手段。為了管理需要共享的資訊,對應用提供公共的資訊交換機制是重要的。常用的訊息佇列技術是 Message Queue。

  • Message Queue 的通訊模式

  1. 點對點通訊:點對點方式是最為傳統和常見的通訊方式,它支援一對一、一對多、多對多、多對一等多種配置方式,支援樹狀、網狀等多種拓撲結構。

  2. 多點廣播:MQ 適用於不同型別的應用。其中重要的,也是正在發展中的是"多點廣播"應用,即能夠將訊息傳送到多個目標站點 (Destination List)。可以使用一條 MQ 指令將單一訊息傳送到多個目標站點,並確保為每一站點可靠地提供資訊。MQ 不僅提供了多點廣播的功能,而且還擁有智慧訊息分發功能,在將一條訊息傳送到同一系統上的多個使用者時,MQ 將訊息的一個複製版本和該系統上接收者的名單傳送到目標 MQ 系統。目標 MQ 系統在本地複製這些訊息,並將它們傳送到名單上的佇列,從而儘可能減少網路的傳輸量。

  3. 釋出/訂閱 (Publish/Subscribe) 模式:釋出/訂閱功能使訊息的分發可以突破目的佇列地理指向的限制,使訊息按照特定的主題甚至內容進行分發,使用者或應用程式可以根據主題或內容接收到所需要的訊息。釋出/訂閱功能使得傳送者和接收者之間的耦合關係變得更為鬆散,傳送者不必關心接收者的目的地址,而接收者也不必關心訊息的傳送地址,而只是根據訊息的主題進行訊息的收發。

  4. 群集 (Cluster):為了簡化點對點通訊模式中的系統配置,MQ 提供 Cluster(群集) 的解決方案。群集類似於一個域 (Domain),群集內部的佇列管理器之間通訊時,不需要兩兩之間建立訊息通道,而是採用群集 (Cluster) 通道與其它成員通訊,從而大大簡化了系統配置。此外,群集中的佇列管理器之間能夠自動進行負載均衡,當某一佇列管理器出現故障時,其它佇列管理器可以接管它的工作,從而大大提高系統的高可靠性。

Kafka的基本術語和概念

  1. Kafka中有以下一些概念。
  2. Broker:任何正在執行中的Kafka示例都稱為Broker。
  3. Topic:Topic其實就是一個傳統意義上的訊息佇列。
  4. Partition:即分割槽。一個Topic將由多個分割槽組成,每個分割槽將存在獨立的持久化檔案,任何一個Consumer在分割槽上的消費一定是順序的;當一個Consumer同時在多個分割槽上消費時,Kafka不能保證總體上的強順序性(對於強順序性的一個實現是Exclusive Consumer,即獨佔消費,一個佇列同時只能被一個Consumer消費,並且從該消費開始消費某個訊息到其確認才算消費完成,在此期間任何Consumer不能再消費)。
  5. Producer:訊息的生產者。
  6. Consumer:訊息的消費者。
  7. Consumer Group:即消費組。一個消費組是由一個或者多個Consumer組成的,對於同一個Topic,不同的消費組都將能消費到全量的訊息,而同一個消費組中的Consumer將競爭每個訊息(在多個Consumer消費同一個Topic時,Topic的任何一個分割槽將同時只能被一個Consumer消費)。

Kafka的特性

  1. 高吞吐量、低延遲:kafka每秒可以處理幾十萬條訊息,它的延遲最低只有幾毫秒,每個topic可以分多個partition, consumer group 對partition進行consume操作;
  2. 可擴充套件性:kafka叢集支援熱擴充套件;
  3. 永續性、可靠性:訊息被持久化到本地磁碟,並且支援資料備份防止資料丟失;
  4. 容錯性:允許叢集中節點失敗(若副本數量為n,則允許n-1個節點失敗);
  5. 高併發:支援數千個客戶端同時讀寫;
  6. 支援實時線上處理和離線處理:可以使用Storm這種實時流處理系統對訊息進行實時進行處理,同時還可以使用Hadoop這種批處理系統進行離線處理;

Kafka的Leader的選舉機制

  • Kafka的Leader是什麼
  1. 首先Kafka會將接收到的訊息分割槽(partition),每個主題(topic)的訊息有不同的分割槽。這樣一方面訊息的儲存就不會受到單一伺服器儲存空間大小的限制,另一方面訊息的處理也可以在多個伺服器上並行。
  2. 其次為了保證高可用,每個分割槽都會有一定數量的副本(replica)。這樣如果有部分伺服器不可用,副本所在的伺服器就會接替上來,保證應用的持續性。

  • 但是,為了保證較高的處理效率,訊息的讀寫都是在固定的一個副本上完成。這個副本就是所謂的Leader,而其他副本則是Follower。而Follower則會定期地到Leader上同步資料。
  • Leader選舉
  1. 如果某個分割槽所在的伺服器除了問題,不可用,kafka會從該分割槽的其他的副本中選擇一個作為新的Leader。之後所有的讀寫就會轉移到這個新的Leader上。現在的問題是應當選擇哪個作為新的Leader。顯然,只有那些跟Leader保持同步的Follower才應該被選作新的Leader。
  2. Kafka會在Zookeeper上針對每個Topic維護一個稱為ISR(in-sync replica,已同步的副本)的集合,該集合中是一些分割槽的副本。只有當這些副本都跟Leader中的副本同步了之後,kafka才會認為訊息已提交,並反饋給訊息的生產者。如果這個集合有增減,kafka會更新zookeeper上的記錄。
  3. 如果某個分割槽的Leader不可用,Kafka就會從ISR集合中選擇一個副本作為新的Leader。
  4. 顯然通過ISR,kafka需要的冗餘度較低,可以容忍的失敗數比較高。假設某個topic有f+1個副本,kafka可以容忍f個伺服器不可用。
  • 為什麼不用少數服從多數的方法
  1. 少數服從多數是一種比較常見的一致性演算法和Leader選舉法。它的含義是隻有超過半數的副本同步了,系統才會認為資料已同步;選擇Leader時也是從超過半數的同步的副本中選擇。這種演算法需要較高的冗餘度。譬如只允許一臺機器失敗,需要有三個副本;而如果只容忍兩臺機器失敗,則需要五個副本。而kafka的ISR集合方法,分別只需要兩個和三個副本。
  • 如果所有的ISR副本都失敗了怎麼辦
  1. 此時有兩種方法可選,一種是等待ISR集合中的副本復活,一種是選擇任何一個立即可用的副本,而這個副本不一定是在ISR集合中。這兩種方法各有利弊,實際生產中按需選擇。
  2. 如果要等待ISR副本復活,雖然可以保證一致性,但可能需要很長時間。而如果選擇立即可用的副本,則很可能該副本並不一致。

kafka叢集partition分佈原理分析

  1. 在Kafka叢集中,每個Broker都有均等分配Partition的Leader機會。
  2. 上述圖Broker Partition中,箭頭指向為副本,以Partition-0為例:broker1中parition-0為Leader,Broker2中Partition-0為副本。
  3. 上述圖種每個Broker(按照BrokerId有序)依次分配主Partition,下一個Broker為副本,如此迴圈迭代分配,多副本都遵循此規則。
  4. 副本分配演算法如下:
  5. 將所有N Broker和待分配的i個Partition排序.
  6. 將第i個Partition分配到第(i mod n)個Broker上.
  7. 將第i個Partition的第j個副本分配到第((i + j) mod n)個Broker上.

Zookeeper在kafka的作用

  1. 無論是kafka叢集,還是producer和consumer都依賴於zookeeper來保證系統可用性叢集儲存一些meta資訊。
  2. Kafka使用zookeeper作為其分散式協調框架,很好的將訊息生產、訊息儲存、訊息消費的過程結合在一起。
  3. 同時藉助zookeeper,kafka能夠生產者、消費者和broker在內的所以元件在無狀態的情況下,建立起生產者和消費者的訂閱關係,並實現生產者與消費者的負載均衡。