Kafka原理


 

Kafka有兩種模式:

點對點模式:消費者主動從Kafka中定時輪詢的拉取數據,一條數據只會發送給customer group中的一個customer進行消費。

發布訂閱者模式:kafka主動推送數據到所有訂閱了該類信息的客戶端。

Kafka中通過控制Customer的參數{group.id}來決定kafka是什么數據消費模式,如果所有消費者的該參數值是相同的,那么此時的kafka就是隊列模式,數據只會發送到一個customer,此時Kafka類似於負載均衡;否則就是發布訂閱模式; 在隊列模式下,可能會觸發Kafka的Consumer Rebalance

kafka是依賴Zookeeper的,kafka中節點的狀態信息和消費者的消費消息的狀態信息會保存在zookeeper中,且zookeeper只保存這兩點信息

 

kafka中存在幾個概念:Broker、Topic、Partition

Broker:為一個節點,每開啟一個kafka服務就會有一個Broker

Topic:為主題。kafka中消息是分類別的,kafka是通過topic來為消息分類的,每一個topic代表着一種消息類型。同一個topic可以存在於多個Broker中

Partition:為分區,分區存在於topic中,每個topic中會存在多個分區。在Kafka中分區是操作的最小單元,生產者生產的消息必須存儲在topic中的某一個分區上。消息存放在哪個分區是根據消息的Key的哈希值來確定的。分區本身是以隊列的形式保存消息的。

      每個分區的消息是有序的,多個分區間的消息是無序的。

冗余機制replication

Partition分區分主從即Leader和Follower,Follower不會進行任何與客戶端的交互,即不會與生產者或消費者溝通,它的唯一的作用是實時的從Leader角色的Partition中同步備份數據,起到高可用的作用。如果作為Leader角色的broker節點宕機了,Follower會自動升級為Leader繼續同生產者、消費者溝通。

 同一個分區可以存在於多個broker節點中,同一個Topic主題存在多個分區,每個分區會有主(Leader)有備(Follower),主分區和備分區會交錯的存在於不同的broker節點。如上圖所示有主題topicA存在於節點broker1和broker2中,topicA中存有分區Partition0和Partition1,broker1中的分區Partition0作為leader,

Zookeeper的作用

kafka集群依賴zookeeper,zookeeper在kafka集群中起者兩點作用

1、zookeeper會保存整個集群中broker節點的狀態信息。當作為leader的broker節點宕機時,作為Follower的broker節點會自動升級為Leader,然而Follower是如何知道Leader已經掛掉呢,這個時候zookeeper會通過心跳包檢測Leader的狀態,當接收不到心跳后便會認為它掛掉了,然后選舉一個Follower作為Leader重新開始與生產者、消費者保持通信。

2、zookeeeper會保存消費者的消費消息狀態。kafka中每一個分片都是一個隊列,當Consumer消費消息時,隊列的下標(也叫偏移量offset)會移動,當集群因為某些原因關機了或掛掉了,我們再次重啟集群進行消費時怎么知道上次消費到什么位置了,怎么確定隊列的偏移量。這個時候zookeeper就起作用了。zookeeper保存了這些狀態信息,Consumer可從zookeeper中讀取到上次消費的位置,繼續未完成的消費。當然也可以重置偏移量offset從頭開始消費,因為kafka中的消息會持久化到磁盤中,默認會保存7天。

消費者group組:創建消費者的時候可指定屬於哪個組,group組有幾個特點:

1、同一時刻一個group組只能有一個消費者去消費數據

2、同一個group組中的消費者是不會重復消費消息的

3、消費者消費消息是以Partition為單元的。消費者會和某一個Partition建立連接,一旦這個連接建立成功,該Partition中的消息都由這個消費者消費,而不會交給同組的其他消費者。

二、生產者寫入流程

1、生產者發送消息如何存儲的

切換到/tmp/kafka-logs,也就是我們在server.properties文件中配置的log.dirs

cd /tmp/kafka-logs

可以查看到如下內容:

first-0為我們的Partition分區文件,first為我們添加的主題,0為分區,每一個分區被分配為一個文件,存儲生產者發送的消息

2、分區原則

發布到Kafka集群的消息體分為三部分:key(鍵值)、partition(分區號)、value(數據值)

(1)如果指定partition,則直接使用該分區,key會被忽略

(2)未指定partition但指定key,通過key的值進行hash選一個分區

(3)如果不指定key和partition,kafka會采用默認的平均輪詢將數據平均分配到每一個分區上。

3、發送消息過程

  (1)Producer從Zookeeper獲取Kafka集群各節點狀態,找出Leader節點

  (2)發送消息給Leader節點,持久化消息到log文件中

  (3)Follower主動拉取Leader的數據 ,實現數據同步

  (4)Follower發送ack確認響應    注:在所有follower同步數據完成之前,這些數據對Consumer是不可見的、不能消費的

三、消費流程

消息消費的模式有兩種:推送模式(push)和  拉取模式(pull)

  • 推送模式:kafka集群主動推送數據到Consumer,推送模式不保證消息推送成功,它不管Consumer的資源使用情況,可能會由於Cousumer正處理其它事情,導致數據丟失
  • 拉取模式:由Cousumer主動拉取,可以控制最高水位,消息消費完成后處於等待狀態,推薦使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM