kafka權威指南中文翻譯之一
阿新 • • 發佈:2019-02-03
kafka初見(Meet Kafka)
在討論Kafka細節之前,有必要先來了解下訊息釋出/訂閱的概念,這個概念非常重要。
kafka中的資料單位是message。對比資料庫來說,可以把訊息看做資料庫中的記錄。對kafka而言,一個訊息就是一個位元組陣列,位元組陣列中的資料沒有特定的格式或者意義。訊息有一個可選的元資料資訊,稱為key。key也是一個位元組陣列,與訊息一樣,沒有特別的含義。key用於將訊息寫入特定的partition。partition是一個環形儲存結構,保證具有相同key的訊息總是寫入相同的partition。key的用法在第三章討論。
為了提高效率,訊息以批量的形式寫入kafka。批量 (batch)訊息是指訊息的集合,這些訊息會發送到同一個topic和partition。批次越大,延遲越高,批次可以進行壓縮,以更高效的速度傳輸。
Schemas
訊息對kafka來說只是位元組陣列,但是在傳輸訊息時,建議給訊息內容增加額外的結構,便於消費端理解。這個結構稱為訊息的schema。可以根據業務場景來選擇合適的schema,如JSON、XML。但是JSON、XML格式的schema缺乏強型別處理和schema版本間的相容性。許多kafka開發者傾向使用Apache
Avro,一個序列化框架,最初開發的目的就是為了Hadoop。Avro提供了一個壓縮的序列化格式、訊息模式和訊息負載分離, schema變化時,不需要修改已有程式碼,以及強大的資料型別和模式演化,向後和向前相容。
在kafka中,一致的資料格式是非常重要的,這樣可以實現讀寫訊息解耦。如果沒有實現解耦,訂閱訊息的客戶端必須經常更新,以處理新舊訊息的資料格式。
Topics and Partitions
kafka中的訊息分類儲存在各自的topic中。topic類似一個數據庫表,或一個檔案系統的資料夾。topic包含一系列分割槽partition。一個partition是一個log日誌,訊息以只能追加的方式寫入到log中,以從頭到尾的順序進行順序讀取。需要注意的是,一個topic包括多個partition,不能保證整個 topic中的訊息的時間順序,只能保證在一個分割槽中的訊息的時間順序。圖1-5中展示了一個topic,包含4個partition,新寫入的訊息在每個partition的end處追加。partition為kafka提供了冗餘和伸縮性。每一個partition可以位於不同的server節點上,也就是說,一個topic可以水平擴充套件多臺伺服器,以此來提供比單節點高的效能服務。
Producers and Consumers
kafka客戶端就是使用者程式,有兩種基本型別的客戶端:producer生產者和consumer消費者。
producer建立新訊息。在其他的訊息系統中,producer被稱為publisher或者writer。一般情況下,一個訊息會被生產到一個特定了topic上。預設情況下,producer不關心訊息傳送到哪個partition上,producer會使訊息在所有的partition中均勻分佈。在某些情況下,producer會將訊息傳送到特定的partition上(可以使用訊息key和自定義partitioner用來生成key的hash值,從而將訊息對映到一個特定的partition上)。
consumer讀取訊息。在其他訊息系統中,consumer被稱為subscribe或者reader。consumer可以訂閱一個或者多個topic中的訊息,以訊息產生的順序來讀取。consumer通過訊息的offset來跟蹤消費的訊息。offset是另一個元資料資訊,是一個持續增加的整數值,kafka將訊息新增到topic中時,會為訊息新增offset元資料資訊。通過儲存每個partition中最後消費的訊息的offset到zookeeper中或者kafka本身,consumer可以停止消費或者重新消費訊息。
consumer是consumer group的一部分。一個或者多個consumer組成一個consumer
group來消費一個topic中訊息。group保證一個partition只會被一個成員消費。圖1-6中,一個group中有3個consumer消費一個topic中的訊息。其中兩個consumer各自消費一個partition,另一個consumer消費兩個partition中的訊息。consumer與partition之間的對映關係叫做partition的ownership。
Brokers and Clusters
一個kafka server叫做一個broker。broker接收producer傳送的訊息,為訊息設定offset,並將訊息儲存在磁碟上。broker同時為consumer服務,響應consumer讀取partition中訊息的請求。
根據特定的硬體及其效能特徵,一個代理可以很容易地處理成千上萬的分割槽和每秒數以百萬計的訊息。
kafka broker被設計為Cluster的組成部分。一個cluster中的brokers中的某個broker將成為叢集的controller(從活動的叢集成員中自動選舉出)。controller負責執行管理操作,包括為broker分配partition,監控broker的錯誤資訊。一個partition屬於一個broker,broker是這個partition的leader。一個partition可以屬於多個broker(partition多副本,如圖1-7所示),這樣實現了partition的HA。注意,所有的consumer和producer在這個partition上的操作,必須連線上leader。
retention訊息保留時間
檢視topic列表:
./kafka-topics.sh --zookeeper hadoop01:2181,hadoop02:2181,hadoop03:2181 --list
檢視topic詳細資訊:
./kafka-topics.sh --zookeeper hadoop01:2181,hadoop02:2181,hadoop03:2181 --topic userLogs --describe
如何保證訊息的消費順序與訊息的生產順序一致?
可以將topic的 partitions設定為1:--partitions 1
- "leader" is the node responsible for all reads and writes for the given partition. Each node will be the leader for a randomly selected portion of the partitions.
- "replicas" is the list of nodes that replicate the log for this partition regardless of whether they are the leader or even if they are currently alive.
- "isr" is the set of "in-sync" replicas. This is the subset of the replicas list that is currently alive and caught-up to the leader.