大數據--kafka學習

第一部分 Kafka架構與實戰

1.1 概念和基本架構

1.1.1 Kafka介紹

Kafka是最初由Linkedin公司開發,是一個分佈式、分區的、多副本的、多生產者、多訂閱者,基
於zookeeper協調的分佈式日誌系統(也可以當做MQ系統),常見可以用於web/nginx日誌、訪問日
志,消息服務等等,Linkedin於2010年貢獻給了Apache基金會併成爲頂級開源項目。

主要應用場景是:日誌收集系統和消息系統。
Kafka主要設計目標如下:
	  以時間複雜度爲O(1)的方式提供消息持久化能力,即使對TB級以上數據也能保證常數時間的訪問性能。
	  高吞吐率。即使在非常廉價的商用機器上也能做到單機支持每秒100K條消息的傳輸。
	  支持Kafka Server間的消息分區,及分佈式消費,同時保證每個partition內的消息順序傳輸。
*	  同時支持離線數據處理和實時數據處理。
	  支持在線水平擴展

  • 有兩種主要的消息傳遞模式:點對點傳遞模式、發佈-訂閱模式。大部分的消息系統選用發佈-訂閱模式。Kafka就是一種發佈-訂閱模式。

  • 對於消息中間件,消息分推拉兩種模式。Kafka只有消息的拉取,沒有推送,可以通過輪詢實現消息的推送

      1. Kafka在一個或多個可以跨越多個數據中心的服務器上作爲集羣運行。
      1. Kafka集羣中按照主題分類管理,一個主題可以有多個分區,一個分區可以有多個副本分區。
      1. 每個記錄由一個鍵,一個值和一個時間戳組成。

Kafka具有四個核心API:

    1. Producer API:允許應用程序將記錄流發佈到一個或多個Kafka主題。
    1. Consumer API:允許應用程序訂閱一個或多個主題並處理爲其生成的記錄流。
    1. Streams API:允許應用程序充當流處理器,使用一個或多個主題的輸入流,並生成一個或多個輸出主題的輸出流,從而有效地將輸入流轉換爲輸出流。
    1. Connector API:允許構建和運行將Kafka主題連接到現有應用程序或數據系統的可重用生產者或使用者。例如,關係數據庫的連接器可能會捕獲對錶的所有更改。

1.1.2 Kafka優勢

1. 高吞吐量:單機每秒處理幾十上百萬的消息量。即使存儲了許多TB的消息,它也保持穩定的
性能。
2. 高性能:單節點支持上千個客戶端,並保證零停機和零數據丟失。
3. 持久化數據存儲:將消息持久化到磁盤。通過將數據持久化到硬盤以及replication防止數據丟失。
	1. 零拷貝
	2. 順序讀,順序寫
	3. 利用Linux的頁緩存
4. 分佈式系統,易於向外擴展。所有的Producer、Broker和Consumer都會有多個,均爲分佈
式的。無需停機即可擴展機器。多個Producer、Consumer可能是不同的應用。
5. 可靠性 - Kafka是分佈式,分區,複製和容錯的。
6. 客戶端狀態維護:消息被處理的狀態是在Consumer端維護,而不是由server端維護。當失敗
時能自動平衡。
7. 支持online和offline的場景。
8. 支持多種客戶端語言。Kafka支持Java、.NET、PHP、Python等多種語言。

1.1.3 Kafka應用場景

日誌收集:一個公司可以用Kafka可以收集各種服務的Log,通過Kafka以統一接口服務的方式開放給各種Consumer;

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

用戶活動跟蹤:Kafka經常被用來記錄Web用戶或者App用戶的各種活動,如瀏覽網頁、搜索、點擊等活動,這些活動信息被各個服務器發佈到Kafka的Topic中,然後消費者通過訂閱這些Topic來做實時的監控分析,亦可保存到數據庫;

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

流式處理:比如Spark Streaming和Storm。

1.1.4 基本架構

消息和批次
Kafka的數據單元稱爲消息。可以把消息看成是數據庫裏的一個“數據行”或一條“記錄”。消息由字節數組組成。

消息有鍵,鍵也是一個字節數組。當消息以一種可控的方式寫入不同的分區時,會用到鍵。

爲了提高效率,消息被分批寫入Kafka。批次就是一組消息,這些消息屬於同一個主題和分區。

把消息分成批次可以減少網絡開銷。批次越大,單位時間內處理的消息就越多,單個消息的傳輸時間就越長。批次數據會被壓縮,這樣可以提升數據的傳輸和存儲能力,但是需要更多的計算處理。

模式

消息模式(schema)有許多可用的選項,以便於理解。如JSON和XML,但是它們缺乏強類型處理能力。Kafka的許多開發者喜歡使用Apache Avro。Avro提供了一種緊湊的序列化格式,模式和消息體分開。當模式發生變化時,不需要重新生成代碼,它還支持強類型和模式進化,其版本既向前兼容,也向後兼容。

數據格式的一致性對Kafka很重要,因爲它消除了消息讀寫操作之間的耦合性。

主題和分區
Kafka的消息通過主題進行分類。主題可比是數據庫的表或者文件系統裏的文件夾。主題可以被分爲若干分區,一個主題通過分區分佈於Kafka集羣中,提供了橫向擴展的能力。

生產者和消費者
生產者創建消息。消費者消費消息。
一個消息被髮布到一個特定的主題上。
生產者在默認情況下把消息均衡地分佈到主題的所有分區上:
	1. 直接指定消息的分區
	2. 根據消息的key散列取模得出分區
	3. 輪詢指定分區。
消費者通過偏移量來區分已經讀過的消息,從而消費消息。
消費者是消費組的一部分。消費組保證每個分區只能被一個消費者使用,避免重複消費。

broker和集羣
  • 一個獨立的Kafka服務器稱爲broker。broker接收來自生產者的消息,爲消息設置偏移量,並提交消息到磁盤保存。broker爲消費者提供服務,對讀取分區的請求做出響應,返回已經提交到磁盤上的消息。單個broker可以輕鬆處理數千個分區以及每秒百萬級的消息量。

    每個集羣都有一個broker是集羣控制器(自動從集羣的活躍成員中選舉出來)

    控制器負責管理工作: 將分區分配給broker 監控broker

    集羣中一個分區屬於一個broker,該broker稱爲分區首領。

    一個分區可以分配給多個broker,此時會發生分區複製。

    分區的複製提供了消息冗餘,高可用。副本分區不負責處理消息的讀寫。

1.1.5 核心概念

1.1.5.1 Producer

生產者創建消息。
該角色將消息發佈到Kafka的topic中。broker接收到生產者發送的消息後,broker將該消息追加到
當前用於追加數據的 segment 文件中。
一般情況下,一個消息會被髮布到一個特定的主題上。
1. 默認情況下通過輪詢把消息均衡地分佈到主題的所有分區上。
2. 在某些情況下,生產者會把消息直接寫到指定的分區。這通常是通過消息鍵和分區器來實現
的,分區器爲鍵生成一個散列值,並將其映射到指定的分區上。這樣可以保證包含同一個鍵的
消息會被寫到同一個分區上。
3. 生產者也可以使用自定義的分區器,根據不同的業務規則將消息映射到分區。

1.1.5.2 Consumer

消費者讀取消息。
1. 消費者訂閱一個或多個主題,並按照消息生成的順序讀取它們。
2. 消費者通過檢查消息的偏移量來區分已經讀取過的消息。偏移量是另一種元數據,它是一個不
斷遞增的整數值,在創建消息時,Kafka 會把它添加到消息裏。在給定的分區裏,每個消息的
偏移量都是唯一的。消費者把每個分區最後讀取的消息偏移量保存在Zookeeper 或Kafka
上,如果消費者關閉或重啓,它的讀取狀態不會丟失。
3. 消費者是消費組的一部分。羣組保證每個分區只能被一個消費者使用。
4. 如果一個消費者失效,消費組裏的其他消費者可以接管失效消費者的工作,再平衡,分區重新分配。

1.1.5.3 Broker

一個獨立的Kafka 服務器被稱爲broker。
broker 爲消費者提供服務,對讀取分區的請求作出響應,返回已經提交到磁盤上的消息。
	1. 如果某topic有N個partition,集羣有N個broker,那麼每個broker存儲該topic的一個partition。 
	2. 如果某topic有N個partition,集羣有(N+M)個broker,那麼其中有N個broker存儲該topic的
	一個partition,剩下的M個broker不存儲該topic的partition數據。
	3. 如果某topic有N個partition,集羣中broker數目少於N個,那麼一個broker存儲該topic的一個或多個partition。在實際生產環境中,儘量避免這種情況的發生,這種情況容易導致Kafka集羣數據不均衡。


broker 是集羣的組成部分。每個集羣都有一個broker 同時充當了集羣控制器的角色(自動從集羣
的活躍成員中選舉出來)。
控制器負責管理工作,包括將分區分配給broker 和監控broker。
在集羣中,一個分區從屬於一個broker,該broker 被稱爲分區的首領。

1.1.5.4 Topic

每條發佈到Kafka集羣的消息都有一個類別,這個類別被稱爲Topic。
物理上不同Topic的消息分開存儲。
主題就好比數據庫的表,尤其是分庫分表之後的邏輯表。

1.1.5.5 Partition

  1. 主題可以被分爲若干個分區,一個分區就是一個提交日誌。
  2. 消息以追加的方式寫入分區,然後以先入先出的順序讀取。
  3. 無法在整個主題範圍內保證消息的順序,但可以保證消息在單個分區內的順序。
  4. Kafka 通過分區來實現數據冗餘和伸縮性。
  5. 在需要嚴格保證消息的消費順序的場景下,需要將partition數目設爲1。

1.1.5.6 Replicas

Kafka 使用主題來組織數據,每個主題被分爲若干個分區,每個分區有多個副本。那些副本被保存
在broker 上,每個broker 可以保存成百上千個屬於不同主題和分區的本。
副本有以下兩種類型:
首領副本
每個分區都有一個首領副本。爲了保證一致性,所有生產者請求和消費者請求都會經過這個副本。
跟隨者副本
首領以外的副本都是跟隨者副本。跟隨者副本不處理來自客戶端的請求,它們唯一的任務就是從首領那裏複製消息,保持與首領一致的狀態。如果首領發生崩潰,其中的一個跟隨者會被提升爲新首領。

1.1.5.7 Offset

生產者Offset
消息寫入的時候,每一個分區都有一個offset,這個offset就是生產者的offset,同時也是這個分區的最新最大的offset。
有些時候沒有指定某一個分區的offset,這個工作kafka幫我們完成。

消費者Offset

這是某一個分區的offset情況,生產者寫入的offset是最新最大的值是12,而當Consumer A進行消費時,從0開始消費,一直消費到了9,消費者的offset就記錄在9,Consumer B就紀錄在了11。等下一次他們再來消費時,他們可以選擇接着上一次的位置消費,當然也可以選擇從頭消費,或者跳到最近的記錄並從“現在”開始消費。

1.1.5.8 副本

分區中的所有副本統稱爲AR(Assigned Repllicas)。
AR=ISR+OSR
1.1.5.8.2 ISR
所有與leader副本保持一定程度同步的副本(包括Leader)組成ISR(In-Sync Replicas),ISR集
合是AR集合中的一個子集。消息會先發送到leader副本,然後follower副本才能從leader副本中拉取消
息進行同步,同步期間內follower副本相對於leader副本而言會有一定程度的滯後。前面所說的“一定程
度”是指可以忍受的滯後範圍,這個範圍可以通過參數進行配置。
1.1.5.8.3 OSR
與leader副本同步滯後過多的副本(不包括leader)副本,組成OSR(Out-Sync Relipcas)。在正常
情況下,所有的follower副本都應該與leader副本保持一定程度的同步,即AR=ISR,OSR集合爲空。
1.1.5.8.4 HW
HW是High Watermak的縮寫, 俗稱高水位,它表示了一個特定消息的偏移量(offset),消費之
只能拉取到這個offset之前的消息。
1.1.5.8.5 LEO
LEO是Log End Offset的縮寫,它表示了當前日誌文件中下一條待寫入消息的offset。

Kafka安裝與配置

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