kafka

若葉時代發表於2020-11-09

Kafka是一個分散式訊息佇列,具有高效能、高吞吐量、系統快速, 可擴充套件並且可持久化.

 

1 基本架構

(1) Topic/主題:訊息根據Topic進行歸類

(2) Producer/生產者:傳送訊息者,向kafka broker發訊息的客戶端

(3) Consumer/消費者:訊息接受者,向kafka broker取訊息的客戶端

(4) broker:一臺kafka伺服器就是一個broker,一個叢集由多個broker組成,一個broker可以容納多個topic

(5) Zookeeper:儲存一些meta資訊,來保證系統可用性

(6) Consumer Group/消費組:kafka用來實現一個topic訊息的廣播(發給所有的consumer)和單播(發給任意一個consumer)的手段。一個topic可以有多個CG。topic的訊息會複製(不是真的複製,是概念上的)到所有的CG,但每個partion只會把訊息發給該CG中的一個consumer。如果需要實現廣播,只要每個consumer有一個獨立的CG就可以了。要實現單播只要所有的consumer在同一個CG。用CG還可以將consumer進行自由的分組而不需要多次傳送訊息到不同的topic

(7) Partition:為了實現擴充套件性,一個非常大的topic可以分佈到多個broker上,一個topic可以分為多個partition,每個partition是一個有序的佇列。partition中的每條訊息都會被分配一個有序的id(offset)。kafka只保證按一個partition中的順序將訊息發給consumer,不保證一個topic的整體(多個partition間)的順序

(8) Offset:kafka的儲存檔案都是按照offset.kafka來命名,用offset做名字的好處是方便查詢。例如你想找位於2049的位置,只要找到2048.kafka的檔案即可。

(9) Replication:Kafka支援以Partition為單位對Message進行冗餘備份,每個 Partition都可以配置至少1個Replication(當僅1個Replication時即僅該Partition本身)

(10) Leader:每個Replication集合中的Partition都會選出一個唯一的Leader,所有的讀寫請求都由Leader處理。其他Replicas從Leader處把資料更新同步到本地,過程類似大家熟悉的MySQL中的Binlog同步。每個Cluster當中會選舉出一個Broker來擔任Controller,負責處理Partition的Leader選舉,協調Partition遷移等工作.

 

2 基本原理

2.1 分片與副本機制

(1) 分片:當資料量非常大的時候,一個伺服器存放不了,就將資料分成兩個或者多個部分,存放在多臺伺服器上。每個伺服器上的資料,叫做一個分片。

(2) 副本:當資料只儲存一份的時候,有丟失的風險。為了更好的容錯和容災,將資料拷貝幾份,儲存到不同的機器上。

 

2.2 訊息儲存及查詢機制

Kafka的資料按照topic來儲存,每個topic又包含多個partition.然後對每個partition的資料進行切分儲存,包含有兩個核心的檔案,log用來儲存資料,index用來記錄資料的偏移量.當log檔案等於1G時,新的會寫入到下一個segment中.根據index來讀取資料.

 

2.3 訊息不丟失機制

(1) 生產者端訊息不丟失

訊息確認分為三個狀態:0()生產者只負責傳送資料),1(某個partition的leader收到資料給出響應),-1(某個partition的所有副本都收到資料後給出響應).訊息生產分為同步模式和非同步模式.

①同步模式:生產者等待數秒,如果broker沒有給出ack響應,就認為失敗;生產者重試幾次,如果還沒有響應,就報錯。

②非同步模式下:先將資料儲存在生產者端的buffer中,滿足資料閾值或者數量閾值其中的一個條件就可以傳送資料。

(2) Borker端訊息不丟失:通過副本機制來保證.

(3) 消費者端訊息不丟失:通過offset來保證.

 

2.4 分發策略

生產者資料分發策略:預設使用輪詢的方式傳送資料.

消費者的負載均衡機制:一個partition只能被一個組中的成員消費。

所以如果消費組中有多於partition數量的消費者,那麼一定會有消費者無法消費資料。

 

3 命令

su kafka

 

--建立

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 2 --partitions 3 --topic test

 

--修改分割槽數

bin/kafka-topics.sh --alter --zookeeper localhost:2181/kakfa --topic im_server_stage_crowd --partitions 3

 

--檢視所有topic

bin/kafka-topics.sh --list --zookeeper localhost:2181

--檢視分割槽和副本

bin/kafka-topics.sh --describe --zookeeper localhost:2181

 

--生產

bin/kafka-console-producer.sh --broker-list listeners地址 --topic test1

備註:listeners地址:config/server.properties的listeners屬性

--消費topic

bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic topic名稱

 

--刪除topic

bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic topic名稱

相關文章