80%知識點之分佈式消息隊列Kafka

一、Kafka是什麼

二、分片與副本機制

三、消息不丟失機制

四、分發策略

五、負載均衡

六、文件存儲與查詢機制

七、安全性


一、Kafka是什麼

Kafka是一個開源的分佈式消息隊列,通過緩衝,來異構、解耦系統,與其他MQ相比,其優勢在於高吞吐高性能。

上圖所示爲Kafka的基本架構,主要爲:

Cluster:由多個服務器組成,每個服務器單獨叫broker

Broker:Kafka集羣中包含的服務器

Producer:消息生產者,發佈消息到Kafka集羣的終端或者服務

Consumer:消息消費者,負責消費數據

Topic:主題,一類消息的名稱

 

二、分片與副本機制

分片機制:主要解決了單臺服務器存儲容量有限的問題。

當數據量非常大的時候,一個服務器存放不了,就將數據分成兩個或者多個部分,存放在多臺服務器上。每個服務器上的數據,叫做一個分片。

副本機制:解決了數據存儲的高可用問題。

當數據只保存一份的時候,有丟失的風險。爲了更好的容錯和容災,將數據拷貝幾份,保存到不同的機器上。

 

三、消息不丟失機制

1、生產者端

生產者數據部不丟失,需要服務器端返回一個ack。

1) 消息確認分爲三個狀態

​ a) 0:生產者只負責發送數據

​ b) 1:某個partition的leader收到數據給出響應

​ c) -1:某個partition的所有副本都收到數據後給出響應

2) 在同步模式下

​ a) 生產者等待10S,如果broker沒有給出ack響應,就認爲失敗。

​ b) 生產者重試3次,如果還沒有響應,就報錯。

3) 在異步模式下

​ a) 先將數據保存在生產者端的buffer中。Buffer大小是2萬條。

​ b) 滿足數據閾值或者數量閾值其中的一個條件就可以發送數據。

​ c) 發送一批數據的大小是500條。

如果broker遲遲不給ack,而buffer又滿了。可以設置是否直接清空buffer中的數據。

2、Broker端

broker端的消息不丟失,其實就是用partition副本機制來保證。

Producer ack -1(all). 能夠保證所有的副本都同步好了數據。其中一臺機器掛了,並不影像數據的完整性。

3、消費者端

消費者,有偏移量記錄消費到哪裏。

只要記錄offset值,消費者端不會存在消息不丟失的可能。只會重複消費。

當Kafka中的偏移量與zookeeper中的偏移量不一致就會重複消費

四、分發策略

分發就是消息發到哪裏,哪個分片

  1.  如果是用戶指定了partition,生產就不會調用DefaultPartitioner.partition()方法,數據分發策略的時候,可以指定數據發往哪個partition。當ProducerRecord 的構造參數中有partition的時候,就可以發送到對應partition上。

    public ProducerRecord(String topic, Integer partition, K key, V value) {
        this(topic, partition, null, key, value, null);
    }

     

  2. 當用戶指定key,使用hash算法,找出分片。

  3. 當用既沒有指定partition也沒有key。使用輪詢的方式發送數據。

五、負載均衡

生產者生產消息太快,消費者消費不過來怎麼辦?

  • 點對點消費
  • 消費者組裏,消費者<=分片數

六、文件存儲機制

segment段中有兩個核心的文件一個是log,一個是index。 當log文件等於1G時,新的會寫入到下一個segment中。

超1G創建新的文件,過期會刪掉(默認7天刪除)。

磁盤的文件只能順序往裏面寫,不能改。因爲,硬盤的隨機寫和順序寫有非常大的差異。

爲了保證高吞吐,只能讓你在文件後面一直追加。

七、文件查詢機制

讀取offset=368776的message,需要通過下面2個步驟查找。

a、查找segment file
00000000000000000000.index表示最開始的文件,起始偏移量(offset)爲0

00000000000000368769.index的消息量起始偏移量爲368770=368769+1

00000000000000737337.index的起始偏移量爲737338=737337+1

其他後續文件依次類推。

以起始偏移量命名並排序這些文件,只要根據offset**二分查找**文件列表,就可以快速定位到具體文件。當offset=368776時定

位到00000000000000368769.index和對應log文件。

b、通過 segment file 查找message

當offset=368776時,依次定位到00000000000000368769.index的元數據物理位置和00000000000000368769.log的物理偏移地

址然後再通過00000000000000368769.log順序查找直到offset=368776爲止。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章