Kafka將元數(shù)據(jù)信息保存在Zookeeper中抵恋,但是發(fā)送給Topic本身的數(shù)據(jù)是不會發(fā)到Zk上的,否則Zk就瘋了宝磨。kafka使用zookeeper來實現(xiàn)動態(tài)的集群擴展馋记,不需要更改客戶端(producer和consumer)的配置。broker會在zookeeper注冊并保持相關(guān)的元數(shù)據(jù)(topic懊烤,partition信息等)更新梯醒。而客戶端會在zookeeper上注冊相關(guān)的watcher。一旦zookeeper發(fā)生變化腌紧,客戶端能及時感知并作出相應(yīng)調(diào)整茸习。這樣就保證了添加或去除broker時,各broker間仍能自動實現(xiàn)負載均衡壁肋。這里的客戶端指的是Kafka的消息生產(chǎn)端(Producer)和消息消費端(Consumer)Producer端使用zookeeper用來"發(fā)現(xiàn)"broker列表,以及和Topic下每個partition的leader建立socket連接并發(fā)送消息号胚。也就是說每個Topic的partition是由Lead角色的Broker端使用zookeeper來注冊broker信息,以及監(jiān)測partition leader存活性.Consumer端使用zookeeper用來注冊consumer信息,其中包括consumer消費的partition列表等,同時也用來發(fā)現(xiàn)broker列表,并和partition leader建立socket連接,并獲取消息.
1、Kafka的每個broker啟動時浸遗,都會到zookeeper中進行注冊猫胁,告訴zookeeper其broker.id。
2跛锌、在kafka中弃秆,用戶可以自定義多個topic,每個topic又可以劃分為多個分區(qū),一半情況下菠赚,每個分區(qū)存儲在一個獨立的broker上脑豹。所有這些topic與broker的對應(yīng)關(guān)系都有zookeeper進行維護。
3衡查、每個消費者都要關(guān)注其所屬消費者組中消費者數(shù)目的變化瘩欺,即監(jiān)聽zookeeper中/consumers/{group_id}/ids下子節(jié)點的變化。一單發(fā)現(xiàn)消費者新增或減少拌牲,就會觸發(fā)消費者的rebalance俱饿。