天天看點

kafka學習筆記(一) --- 入門

         kafka作為一款開源的消息引擎系統,主要功能提供提供完備的消息釋出和訂閱的解決方案。它的消息傳遞屬性,就像引擎,具備某種轉化能量的能力。

         根據維基百科的定義,kafka是一組消息規範,企業利用在這組規範在不同系統間,傳遞精确語義定義的消息,實作松耦合的異步式資料傳遞。

         消息引擎最基礎的功能:傳遞對象是消息;如何傳遞消息。

         支援兩種消息引擎模型:點對點;釋出訂閱模型。

         消息引擎的作用:

         削峰填谷:緩沖上下遊瞬時突發流量,使其平滑。一般,上遊的TPS高于下遊,使得下遊服務無法即時處理上遊消息。

         讓兩個系統之間實作松耦合,較少不必要的系統互動。

         專業術語解釋:

         主題(Topic):釋出與訂閱的對象,可以為每個業務、每個應用、或者每類資料定義一個主題。

         生産者(producer):向主題釋出消息的用戶端應用程式。

         消費者(consumer):訂閱主題消息的用戶端應用程式。

         生産者和消費者統稱為用戶端。

         對應于用戶端,kafka的伺服器端由被稱為broker的服務程序構成。即一個kafka叢集由多個broker組成,每個broker負責接收和處理用戶端的請求,以及消息持久化。

         高可用性:1. broker一般分布在多台機器上,這樣隻要有一台機器當機,其他機器仍可對外提供服務。

         2. 備份機制:相同資料拷貝在不同機器,每個備份叫做副本,leader副本和follower副本。

          副本工作機制:生産者向leader副本寫消息,消費者從leader副本讀消息,follower副本向leader副本發送請求,請求leader副本将消息發給它,以保持與上司者同步。

         伸縮性:分區機制(partitioning),每個主題分為多個分區,每個分區是一組有序的消息日志,每條消息隻會被發送到一個分區。kafka分區編号從0開始,分區位移(offset)也是從0開始。

        kafka的三層消息架構:

        主題層:每個主題分為多個分區,每個分區有多個副本。

        分區層:每個分區的多個副本,隻能有一個leader,對外提供服務,其他的是follower,提供資料備援之用。

        消息層:每個分區由若幹消息組成, 消息位移從0開始。

        怎樣持久化資料:kafka使用消息日志儲存消息,一個消息日志就是磁盤上隻能被追加寫的實體檔案。追加寫,避免了緩慢的随機IO操作,改為性能較好的順序IO寫操作(高吞吐量的手段之一)。每個消息日志,進一步分為多個日志段,消息被追加寫道目前最新日志段,寫滿即封存,開啟新的日志段。kafka在後天定期檢查老的日志段,過期的就删除,實作磁盤空間回收。

        kafka實作點對點模型是通過消費者組機制,多個消費者執行個體構成一個消費者組,消費一個主題,其中主題的每個分區隻能被一個消費者執行個體消費。這樣,多個消費者執行個體同時消費消息,增加了消費端的吞吐量(TPS)。            

       消費者組中的執行個體不僅可以瓜分訂閱主題的資料,還彼此協助,即當某個消費者執行個體挂掉,kafka自動檢測,把挂掉消費者執行個體消費的分區轉移給其他的分區。被稱為重平衡(rebalance)。

       kafka僅僅是消息引擎嗎?

       kafka設計之初,旨在提供三方面特性:提供一套API實作生産者和消費者;降低網絡傳輸和磁盤存儲開銷;實作高伸縮性架構。

       apache kafka 是消息引擎系統,也是分布式流處理平台。與其他主流大資料流式計算架構,有兩點優勢:端到端的正确性;對于自己流式計算的定位。

       另外,kafka還可以用作分布式存儲系統。

       kafka組織:apache kafka; confluent kafka; CDH kafka和HDP kafka。

      如果僅僅需要一個消息引擎系統亦或簡單的流處理應用場景,同時需要對系統有較大的把控度,推薦使用apache kafka;

      如果需要kafka的一些進階特性,推薦使用confluent kafka;

      如果需要快速搭建消息引擎系統,或者需要建構多架構構成的資料平台且kafka隻是其中一個元件,推薦使用第三者。

      kafka版本演進:

      比如:

kafka學習筆記(一) --- 入門

        kafka_2.11-2.1.1,真正版本号2.1.1, 2-大版本号,major version,中間的1-小版本号,minor version, 後面的1-修訂版本号,patch号。“大版本号-小版本号-Patch号”。

        kafka目前演進了7個大版本,0.7、0.8、0.9、0.10、0.11、1.0、2.0。

        0.7版本:隻提供基礎的消息隊列功能,連基本的副本機制都沒有。

        0.8版本:引入副本機制,成為一個真正意義的完備的分布式高可靠消息隊列解決方案。使用的是老版本的用戶端API,在開發生産者和消費者,需指定Zookeeper位址而非Broker位址。在0.8.2.0中開始引入新版本Producer API,需指定Broker位址的Producer。如果還在用0.8.1.1、0.8.2,建議更新到0.8.2.2,消費者API比較穩定,但不要用新版本Producer API。

        0.9.0.0:增加了基礎的安全認證/權限功能,同時使用JAVA重寫了新版本消費者API,還引入了kafka connect元件(實作高性能的資料抽取)。新版本的Producer API比較穩定,但不要使用新版本consumer API。

        0.10.0.0:引入kafka streams,kafka正式更新為分布式流處理平台,但還基本不能線上部署。新版本的consumer API比較穩定。

        0.11.0.0:提供幂等性Producer API,以及事務API,對kafka消息格式重構。

        1.0和2.0:主要在kafka streams的各種改進。在消息引擎方面并未有太多變化。

        建議:盡量保證伺服器端和用戶端版本一緻,否則會損失很多性能優化效益。

    标注:這個系列文章是本人在極客時間專欄---kafka核心技術與實戰中的學習筆記

    https://time.geekbang.org/column/article/101171