Kafka 深度剖析

本文來源:http://r6d.cn/bdjdi

Kafka 簡介

Kafka 概述:

Kafka 由 linked-in 開源 。

kafka - 高產出的分佈式消息系統 (A high-throughput distributed messaging system)。

Kafka 是一個高吞吐、分佈式、基於發佈訂閱的消息系統,利用 Kafka 技術可以在廉價的 PC Server 上搭建起大規模消息系統。

Kafka 的特性:

Kafka 應用場景:

圖:Kafka 應用場景

Kafka 和其他組件比較,具有消息持久化、高吞吐、分佈式、多客戶端支持、實時等特性,適用於離線和在線的消息消費,如常規的消息收集、網站活性跟蹤、聚合統計系統運營數據(監控數據)、日誌收集等大量數據的互聯網服務的數據收集場景。

  1. 日誌收集:一個公司可以用 Kafka 可以收集各種服務的 log,通過 kafka 以統一接口服務的方式開放給各種 consumer,例如 Hadoop、Hbase、Solr 等;

  2. 消息系統:解耦和生產者和消費者、緩存消息等;

  3. 用戶活動跟蹤:Kafka 經常被用來記錄 web 用戶或者 app 用戶的各種活動,如瀏覽網頁、搜索、點擊等活動,這些活動信息被各個服務器發佈到 kafka 的 topic 中,然後訂閱者通過訂閱這些 topic 來做實時的監控分析,或者裝載到 Hadoop、數據倉庫中做離線分析和挖掘;

  4. 運營指標:Kafka 也經常用來記錄運營監控數據。包括收集各種分佈式應用的數據,生產各種操作的集中反饋,比如報警和報告;

  5. 流式處理:比如 spark streaming 和 storm;

  6. 事件源;

  7. kafka 在 FusionInsight 中的位置:

圖:Kafka 在 FusionInsight 中的位置

Kafka 作爲一個分佈式消息系統,支持在線和離線消息處理,並提供了 Java API 以便其他組件對接使用。

Kafka 架構與功能

Kafka 架構:

圖:Kafka 架構圖

基本概念:

Kafka Topics:

圖;Kafka Topics

每條發佈到 Kafka 的消息都有個類別,這個類別被稱爲 Topic,也可以理解爲一個存儲消息的隊列。例如:天氣作爲一個 Topic,每天的溫度消息就可以存儲在 “天氣” 這個隊列裏。數據總數先進先出。後來的數據追加到後面。

Kafka Partition:

圖:Kafka Partition

每個 Topic 都有一個或者多個 Partitions 構成。每個 Partition 都是有序且不可變的消息隊列。引入 Partition 機制,保證了 Kafka 的高吞吐能力。

在每個 Partition 當中,都會存儲一個 Log 文件,Log 文件中記錄了所有的消息文件。一個 Topic 的多個 Partition,它分佈在不同的 Kafka 節點上,這樣多個客戶端包括 Producer 和 Consumer 就可以併發的訪問不同節點,對同一個 Topic 進行消息的讀取。

圖:Partition

Kafka Partition offset:

圖:Kafka Partition offset

Kafak Partition Replicas(副本):

圖:副本機制

主副本和從副本的數據同步:

圖:主副本和從副本的數據同步

從 Partition 的 Leader 複製數據到 Follower,需要一個線程,實際上,複製數據的操作,是 Follower 主動從 Leader 上批量拉取數據,這就極大的提高了 Kafka 的吞吐量。Follower 複製數據的線程叫做 ReplicaFetcher Thread,而 Kafka 的 Producer 和 Consumer 只與 Leader 進行交互,不會與 Follower 進行交互。

Kafka 中每個 Broker 啓動的時候,都會創建一個副本管理服務 ReplicaManager,該服務負責維護 ReplicaFether Thread 與其他 Broker 鏈路連接關係。該服務中存在的 Follower Partition 對應的 Leader Partition 會分佈在不同的 Broker 上,這些 Broker 創建相同數量的 ReplicaFether Thread,同步對應 Partition 數據。Kafka 中 Partition 間複製數據,是由 Follower 主動從 Leader 拉消息的。Follower 每次讀取消息都會更新 HW 狀態,用於記錄當前最新消息的標識。每當 Follower 的 Partition 發生變化而影響 Leader 所在的 Broker 時,ReplicaManager 就會新建或者銷燬相對應的 ReplicaFether Thread。

Kafka Logs:

爲了使得 Kafka 的吞吐率可以線性提高,物理上把 Topic 分成一個或多個 Partition,每個 Partition 在物理上對應一個文件夾,該文件夾下存儲這個 Partition 的所有消息和索性文件。Kafka 把 Topic 中一個 Partition 大文件分成多個小文件段通過多個小文件段,就容易定期清除或刪除已經消費完的文件,減少磁盤佔用。

Kafka 的存儲佈局非常簡單,Topic 的每個分區對應一個邏輯日誌,物理上一個日誌爲相同大小的一個分段文件。每次 Producer 發佈一個消息到一個分區的時候,代理就將這些數據追加到最後一個段文件當中。當發佈的消息數量達到消息設定的閾值,或者經過一定的時間後,段文件就會真正的寫到磁盤當中。在寫入完成以後,消息就會公開給 Consumer。

同一個 Topic 下有不同的分區,每個分區會劃分爲多個文件,只有一個當前文件在寫,其他文件是隻讀的。當寫滿一個文件(即達到某個設定的值)Kafka 會新建一個空文件繼續來寫。而老文件切換爲只讀。

文件的命名以起始的偏移量來進行命名。Segment Files 由兩大部分組成,分別爲 Index file 和 data file,此兩個文件一一對應成對出現。後綴 .index 和 .log 就分別表示爲 Segment 的索引文件和數據文件。Segment 文件的命名規則是:Partition 全局的第一個 Segment 從 0 開始,後續每個 segment 文件爲上一個全局 Partition 的最大 offset,這個數據時 64 位的 long 型數據。如果沒有數據就用 0 進行填充。通常把日誌文件默認爲 1G,當達到 1G 就會創建新的 Log 文件和 index 文件。如果設置的參數過小,會產生大量的 log 文件和 index 文件,系統在啓動的時候就需要加載大量的 index 到內存,佔用大量的句柄。如果設置的太大,分段文件又比較少,不利於快速的查找。Kafka 就是通過索引實現快速的定位 message。

圖:索引文件

Kafka Log Cleanup:

日誌的清理方式有兩種:delete 和 compact。

刪除的閾值有兩種:過期的時間和分區內總日誌大小。

刪除

圖:日誌清理方式–compact

compact 操作是保存每個消息的最新 value 值。消息時順序存儲的,offset 大的爲最新的數據。

Kafka 數據可靠性:

Kafka 所有消息都會被持久化到磁盤中,同時 Kafka 通過對 Topic Partition 設置 Replication 來保障數據可靠。

消息傳輸過程中保障通常有以下三種:

Kafka 消息傳輸保障機制,通過配置不同的消息發送模式來保障消息傳輸,進而滿足不同的可靠性要求應用場景。

可靠

Kafka 關鍵流程

寫流程:

圖:Kafka 寫流程–Producer 寫數據

總體流程:

開發分區接口:

Kafka 讀流程:

圖:Kafka 讀流程–Consumer 讀數據

總體流程:

Kafka 在 Zookeeper 上的目錄結構

Zookeeper 在 Kafka 的作用:

  1. 無論是 kafka 集羣,還是 producer 和 consumer 都依賴於 zookeeper 來保證系統可用性集羣保存一些 meta 信息。

  2. Kafka 使用 zookeeper 作爲其分佈式協調框架,很好的將消息生產、消息存儲、消息消費的過程結合在一起。

  3. 同時藉助 zookeeper,kafka 能夠生產者、消費者和 broker 在內的所以組件在無狀態的情況下,建立起生產者和消費者的訂閱關係,並實現生產者與消費者的負載均衡。

Zookeeper Shell:

通過 zkCli 來連接正在運行的 Zookeeper Shell 客戶端,可以通過 ls 和 get 命令來獲取 Kafka 相關信息。

圖:用法示例

Kafka in ZooKeeper:

圖:Kafka 在 ZooKeeper 中的目錄結構

Kafka Cluster Mirroring

鏡像

圖:Kafka CLuster Mirroring Kafka Cluster Mirroring 是 Kafka 跨集羣數據同步方案,通過 Kafka 內置的 MirrorMaker 工具來實現。通過 Mirror Maker 工具中的 consumer 從源集羣消費數據,然後再通過內置的 Producer,將數據重新發布到目標集羣。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/FGYsb4c355tdQrvgzzeLaw