Kafka叢集包含一個或多個伺服器,伺服器節點稱為broker。
如圖,我們有2個broker,6個partition,則會均分;如果只有1個partition,那麼另一個broker會閒置。
理想情況,我們希望broker數量等於partition數量,然後每個partition對應一塊硬碟,那樣能保證順序讀寫的吞吐量最大化。
具體的數量安排請看:https://www.cnblogs.com/HappyTeemo/p/17109381.html
每條釋出到Kafka叢集的訊息都有一個類別,這個類別被稱為Topic。(物理上不同Topic的訊息分開儲存,邏輯上一個Topic的訊息雖然儲存於一個或多個broker上但使用者只需指定訊息的Topic即可生產或消費資料而不必關心資料存於何處)
topic中的資料分割為一個或多個partition。每個topic至少有一個partition。每個partition中的資料使用多個segment檔案儲存。
partition中的資料是有序的,不同partition間的資料丟失了資料的順序。如果topic有多個partition,消費資料時就不能保證資料的順序。在需要嚴格保證訊息的消費順序的場景下,需要將partition數目設為1。
生產者即資料的釋出者,該角色將訊息釋出到Kafka的topic中。broker接收到生產者傳送的訊息後,broker將該訊息追加到當前用於追加資料的segment檔案中。生產者傳送的訊息,儲存到一個partition中,生產者也可以指定資料儲存的partition。
消費者可以從broker中讀取資料。消費者可以消費多個topic中的資料。
每個Consumer屬於一個特定的Consumer Group(可為每個Consumer指定group name,若不指定group
name則屬於預設的group)。
這是kafka用來實現一個topic訊息的廣播(發給所有的consumer)和單播(發給任意一個consumer)的手段。一個topic可以有多個CG。topic的訊息會複製給consumer。如果需要實現廣播,只要每個consumer有一個獨立的CG就可以了。要實現單播只要所有的consumer在同一個CG。用CG還可以將consumer進行自由的分組而不需要多次傳送訊息到不同的topic。
每個partition有多個副本,其中有且僅有一個作為Leader,Leader是當前負責資料的讀寫的partition。
Follower跟隨Leader,所有寫請求都通過Leader路由,資料變更會廣播給所有Follower,Follower與Leader保持資料同步。
ISR: in-sync-replica,處於同步狀態的副本集合,是指副本資料和主副本資料相差在一定返回(時間範圍或數量範圍)之內的副本,當然主副本肯定是一直在ISR中的。 當主副本掛了之後,新的主副本將從ISR中被選出來接替它的工作。
OSR: 和IRS相對應 out-sync-replica,其實就是指那些不在ISR中的副本。
kafka的儲存檔案都是按照offset.kafka來命名,用offset做名字的好處是方便查詢。例如你想找位於2049的位置,只要找到2048.kafka的檔案即可。當然the first offset就是00000000000.kafka
一條訊息包含key和value,value是具體資訊,key主要是用來指定寫入分割區的策略。
比如為鍵生成一個一致性性雜湊值,然後使用雜湊值對主題分割區數進行取模,為訊息選取分割區。
批次就是一組訊息,用於減少網路開銷。網路開銷和CPU往往需要取平衡。