1. 程式人生 > >Kafka(一) 安裝與配置

Kafka(一) 安裝與配置

       Kafka是一個可水平擴充套件、高吞吐量、分散式的釋出-訂閱訊息系統,一個分散式流式處理平臺,其核心模組使用Scala語言開發,支援多種語言的客戶端。

     基本概念

     主題

       一組訊息抽象歸納為一個主題,即一個主題就是對訊息的一個分類。

     訊息(Record)

       Kafka通訊的基本單位,由一個固定長度的訊息頭和一個可變長度的訊息體構成。訊息支援Gzip、Snappy、LZ4這三種壓縮方式。

    分割槽和副本

       一個主題可被分成一個或多個分割槽,每個分割槽由一系列有序、不可變的訊息組成,是一個有序佇列,每個分割槽在物理上對應為一個資料夾。

    Leader副本和Follower副本

       一個分割槽可以有多個副本,其資料需保持一致,其中有一個作為Leader,其他作為Follower,各Follower從Leader同步資料來保證資料一致性,在Leader失效後,在Follower之間選舉一個新的分割槽副本作為Leader。

     偏移量

       每條訊息在日誌檔案中的位置都會對應一個按序遞增的偏移量,偏移量是一個分割槽下嚴格有序的邏輯值,不表示訊息在磁碟上的物理位置。

    日誌段

       日誌可被劃分為多個日誌段,它是Kafka日誌物件分片的最小單位,是一個邏輯概念。

     代理(Broker)

        一個Kafka叢集由多個Kafka例項構成,在叢集中,每個Kafka例項稱為代理,每個代理都有唯一的標識id。代理是無狀態的,即代理不記錄訊息是否被消費,訊息偏移量的管理交由消費者自己或組協調器來維護。

     生產者

       生產者負責將訊息發生給代理。

     消費者和消費組

       消費者以pull方式拉取資料,每個消費者都屬於一個特定消費組,預設消費組為test-consumer-group,每個消費組都有唯一的標識id。

       同一個主題的一條訊息只能被同一個消費組下某一個消費者消費,但是不同消費組的消費者可同時消費該訊息。

     ISR(In-sync Replica)

       Kafka在ZooKeeper中動態維護了一個ISR,即儲存同步的副本列表,該列表儲存的是與Leader副本保持訊息同步的所有副本對應的代理節點的id。

     ZooKeeper

       ZooKeeper是一個分散式應用程式協調服務框架,分散式應用程式可以基於ZookKeeper來實現同步服務、配置維護、命名服務等,Kafka利用ZooKeeper儲存相應元資料資訊,Kafka元資料資訊包括如代理節點資訊、Kafka叢集資訊、主題資訊等等。

    安裝與配置

      1. 首先需要JDK1.8,安裝很簡單,不做介紹。

      

      2. 遠端登入免密碼配置

      2.1 建立RSA金鑰對

            ssh-keygen -t rsa

      2.2 將2.1步驟生成的id_rsa.pub內容追加到授權的key檔案中

            cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

            此時,已經可在本機免密登入本機。

      2.3 在叢集環境中,2.2步驟生成的authorized_keys檔案拷貝到其他電腦,如B機器,然後在B機器重複2.1步驟和2.2步驟。

      2.4 在叢集環境中,接著步驟2.3,將2.3步驟的authorized_keys檔案拷貝到C機器,重複步驟2.1和2.2,類似接力,這樣,叢集各個電腦就可以互相免密登入了。

      下載壓縮包解壓配置環境變數就可以了,很簡單:

            

      配置檔案在子目錄conf下有一個模板,我們改個名字即可:

      

      配置檔案內容很簡單,如下:

      

      配置檔案內容說明:

      - tickTime : ZooKeeper的一個時間單元,其所有時間都以這個為基準,預設2S。

      - initLimit : Follower在啟動過程會從Leader同步所有最新資料,從而確定自己能夠對外服務的起始狀態。如果在10*2000ms還沒完成資料同步,則Follower啟動失敗。

      - syncLimit : Leader和Follower之間通訊請求和應答的時間長度,可以說是心跳。

     - dataDir : 儲存快照檔案的目錄,預設日誌也會存放同一個目錄,建議增加配置dataLogDir來分開儲存

     - clientPort : 對外埠

      對於單機環境的ZooKeeper,只需修改一個配置檔案,然後啟動即可。

      對於叢集環境,按如下配置:

      A. 如有3臺機: 192.168.11.1, 192.168.11.2, 192.168.11.3,以在192.168.11.1配置為例:

          修改檔案/etc/hosts檔案,增加配置:

          192.168.11.1 server-1

          192.168.11.2 server-2

          192.168.11.3 server-3

      B. 修改zoo.cfg檔案,增加配置:

          server.1=server-1:3277:3288

          server.2=server-2:3277:3288

          server.3=server-3:3277:3288

          其中,server.1的1是ZooKeeper的伺服器id,3277是該伺服器與Leader交換資訊的埠,3288是選舉時伺服器相互通訊的埠。

      C. 在dataDir目錄下新建檔案: myid,內容為1

      D. 其他兩臺伺服器類似配置即可。

      4. 啟動,這裡我就配置單機環境吧,直接在Mac上搞

      

      檢視狀態:

      

      standalone即為標準的單機模式。

     

      5. Kafka安裝配置

      

            同樣是下載壓縮包然後配置環境變數,然後配置$KAFKA_HOME/config/server.properties檔案即可。

           

            

            

            這裡ZooKeeper和Kafka安裝在一臺機,所以這裡保持預設:

           

           如果是連線到叢集,則如下:

           zookeeper.connect=server-1:2181,server-2:2181,server-3:2181

      6. 啟動Kafka

          首先確保ZooKeeper已啟動執行。

          

         登入ZooKeeper看看:

                   如果要在一臺機測試Kafka叢集,可以複製server.properties檔案,然後修改broker.id和埠,然後分別針對不同配置檔案啟動,就可以達到偽分散式的效果。

       7. 管理頁面安裝

      為了方便了解Kafka執行情況,這裡採用原始碼編譯安裝Kafka Manager網頁工具,當然,這次編譯後的檔案以後可以直接拷貝到其他電腦進行安裝執行,也節省時間:

      

      編譯Kafka manager:

      

     發生錯誤:

     

     自己去網上下載然後放到指定目錄下:

     

     重新編譯,額,還是好慢啊~我們增加下配置:

     

     檔案內容如下:

[repositories]
local
aliyun: http://maven.aliyun.com/nexus/content/groups/public
typesafe: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly

      重新編譯,速度快很多啊~~~  

      把編譯好的放到特定目錄下:

      

     修改配置檔案conf/applicatino.conf

       

     啟動:

     

    上面的命令可以後臺執行。

    

     點選這裡跳到增加叢集的視窗:

     

     輸入相關資訊:

     

       這裡只輸入了這兩個資訊,其他預設。新增後可以看到代理的資訊如下所示:

     最後,注意到如下這個檔案:

     

    Kafka Manager關閉程序可以通過kill -9 {程序ID},但是記得也刪了這個檔案,以免下次啟動失敗。