溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kafka的原理及單機部署方式

發(fā)布時間:2021-08-05 20:45:28 來源:億速云 閱讀:106 作者:chen 欄目:系統(tǒng)運維

這篇文章主要介紹“Kafka的原理及單機部署方式”,在日常操作中,相信很多人在Kafka的原理及單機部署方式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Kafka的原理及單機部署方式”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!


一、kafka介紹及原理

kafka是由Apache軟件基金會發(fā)布的一個開源流處理平臺,由Scala和Java編寫。它是一種高吞吐量的分布式發(fā)布的訂閱消息系統(tǒng),它可以處理消費者規(guī)模的網(wǎng)站中的所有動作流數(shù)據(jù)。

這種動作(網(wǎng)頁瀏覽,搜索和其他用戶的行動)是在現(xiàn)代網(wǎng)絡(luò)上的許多社會功能的一個關(guān)鍵因素。 這些數(shù)據(jù)通常是由于吞吐量的要求而通過處理日志和日志聚合來解決。 對于像Hadoop一樣的日志數(shù)據(jù)和離線分析系統(tǒng),但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的并行加載機制來統(tǒng)一線上和離線的消息處理,也是為了通過集群來提供實時的消息。

1、kafka的特性

kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),具有以下特性:

  • 通過磁盤數(shù)據(jù)結(jié)構(gòu)提供消息的持久化,這種結(jié)構(gòu)對于即使數(shù)以TB的消息存儲也能夠保持長時間的穩(wěn)定性能;

  • 持久性:使用文件性存儲,日志文件存儲消息,需要寫入硬盤,采用達(dá)到一定閾值才寫入硬盤,從而減少磁盤I/O,如果kafka突然宕機,數(shù)據(jù)會丟失一部分;

  • 高吞吐量:即使是非常普通的硬件kafka也可以支持每秒數(shù)百萬的消息;

  • 支持通過kafka服務(wù)器和消費機集群來分區(qū)消息;

  • 支持Hadoop并行數(shù)據(jù)加載。

2、kafka相關(guān)術(shù)語

  • Broker:消息中間件處理節(jié)點,一個Kafka節(jié)點就是一個broker,一個或者多個Broker可以組成一個Kafka集群;

  • Topic:Kafka根據(jù)topic對消息進(jìn)行歸類,發(fā)布到Kafka集群的每條消息都需要指定一個topic;

  • Producer:消息生產(chǎn)者,向Broker發(fā)送消息的客戶端;

  • Consumer:消息消費者,從Broker讀取消息的客戶端;

  • ConsumerGroup:每個Consumer屬于一個特定的Consumer Group,一條消息可以發(fā)送到多個不同的Consumer Group,但是一個Consumer Group中只能有一個Consumer能夠消費該消息;

  • Partition:物理上的概念,一個topic可以分為多個partition,每個partition內(nèi)部是有序的。

3、Topic和Partition的區(qū)別

一個topic可以認(rèn)為一個一類消息,每個topic將被分成多個partition,每個partition在存儲層面是append log文件。任何發(fā)布到此partition的消息都會被追加到log文件的尾部,每條消息在文件中的位置稱為offset(偏移量),offset為long型的數(shù)字,它唯一標(biāo)記一條消息。每條消息都被append到partition中,是順序?qū)懘疟P,因此效率非常高(順序?qū)懘疟P比隨機寫內(nèi)存的速度還要高,這是kafka高吞吐率的一個很重要的保證)。

Kafka的原理及單機部署方式

每一條消息被發(fā)送到broker中,會根據(jù)partition規(guī)則選擇被存儲到哪一個partition(默認(rèn)采用輪詢的方式進(jìn)行寫入數(shù)據(jù))。如果partition規(guī)則設(shè)置合理,所有消息可以均勻分布到不同的partition里,這樣就實現(xiàn)了水平擴展。(如果一個topic對應(yīng)一個文件,那這個文件所在的機器I/O將會成為這個topic的性能瓶頸,而partition解決了這個問題),如果消息被消費則保留append.log兩天。

4、kafka的架構(gòu)

Kafka的原理及單機部署方式

如上圖所示,一個典型的kafka體系架構(gòu)包括若干Producer(可以是服務(wù)器日志,業(yè)務(wù)數(shù)據(jù),頁面前端產(chǎn)生的page view等),若干個broker(kafka支持水平擴展,一般broker數(shù)量越多,集群吞吐率越高),若干Consumer(Group),以及一個Zookeeper集群。kafka通過Zookeeper管理集群配置,選舉出leader,以及在consumer group發(fā)生變化時進(jìn)行重新調(diào)整。Producer使用push(推)模式將消息發(fā)布到broker,consumer使用pull(拉)模式從broker訂閱并消費消息。

zookeeper群集中有兩個角色:leader和follower,leader對外提供服務(wù),follower負(fù)責(zé)leader里面所產(chǎn)生內(nèi)容同步消息寫入生成時產(chǎn)生replicas(副本);
kafka的高可靠性的保證來源于其健壯的副本(replicas)策略。通過調(diào)節(jié)其副本相關(guān)參數(shù),可以使得kafka在性能和可靠性之間運轉(zhuǎn)之間的游刃有余。kafka從0.8.x版本開始提供partition級別的復(fù)制的。

5、kafka的文件存儲機制

kafka中消息是以topic進(jìn)行分類的,生產(chǎn)者通過topic向kafka broker發(fā)送消息,消費者通過topic讀取數(shù)據(jù)。然而topic在物理層面又能以partition為分組,一個topic可以分為若干個partition,partition還可以細(xì)分為segment,一個partition物理上由多個segment組成。

為了便于說明問題,假設(shè)這里只有一個kafka集群,且這個集群只有一個kafka broker,也就是只有一臺物理機。在這個kafka  broker的server.properties配置文件中定義kafka的日志文件存放路徑以此來設(shè)置kafka消息文件存儲目錄,與此同時創(chuàng)建一個topic:test,partition的數(shù)量為4,啟動kafka就可以在日志存放路徑中看到生成4個目錄,在kafka文件存儲中,同一個topic下有多個不同的partition,每個partition為一個目錄,partition的名稱規(guī)則為:topic名稱+有序序號,第一個序號從0開始。

segment是什么?

如果就以partition為最小存儲單位,我們可以想象當(dāng)Kafka producer不斷發(fā)送消息,必然會引起partition文件的無限擴張,這樣對于消息文件的維護(hù)以及已經(jīng)被消費的消息的清理帶來嚴(yán)重的影響,所以這里以segment為單位又將partition細(xì)分。每個partition(目錄)相當(dāng)于一個巨型文件被平均分配到多個大小相等的segment(段)數(shù)據(jù)文件中(每個segment 文件中消息數(shù)量不一定相等)這種特性也方便old segment的刪除,即方便已被消費的消息的清理,提高磁盤的利用率。每個partition只需要支持順序讀寫就行。

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

6、數(shù)據(jù)的可靠性和持久性保證

當(dāng)producer向leader發(fā)送數(shù)據(jù)時,可以通request.required.acks參數(shù)來設(shè)置數(shù)據(jù)可靠性的級別:

  • 1(默認(rèn)):producer的leader已成功收到數(shù)據(jù)并得到確認(rèn)。如果leader宕機了,則會丟失數(shù)據(jù);

  • 0 :producer無需等待來自broker的確認(rèn)而繼續(xù)發(fā)送下一批消息。這種情況下數(shù)據(jù)傳輸效率最高,但是數(shù)據(jù)可靠性確是最低的;

  • -1:producer需要等待所有follower都確認(rèn)接收到數(shù)據(jù)后才算一次發(fā)送完成,可靠性最高。

7、leader選舉

一條消息只有被所有follower都從leader復(fù)制過去才會被認(rèn)為已提交。這樣就避免了部分?jǐn)?shù)據(jù)被寫進(jìn)了leader,還沒來得及被任何follower復(fù)制就宕機了,而造成數(shù)據(jù)丟失。而對于producer而言,它可以選擇是否等待消息commit。

一種非常常用的選舉leader的方式是“少數(shù)服從多數(shù)”,在進(jìn)行數(shù)據(jù)的復(fù)制過程中,存在多個follower,并且每個follower的數(shù)據(jù)速度都不相同,當(dāng)leader宕機后,當(dāng)前的follower上誰的數(shù)據(jù)最多誰就是leader。

二、部署單機kafka

1、部署kafka

kafka服務(wù)依賴JAVA環(huán)境,我這里默認(rèn)有。

kafka的安裝包可以從我的網(wǎng)盤鏈接中下載。

#解包
[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  #確定端口在監(jiān)聽

由于kafka是通過zookeeper來調(diào)度的,所以,即使是單機kafka也需要啟動zookeeper服務(wù),kafka的安裝目錄下是默認(rèn)集成了zookeeper的,直接啟動即可。

2、測試kafka

#在本機創(chuàng)建kafka,副本數(shù)量為1,分區(qū)數(shù)量為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
#發(fā)送消息到test
[root@kafka bin]# ./kafka-console-producer.sh --broker-list localhost:9092 --topic test
>aaaa
>bbbb
>cccc
#開啟新的終端,進(jìn)行讀取消息測試,“--from-beginning”表示從開頭讀取
[root@kafka bin]# ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
aaaa
bbbb
cccc

到此,關(guān)于“Kafka的原理及單機部署方式”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI