kafka架構設計(二)
一:概述
Kafka是一個分散式、分割槽的、多副本的、多訂閱者,基於zookeeper協調的分散式日誌系統,可以用於web/nginx日誌、訪問日誌,訊息服務等等。
Kafka是基於釋出-訂閱模式,即同一條資料可以被多個消費者消費,但是多個消費者必須處在不同分組中
二:優點:
1)解耦:
資料產生系統與資料處理系統分離,系統間影響降到最低,單個系統出現異常不影響整體環境。
2)冗餘:(副本)
kafka建立多個分割槽副本儲存訊息,保證主分割槽出現通訊異常後,可以在其他節點訪問副本訊息。
3)擴充套件性:
通過zookeeper,可以實現動態變化節點數(broker),並同步分割槽副本。
4)靈活性&峰值處理能力:
producer,broker,consumer均採用負載均衡處理資料,避免單個broker,單個topic,單個partition處理過量的資料
5)可恢復性:
一個處理訊息的程序掛掉,已經加入到佇列中的訊息仍然可以在系統恢復後被處理。
6)緩衝:
kafka訊息優先寫在pagecache中,訊息處理增速,可以在O(1)的系統開銷下進行訊息持久化。
7)非同步通訊:
非立即處理資料,等待consumer從佇列中poll訊息。
三:元件
1)broker:
Kafka 叢集包含一個或多個伺服器,伺服器節點稱為broker。broker儲存topic的資料。每一個topic可以切分成多個partiton,partition均勻分佈在broker中,當partion>broker,會出現broker負載不均衡
2)Topic:
訊息類別,由業務邏輯上定義,屬於同一類別的訊息,以相同的邏輯處理message。
3)Partition:
將topic中的訊息分散式儲存在一個或多個partition。每個獨立的partition中的資料是有序的,同一個topic不同partition間的資料是無序。
4)Producer:
產生資料即造資料,為每個topic生成資料。
5)Consumer:
處理和加工資料,從topic中pull資料,加工成業務需要的資料。
6)Consumer Group:
為每個topic建立的,同屬一個組的Consumer對topic中的訊息消費一次。隸屬不同組的Consumer可以重複消費同一個message,實現一個topic訊息的廣播和單播的手段。
7)Leader:
每個partition有多個副本,但是每個分割槽有且僅有一個作為Leader,Leader是當前負責資料的讀寫的partition。
8)Follower:
用於備份partition的副本,當leader失效時,上位,實現了高可用。
9)Offset:
偏移量,用來記錄單個組中consumer對每個partition消費到的位置。可以實現重複或跳躍消費message。
四:為啥高效能
1)Push vs. Pull
push:是由broker收到訊息後,主動推送給Consumer,不去考慮Consumer所承受的壓力,會造成網路擁塞,網絡卡塞滿,可以儘可能以最快速度傳遞訊息。
pull:是由Consumer自主控制,隨時決定消費訊息(想什麼時候處理就什麼時候處理),以及消費處理快慢。kafka的consumer採用這種方式。
2)資料安全性
當Producer向broker傳送訊息時,通過配置ack引數配置分成三種級別:0-保證資料正確產生,並準備傳送給broker,無法保證一定傳送成功。1-傳送資料到broker的leader中,但是未等副本儲存結果。-1-等待副本儲存成功後再確認訊息commit成功。Producer可以失敗嘗試,可以生成一種類似於主鍵的東西,通過冪等性的重試多次,保證同一message只被commit一次。
當Consumer通過offset從broker讀取訊息後,1.可以選擇立即commit,修改offset到下一條訊息上。2.可以等待單個訊息加工完成手動commit,保證了每條資料都被消費。3.批量消費訊息加工後,手動commit,減少了offset修正次數,增加了重複消費機率。如果未提交offset,會重複消費。
通過引數enable-auto-commit引數配置是否開啟自動提交,auto-offset-reset分為三個引數:earliest-獲取上一次消費的offset繼續消費或者從頭開始消費(重複消費),必重複,latest-獲取上一次消費的offset繼續消費或者最新的offset消費(丟失消費),none-必須要有上次消費的offset,否則報錯。
這個offset由Consumer控制。broker是無狀態的,它不需要標記哪些訊息被哪些消費過,也不需要通過broker去保證同一個Group只有一個Consumer能消費某一條訊息,因此也就不需要鎖機制,這也為Kafka的高吞吐率提供了有力保障
3)資料順序性
在傳送一條訊息時,可以指定這條訊息的key,Producer根據這個key和Partition機制來判斷應該將這條訊息傳送到哪個Parition。相同的key會發送到同一個partition中,保證了資料順序性,破壞了高效能。