Kafka 深度剖析
本文來源:http://r6d.cn/bdjdi
Kafka 簡介
Kafka 概述:
Kafka 由 linked-in 開源 。
kafka - 高產出的分佈式消息系統 (A high-throughput distributed messaging system)。
Kafka 是一個高吞吐、分佈式、基於發佈訂閱的消息系統,利用 Kafka 技術可以在廉價的 PC Server 上搭建起大規模消息系統。
Kafka 的特性:
-
高吞吐量、低延遲:kafka 每秒可以處理幾十萬條消息,它的延遲最低只有幾毫秒,每個 topic 可以分多個 partition, consumer group 對 partition 進行 consume 操作;
-
可擴展性:kafka 集羣支持熱擴展;
-
持久性、可靠性:消息被持久化到本地磁盤,並且支持數據備份防止數據丟失;
-
容錯性:允許集羣中節點失敗(若副本數量爲 n, 則允許 n-1 個節點失敗);
-
高併發:支持數千個客戶端同時讀寫;
-
支持實時在線處理和離線處理:可以使用 Storm 這種實時流處理系統對消息進行實時進行處理,同時還可以使用 Hadoop 這種批處理系統進行離線處理;
Kafka 應用場景:
圖:Kafka 應用場景
Kafka 和其他組件比較,具有消息持久化、高吞吐、分佈式、多客戶端支持、實時等特性,適用於離線和在線的消息消費,如常規的消息收集、網站活性跟蹤、聚合統計系統運營數據(監控數據)、日誌收集等大量數據的互聯網服務的數據收集場景。
-
日誌收集:一個公司可以用 Kafka 可以收集各種服務的 log,通過 kafka 以統一接口服務的方式開放給各種 consumer,例如 Hadoop、Hbase、Solr 等;
-
消息系統:解耦和生產者和消費者、緩存消息等;
-
用戶活動跟蹤:Kafka 經常被用來記錄 web 用戶或者 app 用戶的各種活動,如瀏覽網頁、搜索、點擊等活動,這些活動信息被各個服務器發佈到 kafka 的 topic 中,然後訂閱者通過訂閱這些 topic 來做實時的監控分析,或者裝載到 Hadoop、數據倉庫中做離線分析和挖掘;
-
運營指標:Kafka 也經常用來記錄運營監控數據。包括收集各種分佈式應用的數據,生產各種操作的集中反饋,比如報警和報告;
-
流式處理:比如 spark streaming 和 storm;
-
事件源;
-
kafka 在 FusionInsight 中的位置:
Kafka 作爲一個分佈式消息系統,支持在線和離線消息處理,並提供了 Java API 以便其他組件對接使用。
Kafka 架構與功能
Kafka 架構:
圖:Kafka 架構圖
基本概念:
-
Broker:Kafka 集羣包含一個或多個服務實例,這些服務實例被稱爲 Broker。是 Kafka 當中具體處理數據的單元。Kafka 支持 Broker 的水平擴展。一般 Broker 數據越多,集羣的吞吐力就越強。
-
Topic:每條發佈到 Kafka 集羣的消息都有一個類別,這個類別被稱爲 Topic。
-
Partition:Kafka 將 Topic 分成一個或多個 Partition,每個 Partition 在物理上對應一個文件夾,該文件下存儲這個 Partition 的所有消息。
-
Producer:負責發佈消息到 Kafka Broker。
-
Consumer:消息消費者,從 Kafka Broker 讀取消息的客戶端。
-
Consumer Group:每個 Consumer 屬於一個特定的 Consumer Group(可爲每個 Consumer 指定 group name)。
-
ZooKeeper:kafka 與 Zookeeper 級聯,通過 Zookeeper 管理級聯配置,選舉 Leader。
Kafka Topics:
圖;Kafka Topics
每條發佈到 Kafka 的消息都有個類別,這個類別被稱爲 Topic,也可以理解爲一個存儲消息的隊列。例如:天氣作爲一個 Topic,每天的溫度消息就可以存儲在 “天氣” 這個隊列裏。數據總數先進先出。後來的數據追加到後面。
Kafka Partition:
每個 Topic 都有一個或者多個 Partitions 構成。每個 Partition 都是有序且不可變的消息隊列。引入 Partition 機制,保證了 Kafka 的高吞吐能力。
在每個 Partition 當中,都會存儲一個 Log 文件,Log 文件中記錄了所有的消息文件。一個 Topic 的多個 Partition,它分佈在不同的 Kafka 節點上,這樣多個客戶端包括 Producer 和 Consumer 就可以併發的訪問不同節點,對同一個 Topic 進行消息的讀取。
圖:Partition
-
Topic 的 Partition 數量可以在創建時配置。
-
Partition 數據決定了每個 Consumer group 中併發消費者的最大數據。
-
Consumer group A 有兩個消費者來讀取 4 個 Partition 中數據;Consumer group B 有四個消費者來讀取 4 個 partition 中數據。
Kafka Partition offset:
圖:Kafka Partition offset
-
任何發佈到此 Partition 的消息都會被直接追加到 log 文件的尾部。
-
每條消息在文件中的位置稱爲 offset(偏移量),offset 是一個 long 型數字,它唯一標記一條消息。消費者通過(offset、partition、topic)跟蹤記錄。
-
Kafka 不支持消息的隨機讀取。
Kafak Partition Replicas(副本):
圖:副本機制
-
副本以分區爲單位。每個分區都有各自的主副本。
-
可以通過配置文件,配置副本的個數。
-
一個 Kafka 集羣中,各個節點可能互爲 Leader 和 Follower。
-
主副本叫做 Leader,從副本叫做 Follower,處於同步狀態的副本叫做 In-Sync Replicas(ISR)。
-
如果 Leader 失效,那麼將會有其他的 Follower 來接管成爲新的 Leader。如果由於 Follower 自身的原因,比如網絡原因導致同步落後太多,那麼當 Leader 失效後,就不會將這個 Follower 選爲 leader。
-
由於 Leader 的 Server 承載了全部的請求壓力,因此從集羣的整體考慮,Kafka 會將 Leader 均衡的分散在每個實例上,來保持整體穩定。
-
Follower 通過拉取的方式從 Leader 中同步數據。消費者和生產這都是從 Leader 中讀取數據,不與 Follower 交互。
主副本和從副本的數據同步:
圖:主副本和從副本的數據同步
從 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。
圖:索引文件
-
通過索引信息可以快速定位 message。
-
通過將 index 元數據全部映射到 memory,可以避免 segment file 的 index 數據 IO 磁盤操作。
-
通過索引文件稀疏存儲,可以大幅降低 index 文件元數據佔用空間大小。
-
稀疏存儲:將原來完整的數據,只間隔的選擇多條數據進行存儲。
Kafka Log Cleanup:
日誌的清理方式有兩種:delete 和 compact。
刪除的閾值有兩種:過期的時間和分區內總日誌大小。
刪除
圖:日誌清理方式–compact
compact 操作是保存每個消息的最新 value 值。消息時順序存儲的,offset 大的爲最新的數據。
Kafka 數據可靠性:
Kafka 所有消息都會被持久化到磁盤中,同時 Kafka 通過對 Topic Partition 設置 Replication 來保障數據可靠。
消息傳輸過程中保障通常有以下三種:
-
最多一次(At Most Once):消息可能丟失;消息不會重複發送和處理。
-
最少一次(At Lease Once):消息不會丟失;消息可能會重複發送和處理。
-
僅有一次(Exactly Once):消息不會丟失;消息僅被處理一次。
Kafka 消息傳輸保障機制,通過配置不同的消息發送模式來保障消息傳輸,進而滿足不同的可靠性要求應用場景。
可靠
Kafka 關鍵流程
寫流程:
圖:Kafka 寫流程–Producer 寫數據
總體流程:
- Producer 連接任意存活的 Broker,請求制定 Topic、Partition 的 Leader 元數據信息,然後直接與對應的 Broker 直接鏈接,發佈數據。
開發分區接口:
- 用戶可以指定分區函數,使得消息可以根據 Key,發送到特定的 Partition。
Kafka 讀流程:
圖:Kafka 讀流程–Consumer 讀數據
總體流程:
- Consumer 連接指定 Topic Partition 所在的 Leader Broker,用主動獲取方式從 Kafka 中獲取消息。
Kafka 在 Zookeeper 上的目錄結構
Zookeeper 在 Kafka 的作用:
-
無論是 kafka 集羣,還是 producer 和 consumer 都依賴於 zookeeper 來保證系統可用性集羣保存一些 meta 信息。
-
Kafka 使用 zookeeper 作爲其分佈式協調框架,很好的將消息生產、消息存儲、消息消費的過程結合在一起。
-
同時藉助 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