Kafka讀書筆記 -- 初識Kafka
摘要:
Kafka一般被稱為『分散式提交日誌』或者『分散式流平臺』
檔案系統或資料庫提交日誌用來提供所有事務的持久記錄,通過重放這些日誌可以重建系統的狀態
Kafka的資料是按照一定順序持久化儲存的,可以按需讀取
Kafka的資料分佈在整個系統裡,...
- Kafka一般被稱為『分散式提交日誌』或者『分散式流平臺』
- 檔案系統或資料庫提交日誌用來提供所有事務的持久記錄,通過重放這些日誌可以重建系統的狀態
- Kafka的資料是按照一定順序持久化儲存的,可以按需讀取
- Kafka的資料分佈在整個系統裡,具備資料故障保護和效能伸縮能力
訊息和批次
- Kafka的資料單元被稱為訊息
- 訊息由 位元組陣列 組成,訊息裡的資料沒有特別的格式或者含義
- 訊息可以有一個可選的 元資料 ,就是鍵,鍵也是一個 位元組陣列 ,同樣沒有特殊含義
- 訊息以 一種可控的方式寫入不同的分割槽 時,會用到鍵
- 例如為鍵生成一個一致性雜湊值,然後使用雜湊值對主題分割槽數進行取模,為訊息選取分割槽,從而保證具有相同鍵的訊息總是被寫入到相同的分割槽
- 為了提高效率,訊息被 分批 寫入Kafka, 批次就是一組訊息 ,這些訊息 屬於同一個主題和分割槽
- 如果每個訊息都單獨穿行於網路,會導致大量的網路開銷,把訊息分成批次傳輸可以減少網路開銷
- 不過,這需要在 時間延遲 和 吞吐量 之間做出權衡:批次越大,單位時間內處理的訊息就會越多,耽擱訊息的傳輸時間就會越長
- 批次資料會被 壓縮 ,這樣可以提升資料的傳輸和儲存能力,但要做更多的計算處理
模式
- 對於Kafka來說,訊息不過是晦澀難懂的位元組陣列
- 依據應用程式的需求, 訊息模式 有許多可用的選項
- 像JSON和XML這些簡單的系統,不僅易用,而且可讀性好;但是 缺乏強型別的處理能力 ,不同版本之間的 相容性也不好
- Kafka的許多開發者喜歡使用 Apache Avro ,它最初是為了Hadoop開發的一款序列化框架
- Avro提供了一種 緊湊的序列化格式 , 模式和訊息體是分開的,當模式發生變化時,不需要重新生成程式碼
- Avro還支援 強型別 和 模式進化 ,其版本既向前相容,也向後相容
- 資料格式的一致性 對於Kafka來說很重要,它 消除了訊息讀寫操作之間的耦合性
- 如果讀寫操作緊密地耦合在一起,訊息訂閱者需要升級應用程式才能同時處理新舊兩種資料格式
- 在訊息訂閱者升級之後,訊息釋出者才能跟著升級,以便使用新的資料格式
- 新的應用程式如果需要使用資料,就要和訊息釋出者發生耦合,導致開發者需要做很多繁雜的工作
- 定義良好的格式,並把它們存放在 公共倉庫 ,可以方便我們理解 Kafka的訊息結構
主題和分割槽
- Kafka的訊息通過 主題 進行分類,主題類似於資料庫的表,或者檔案系統裡的資料夾
- 主題可以被分為若干個分割槽,一個分割槽就是一個提交日誌
- 訊息以 追加 的方式寫入分割槽,然後以 FIFO 的順序讀取
- 由於一個主題一般包含幾個分割槽,因此 無法在整個主題範圍內保證訊息的順序 ,但可以保證訊息在單個分割槽內的順序
- Kafka通過分割槽來實現 資料冗餘 和 伸縮性
- 分割槽可以分佈在不同的伺服器上,因此一個主題可以橫跨多個伺服器
- 很多時候,會把一個 主題的資料 看成一個 流 ,不管它有多少個分割槽
- 流是一組從生產者移動到消費者的資料
生產者和消費者
- 生產者 建立訊息
- 一般情況下,一個訊息會被髮布到特定的主題上
- 預設情況下, 生產者把訊息均勻地分佈到主題的所有分割槽上 ,而並不關心特定訊息會被寫到哪個分割槽
- 在特定情況下,生產者會把訊息直接寫到指定的分割槽,這通常聽過 訊息鍵 和 分割槽器 來實現的
- 分割槽器為鍵生成一個雜湊值,並將其對映(例如取模)到指定的分割槽上
- 這樣可以保證包含同一個鍵的訊息會被寫到同一個分割槽上
- 消費者 讀取訊息
- 消費者 訂閱一個或多個主題 ,並 按照訊息生成的順序讀取 它們
- 消費者通過檢查訊息的 偏移量 來區分已經讀取過的訊息
- 偏移量是另一種 元資料 ,它是一個 不斷遞增 的整數值, 在建立訊息時,Kafka會把偏移量新增到訊息裡
- 在給定的分割槽裡,每個訊息的偏移量都是唯一的
- 消費者把 每個分割槽最後讀取的訊息偏移量 儲存在Zookeeper或Kafka上,如果消費者關閉或重啟,它的讀取狀態不會丟失
- 消費者是 消費者群組 的一部分,會有一個或者多個消費者共同讀取一個主題
- 群組保證每個分割槽只能被一個消費者使用
- 消費者與分割槽之間的對映通常被稱為 『消費者對分割槽的所有權關係』
- 如果一個消費者失效,群組裡的其它消費者可以接管失效消費者的工作
Broker和叢集
- 一個 獨立的Kafka伺服器 被稱為 Broker
- Broker接收來自生產者的訊息, 為訊息設定偏移量,並提交訊息到磁碟儲存
- Broker為消費者提供服務,對 讀取分割槽的請求 作出響應,返回已經提交到磁碟上的訊息
- Broker是叢集的組成部分,每個叢集都有一個Broker同時充當 叢集控制器 的角色(自動從叢集的活躍成員中選舉出來)
- 控制器負責管理工作: 將分割槽分配給Broker + 監控Broker
- 在叢集中, 一個分割槽從屬於一個Broker ,該Broker被稱為 分割槽的首領
- 一個分割槽可以分配給多個Broker,這個時候就會發生分割槽複製
- 這種複製機制為分割槽提供了 訊息冗餘
- 如果有一個Broker失效,其它Broker可以接管領導權,相關的消費者和生產者都需要 重新連線 到新的首領
保留訊息
- 保留訊息是Kafka的一個重要特性
- 預設的訊息保留策略
- 要麼保留 一段時間 ,要麼保留到訊息達到 一定大小的位元組數
- 當訊息數量達到這些上限時,舊訊息就會過期並被刪除
- 主題 可以配置自己的保留策略,可以將訊息保留到不再使用它們為止