kafka:與zookeeper的聯絡是什麼?
我們先看一張圖,zookeeper的儲存結構圖:
可以看到在zookeeper中儲存的資訊有broker,consumer等重要znode資訊。
可以感知到,每個kafka節點會在zookeeper中註冊該機器的配置資訊。
然後註冊完的kafka節點的topic資訊會存在topics目錄下面。
根據zookeeper目錄列表可以看到,zookeeper儲存了kafka叢集的所有資訊,那麼傳送和接收訊息是怎樣的流程呢?
kafka的傳送與接收
傳送:kafka的傳送程式(程式碼)會指定broker服務地址,那麼訊息的傳送會直接傳送到broker提供的地址中。
如果地址是列表(指定了多個broker地址),那麼則隨機選擇一個可用的傳送。接收到訊息的kafka機器會向zookeeper查詢擁有該topic下partition決定權(leader)的機器,然後由該leader選擇機器儲存資料,最終儲存資料。
接收:
Zookeeper上的細節:
1. 每個broker啟動後會在zookeeper上註冊一個臨時的broker registry,包含broker的ip地址和埠號,所儲存的topics和partitions資訊。
2. 每個consumer啟動後會在zookeeper上註冊一個臨時的consumer registry:包含consumer所屬的consumer group以及訂閱的topics。
3. 每個consumer group關聯一個臨時的owner registry和一個持久的offset registry。
對於被訂閱的每個partition包含一個owner registry,內容為訂閱這個partition的consumer id。
同時包含一個offset registry,內容為上一次訂閱的offset。