6、Zookeeper在kafka中的應用
1、Broker註冊
Broker是分散式部署並且相互之間相互獨立,但是需要有一個註冊系統能夠將整個叢集中的Broker管理起來,此時就使用到了Zookeeper。在Zookeeper上會有一個專門用來進行Broker伺服器列表記錄的節點:
/brokers/ids
每個Broker在啟動時,都會到Zookeeper上進行註冊,即到/brokers/ids下建立屬於自己的節點,如/brokers/ids/[0...N]。
Kafka使用了全域性唯一的數字來指代每個Broker伺服器,不同的Broker必須使用不同的Broker ID進行註冊,建立完節點後,每個Broker就會將自己的IP地址和埠資訊記錄到該節點中去。其中,Broker建立的節點型別是臨時節點,一旦Broker當機,則對應的臨時節點也會被自動刪除。
2、Topic註冊
在Kafka中,同一個Topic的訊息會被分成多個分割槽並將其分佈在多個Broker上,這些分割槽資訊及與Broker的對應關係也都是由Zookeeper在維護,由專門的節點來記錄,如:
/borkers/topics
Kafka中每個Topic都會以/brokers/topics/[topic]的形式被記錄,如/brokers/topics/login和/brokers/topics/search等。Broker伺服器啟動後,會到對應Topic節點(/brokers/topics)上註冊自己的Broker ID並寫入針對該Topic的分割槽總數,如/brokers/topics/login/3->2,這個節點表示Broker ID為3的一個Broker伺服器,對於"login"這個Topic的訊息,提供了2個分割槽進行訊息儲存,同樣,這個分割槽節點也是臨時節點。
3、生產者負載均衡
由於同一個Topic訊息會被分割槽並將其分佈在多個Broker上,因此,生產者需要將訊息合理地傳送到這些分散式的Broker上,那麼如何實現生產者的負載均衡,Kafka支援傳統的四層負載均衡,也支援Zookeeper方式實現負載均衡。
(1) 四層負載均衡,根據生產者的IP地址和埠來為其確定一個相關聯的Broker。通常,一個生產者只會對應單個Broker,然後該生產者產生的訊息都發往該Broker。這種方式邏輯簡單,每個生產者不需要同其他系統建立額外的TCP連線,只需要和Broker維護單個TCP連線即可。但是,其無法做到真正的負載均衡,因為實際系統中的每個生產者產生的訊息量及每個Broker的訊息儲存量都是不一樣的,如果有些生產者產生的訊息遠多於其他生產者的話,那麼會導致不同的Broker接收到的訊息總數差異巨大,同時,生產者也無法實時感知到Broker的新增和刪除。
(2) 使用Zookeeper進行負載均衡,由於每個Broker啟動時,都會完成Broker註冊過程,生產者會通過該節點的變化來動態地感知到Broker伺服器列表的變更,這樣就可以實現動態的負載均衡機制。
4、消費者負載均衡
與生產者類似,Kafka中的消費者同樣需要進行負載均衡來實現多個消費者合理地從對應的Broker伺服器上接收訊息,每個消費者分組包含若干消費者,每條訊息都只會傳送給分組中的一個消費者,不同的消費者分組消費自己特定的Topic下面的訊息,互不干擾。
5、消費分割槽與消費者的關係
對於每個消費者分組,Kafka都會為其分配一個全域性唯一的Group ID,同一個消費者分組內部的所有消費者共享該ID。同時,Kafka為每個消費者分配一個Consumer ID,通常採用"Hostname:UUID"形式表示。在Kafka中,規定了每個訊息分割槽有且只能同時有一個消費者進行消費,因此,需要在Zookeeper上記錄訊息分割槽與消費者之間的關係,每個消費者一旦確定了對一個訊息分割槽的消費權力,需要將其Consumer ID 寫入到對應訊息分割槽的臨時節點上,例如:
/consumers/[group_id]/owners/[topic]/[broker_id-partition_id]
其中,[broker_id-partition_id]就是一個訊息分割槽的標識,節點內容就是該消費分割槽上訊息消費者的Consumer ID。
6、訊息消費進度Offset記錄
在消費者對指定訊息分割槽進行訊息消費的過程中,需要定時地將分割槽訊息的消費進度Offset記錄到Zookeeper上,以便在該消費者進行重啟或者其他消費者重新接管該訊息分割槽的訊息消費後,能夠從之前的進度開始繼續進行訊息消費。Offset在Zookeeper中由一個專門節點進行記錄,其節點路徑為:
/consumers/[group_id]/offsets/[topic]/[broker_id-partition_id]
節點內容就是Offset的值。
7、消費者註冊
消費者伺服器在初始化啟動時加入消費者分組的步驟如下
- 註冊到消費者分組。每個消費者伺服器啟動時,都會到Zookeeper的指定節點下建立一個屬於自己的消費者節點,例如/consumers/[group_id]/ids/[consumer_id],完成節點建立後,消費者就會將自己訂閱的Topic資訊寫入該臨時節點。
- 對消費者分組中的消費者的變化註冊監聽。每個消費者都需要關注所屬消費者分組中其他消費者伺服器的變化情況,即對/consumers/[group_id]/ids節點註冊子節點變化的Watcher監聽,一旦發現消費者新增或減少,就觸發消費者的負載均衡。
- 對Broker伺服器變化註冊監聽。消費者需要對/broker/ids/[0-N]中的節點進行監聽,如果發現Broker伺服器列表發生變化,那麼就根據具體情況來決定是否需要進行消費者負載均衡。
- 進行消費者負載均衡。為了讓同一個Topic下不同分割槽的訊息儘量均衡地被多個消費者消費而進行消費者與訊息分割槽分配的過程,通常,對於一個消費者分組,如果組內的消費者伺服器發生變更或Broker伺服器發生變更,會發出消費者負載均衡。
以下是kafka在zookeep中的詳細儲存結構圖:
相關文章
- alpakka-kafka(9)-kafka在分散式運算中的應用Kafka分散式
- Apache Kafka在大型應用中的20項最佳實踐ApacheKafka
- Kafka——zookeeper的作用Kafka
- Apache Kafka在沃爾瑪的應用ApacheKafka
- alpakka-kafka(6)-kafka應用案例,使用者介面Kafka
- zookeeper、dubbo、kafkaKafka
- 扔掉Zookeeper!在K8S中執行KRaft模式Kafka叢集K8SRaft模式Kafka
- 後疫情時代 Wi-Fi 6在高校中的應用
- Zookeeper應用場景
- ZooKeeper概念與應用
- kafka和zookeeper安裝Kafka
- 滴滴雲部署 ZooKeeper + KafkaKafka
- 探索OnRobot夾爪|RG6在CNC機床中的應用
- MQTT 在 Elixir 中的應用MQQT
- redis在nodejs中的應用RedisNodeJS
- redis在python中的應用RedisPython
- Refs 在React中的應用React
- HMM在NLP中的應用HMM
- 機器學習將在遊戲開發中的6種應用機器學習遊戲開發
- Zookeeper叢集 + Kafka叢集Kafka
- BurpSuite在非Web應用測試中的應用UIWeb
- 基於 Kafka 的實時數倉在搜尋的實踐應用Kafka
- Service Worker 在 PWA 中的應用
- ext 庫在 OI 中的應用
- 剖析 SPI 在 Spring 中的應用Spring
- Linux在實際中的應用Linux
- 堆在java中的應用--PriorityQueueJava
- 探究 lua 在 Android 中的應用Android
- 【分散式】Zookeeper應用場景分散式
- zookeeper使用(四)--應用場景
- Kafka社群KIP-500中文譯文(去除ZooKeeper)Kafka
- Kafka 入門(三)--為什麼 Kafka 依賴 ZooKeeper?Kafka
- Mac 使用 docker 搭建 kafka 叢集 + Zookeeper + kafka-managerMacDockerKafka
- 安裝Zookeeper和Kafka叢集Kafka
- 「Kafka應用」副本同步策略Kafka
- 「Kafka應用」消費者Kafka
- JDBC 在效能測試中的應用JDBC
- 策略模式在應用中的實踐模式
- 隱藏域在Ajax中的應用