1. 程式人生 > >《Apache Kafka 實戰》讀書筆記-認識Apache Kafka

《Apache Kafka 實戰》讀書筆記-認識Apache Kafka

                《Apache Kafka 實戰》讀書筆記-認識Apache Kafka

                                           作者:尹正傑

版權宣告:原創作品,謝絕轉載!否則將追究法律責任。

 

 

 

 

一.kafka概要設計   kafka在設計初衷就是為了解決網際網路公司的超級大量級資料的實時傳輸。為了實現這個目標,kafka在設計之初就需要考慮以下四個方面:   第一:吞吐量/延遲   第二:訊息持久化    第三:負載均衡和故障轉移
  第四:伸縮性 1>.吞吐量/延時介紹   我們先打個比方:若kafka處理一條訊息需要花費2ms,那麼計算得到的吞吐量不會超過500條訊息每秒(1000ms/2ms=500條/s)。但是若我們採用批處理(batching)的思想,假設在傳送前我們首先會等待一段時間(假設是8ms),那麼此時訊息傳送的延遲變成了10ms(2ms+8ms),即延遲增加了4倍,但假設在這8ms中我們總共積累了1000條訊息,那麼整個系統的吞吐量就變成了100000 條/s。此時你會發現吞吐量提升了200倍!看到micor-batch的威力了吧?這就是目前諸如Storm Trident 和 Spark Streaming等訊息處理平臺所採用的批處理思想。
  2>.Kafka如何做到高吞吐量,低延遲的呢?    首先,kafka的寫入操作是很快的,這主要得益於它對磁碟的使用方法的不同。雖然kafka會持久化所有資料到磁碟,但本質上每次寫入操作其實都只是把資料寫入到作業系統的頁快取(page cache)中,然後由作業系統自行決定什麼時候把頁快取中的資料寫入磁碟上。這樣的設計由三個主要的優勢:   第一:作業系統頁快取是記憶體中分配的,所以訊息寫入的速度非常快;   第二:kafka不必直接與底層的檔案系統打交道。所以煩瑣的I/O操作都交由作業系統來處理;   第三:kafka寫入操作採用追加寫入(append)方式,避免了磁碟隨機寫操作(據資料統計,順序磁碟I/O速度是毫不遜色於隨機讀寫記憶體I/O速度。感興趣的小夥伴可以使用相關工具測試一下。);
  3>.Kafka的高吞吐量,低延遲的設計目標   第一:大量使用作業系統頁快取,記憶體操作速度快且命中率高;    第二:Kafka不直接參與物理I/O操作,而是交由最擅長此時的作業系統來完成;    第三:採用追加寫入方式,摒棄了緩慢的磁碟隨機讀/寫操作;   第四:使用sendfile為代表的零拷貝技術加強網路間的資料傳輸效率;  4>.訊息持久化的優點   第一:解耦訊息傳送和訊息消費     本質上來說,kakfa最核心的功能就是提供了生產者-消費者模式的完整解決方案。通過將訊息持久化使得生產者方不再需要直接和消費者方耦合,它只是簡單的把訊息生產出來並交由kafka伺服器儲存即可,因此提升了整體的吞吐量。     第二:實現靈活的訊息處理     很多kafka的下游子系統(接受kafka訊息的系統)都有這樣的需求:對於已經處理過的訊息可能在未來的某個時間點重新處理一次,即所謂的訊息訊息重演(message replay)。訊息持久化便可以很方便地實現這樣的需求。    第三:負載均衡和故障轉移      作為一個功能完備的分散式系統,kafka如果只提供了最基本的訊息引擎功能肯定不足以幫助它脫穎而出。一套完整的訊息引擎解決方案中韓必然要提供負載均衡(load balancing)和故障轉移(fail-over)功能。     何為負載均衡?顧名思義就是讓系統的負載根據一定的規則均衡地分配在所有引數工作的伺服器上,從而最大限度的提升整體的執行效率。kafka實現負載均衡實際上是通過智慧化的分割槽領導者選舉(partition leader election)來實現的。      除了負載均衡,完備的分散式系統還支援故障轉移,所謂故障轉移,是指當伺服器意外終止時,整個叢集可以快速的檢測到該失效(failure),並立即將該伺服器上應用或服務自動轉移到其他伺服器上。故障轉移通常是“心跳”和“會話“的機制來實現的。kafka伺服器支援故障轉移的方式就是使用繪畫機制。每臺kafka伺服器啟動後會以會話的形式把自己註冊到zookeeper伺服器上。一旦該服務運轉出現問題,與zookeeper的會話變不能維持從而超時失效,此時kafka叢集會選舉出另外一臺伺服器來完全代替這臺伺服器繼續提供服務。   第四:伸縮性     所謂伸縮性,英文名是scalability。伸縮性表示想分散式系統中增加額外的計算資源(比如CPU,記憶體,儲存或頻寬)時吞吐量提升的能力。阻礙線性擴容的一個很常見的因素就是狀態的儲存。我們知道,不論是哪類分散式系統,叢集的每臺伺服器一定會維護很多內部狀態。如果由伺服器自己來儲存這些狀態資訊,則必須處理一致性的問題。相反,如果伺服器是無狀態的,狀態的儲存和管理交與專門的協調服務來做(比如zookeeper)。那麼整個叢集的服務武器之間就無需繁重的狀態共享,者極大的降低了維護複雜度。倘若要擴容叢集節點,只需要簡單的啟動新的節點叢集和進行自動負載均衡就可以了。    Kafka正式採用了這樣的思想:每臺kafka伺服器上的狀態統一交友zookeeper保管。擴充套件kafka叢集也只需要一步:啟動新的kafka伺服器即可。當然這裡需要言明的是,在kafka伺服器上並不是所有的狀態資訊都不儲存,它只儲存了很輕量級的內部狀態(比如從kakka 0.10.x版本之後,它將每個topic的消費者的偏移量自己維護了,把這些偏移量存放到了一個叫做“__consumer_offsets”的的topic進行維護)。     二.Kafka基本概念與術語           三.Kafka的使用場景