Kafka原理及單機部署

博文大綱:
1、kafka介紹及原理
2、部署單機kafka前端

1、kafka介紹及原理

kafka是由Apache軟件基金會發布的一個開源流處理平臺,由Scala和Java編寫。它是一種高吞吐量的分佈式發佈的訂閱消息系統,它能夠處理消費者規模的網站中的全部動做流數據。bootstrap

這種動做(網頁瀏覽,搜索和其餘用戶的行動)是在現代網絡上的許多社會功能的一個關鍵因素。 這些數據一般是因爲吞吐量的要求而經過處理日誌和日誌聚合來解決。 對於像Hadoop同樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是經過Hadoop的並行加載機制來統一線上和離線的消息處理,也是爲了經過集羣來提供實時的消息。服務器

一、kafka的特性

kafka是一種高吞吐量的分佈式發佈訂閱消息系統,具備如下特性:網絡

  • 經過磁盤數據結構提供消息的持久化,這種結構對於即便數以TB的消息存儲也可以保持長時間的穩定性能;
  • 持久性:使用文件性存儲,日誌文件存儲消息,須要寫入硬盤,採用達到必定閾值才寫入硬盤,從而減小磁盤I/O,若是kafka忽然宕機,數據會丟失一部分;
  • 高吞吐量:即便是很是普通的硬件kafka也能夠支持每秒數百萬的消息;
  • 支持經過kafka服務器和消費機集羣來分區消息;
  • 支持Hadoop並行數據加載。

二、kafka相關術語

  • Broker:消息中間件處理節點,一個Kafka節點就是一個broker,一個或者多個Broker能夠組成一個Kafka集羣;
  • Topic:Kafka根據topic對消息進行歸類,發佈到Kafka集羣的每條消息都須要指定一個topic;
  • Producer:消息生產者,向Broker發送消息的客戶端;
  • Consumer:消息消費者,從Broker讀取消息的客戶端;
  • ConsumerGroup:每一個Consumer屬於一個特定的Consumer Group,一條消息能夠發送到多個不一樣的Consumer Group,可是一個Consumer Group中只能有一個Consumer可以消費該消息;
  • Partition:物理上的概念,一個topic能夠分爲多個partition,每一個partition內部是有序的。

三、Topic和Partition的區別

一個topic能夠認爲一個一類消息,每一個topic將被分紅多個partition,每一個partition在存儲層面是append log文件。任何發佈到此partition的消息都會被追加到log文件的尾部,每條消息在文件中的位置稱爲offset(偏移量),offset爲long型的數字,它惟一標記一條消息。每條消息都被append到partition中,是順序寫磁盤,所以效率很是高(順序寫磁盤比隨機寫內存的速度還要高,這是kafka高吞吐率的一個很重要的保證)。數據結構

Kafka原理及單機部署

每一條消息被髮送到broker中,會根據partition規則選擇被存儲到哪個partition(默認採用輪詢的方式進行寫入數據)。若是partition規則設置合理,全部消息能夠均勻分佈到不一樣的partition裏,這樣就實現了水平擴展。(若是一個topic對應一個文件,那這個文件所在的機器I/O將會成爲這個topic的性能瓶頸,而partition解決了這個問題),若是消息被消費則保留append.log兩天。架構

四、kafka的架構

Kafka原理及單機部署

如上圖所示,一個典型的kafka體系架構包括若干Producer(能夠是服務器日誌,業務數據,頁面前端產生的page view等),若干個broker(kafka支持水平擴展,通常broker數量越多,集羣吞吐率越高),若干Consumer(Group),以及一個Zookeeper集羣。kafka經過Zookeeper管理集羣配置,選舉出leader,以及在consumer group發生變化時進行從新調整。Producer使用push(推)模式將消息發佈到broker,consumer使用pull(拉)模式從broker訂閱並消費消息。app

zookeeper羣集中有兩個角色:leader和follower,leader對外提供服務,follower負責leader裏面所產生內容同步消息寫入生成時產生replicas(副本);
kafka的高可靠性的保證來源於其健壯的副本(replicas)策略。經過調節其副本相關參數,可使得kafka在性能和可靠性之間運轉之間的遊刃有餘。kafka從0.8.x版本開始提供partition級別的複製的。分佈式

五、kafka的文件存儲機制

kafka中消息是以topic進行分類的,生產者經過topic向kafka broker發送消息,消費者經過topic讀取數據。然而topic在物理層面又能以partition爲分組,一個topic能夠分爲若干個partition,partition還能夠細分爲segment,一個partition物理上由多個segment組成。ide

爲了便於說明問題,假設這裏只有一個kafka集羣,且這個集羣只有一個kafka broker,也就是隻有一臺物理機。在這個kafka broker的server.properties配置文件中定義kafka的日誌文件存放路徑以此來設置kafka消息文件存儲目錄,與此同時建立一個topic:test,partition的數量爲4,啓動kafka就能夠在日誌存放路徑中看到生成4個目錄,在kafka文件存儲中,同一個topic下有多個不一樣的partition,每一個partition爲一個目錄,partition的名稱規則爲:topic名稱+有序序號,第一個序號從0開始。oop

segment是什麼?

若是就以partition爲最小存儲單位,咱們能夠想象當Kafka producer不斷髮送消息,必然會引發partition文件的無限擴張,這樣對於消息文件的維護以及已經被消費的消息的清理帶來嚴重的影響,因此這裏以segment爲單位又將partition細分。每一個partition(目錄)至關於一個巨型文件被平均分配到多個大小相等的segment(段)數據文件中(每一個segment 文件中消息數量不必定相等)這種特性也方便old segment的刪除,即方便已被消費的消息的清理,提升磁盤的利用率。每一個partition只須要支持順序讀寫就行。

segment文件由兩部分組成,分別爲「.index」文件和「.log」文件,分別表示爲segment索引文件和數據文件。這兩個文件的命令規則爲:partition全局的第一個segment從0開始,後續每一個segment文件名爲上一個segment文件最後一條消息的offset值(偏移量),數值大小爲64位,20位數字字符長度,沒有數字用0填充。

六、數據的可靠性和持久性保證

當producer向leader發送數據時,能夠通request.required.acks參數來設置數據可靠性的級別:

  • 1(默認):producer的leader已成功收到數據並獲得確認。若是leader宕機了,則會丟失數據;
  • 0 :producer無需等待來自broker的確認而繼續發送下一批消息。這種狀況下數據傳輸效率最高,可是數據可靠性確是最低的;
  • -1:producer須要等待全部follower都確認接收到數據後纔算一次發送完成,可靠性最高。

七、leader選舉

一條消息只有被全部follower都從leader複製過去纔會被認爲已提交。這樣就避免了部分數據被寫進了leader,還沒來得及被任何follower複製就宕機了,而形成數據丟失。而對於producer而言,它能夠選擇是否等待消息commit。

一種很是經常使用的選舉leader的方式是「少數服從多數」,在進行數據的複製過程當中,存在多個follower,而且每一個follower的數據速度都不相同,當leader宕機後,當前的follower上誰的數據最多誰就是leader。

2、部署單機kafka

一、部署kafka

kafka服務依賴JAVA環境,我這裏默認有。

kafka的安裝包能夠從個人網盤連接中下載

#解包
[root@kafka src]# tar zxf kafka_2.11-2.2.1.tgz 
[root@kafka src]# mv kafka_2.11-2.2.1 /usr/local/kafka
[root@kafka src]# cd /usr/local/kafka/bin/
#啓動zookeeper
[root@kafka bin]# ./zookeeper-server-start.sh ../config/zookeeper.properties &
#啓動kafka
[root@kafka bin]# ./kafka-server-start.sh ../config/server.properties &
[root@kafka bin]# netstat -anpt | grep 9092  #肯定端口在監聽

因爲kafka是經過zookeeper來調度的,因此,即便是單機kafka也須要啓動zookeeper服務,kafka的安裝目錄下是默認集成了zookeeper的,直接啓動便可。

二、測試kafka

#在本機建立kafka,副本數量爲1,分區數量爲1
[root@kafka bin]# ./kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
#查看本機的topic
[root@kafka bin]# ./kafka-topics.sh --list --bootstrap-server localhost:9092
#發送消息到test
[root@kafka bin]# ./kafka-console-producer.sh --broker-list localhost:9092 --topic test
>aaaa
>bbbb
>cccc
#開啓新的終端,進行讀取消息測試,「--from-beginning」表示從開頭讀取
[root@kafka bin]# ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
aaaa
bbbb
cccc

———————— 本文至此結束,感謝閱讀 ————————

相關文章
相關標籤/搜索