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主動拉取,可以控制最高水位,消息消費完成后處於等待狀態,推薦使用。