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

  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架構圖

基本概念:

  • 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:

圖: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的作用:

  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,將數據重新發布到目標集羣。


IT技術分享社區


個人博客網站:https://programmerblog.xyz


文章推薦 程序員效率:畫流程圖常用的工具 程序員效率:整理常用的在線筆記軟件 遠程辦公:常用的遠程協助軟件,你都知道嗎? 51單片機程序下載、ISP及串口基礎知識 硬件:斷路器、接觸器、繼電器基礎知識





本文分享自微信公衆號 - IT技術分享社區(gh_a27c0758eb03)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章