Kafka為什么要放棄Zookeeper?

最近渠缕,confluent社區(qū)發(fā)表了一篇文章鸽素,主要講述了Kafka未來的2.8版本將要放棄Zookeeper,這對于Kafka用戶來說褐健,是一個重要的改進付鹿。之前部署Kafka就必須得部署Zookeeper澜汤,而之后就只要單獨部署Kafka就行了蚜迅。[1]

1.Kafka簡介

Apache Kafka最早是由Linkedin公司開發(fā),后來捐獻給了Apack基金會俊抵。

Kafka被官方定義為分布式流式處理平臺谁不,因為具備高吞吐、可持久化徽诲、可水平擴展等特性而被廣泛使用刹帕。目前Kafka具體如下功能:

  • 消息隊列,Kafka具有系統(tǒng)解耦、流量削峰谎替、緩沖偷溺、異步通信等消息隊列的功能。
  • 分布式存儲系統(tǒng)钱贯,Kafka可以把消息持久化挫掏,同時用多副本來實現(xiàn)故障轉(zhuǎn)移,可以作為數(shù)據(jù)存儲系統(tǒng)來使用秩命。
  • 實時數(shù)據(jù)處理尉共,Kafka提供了一些和數(shù)據(jù)處理相關(guān)的組件褒傅,比如Kafka StreamsKafka Connect袄友,具備了實時數(shù)據(jù)的處理功能殿托。

下面這張圖是Kafka的消息模型:[2]

通過上面這張圖,介紹一下Kafka中的幾個主要概念:

  • producerconsumer: 消息隊列中的生產(chǎn)者和消費者剧蚣,生產(chǎn)者將消息推送到隊列支竹,消費者從隊列中拉取消息。
  • consumer group:消費者集合鸠按,這些消費者可以并行消費同一個topic下不同partition中的消息唾戚。
  • brokerKafka集群中的服務(wù)器。
  • topic:消息的分類待诅。
  • partitiontopic物理上的分組叹坦,一個topic可以有partition,每個partition中的消息會被分配一個有序的id作為offset卑雁。每個consumer group只能有一個消費者來消費一個partition募书。

2.Kafka和Zookeeper關(guān)系

Kafka架構(gòu)如下圖:

從圖中可以看到,Kafka的工作需要Zookeeper的配合测蹲。那他們到底是怎么配合工作呢莹捡?

看下面這張圖:

2.1 注冊中心

2.1.1 broker注冊

從上面的圖中可以看到,broker分布式部署扣甲,就需要一個注冊中心來進行統(tǒng)一管理篮赢。Zookeeper用一個專門節(jié)點保存Broker服務(wù)列表,也就是 /brokers/ids琉挖。

broker在啟動時启泣,向Zookeeper發(fā)送注冊請求,Zookeeper會在/brokers/ids下創(chuàng)建這個broker節(jié)點示辈,如/brokers/ids/[0...N]寥茫,并保存brokerIP地址和端口。

?

這個節(jié)點臨時節(jié)點矾麻,一旦broker宕機纱耻,這個臨時節(jié)點會被自動刪除。

?

2.1.2 topic注冊

Zookeeper也會為topic分配一個單獨節(jié)點险耀,每個topic都會以/brokers/topics/[topic_name]的形式記錄在Zookeeper弄喘。

一個topic的消息會被保存到多個partition,這些partitionbroker的對應(yīng)關(guān)系也需要保存到Zookeeper甩牺。

partition是多副本保存的蘑志,上圖中紅色partitionleader副本。當(dāng)leader副本所在的broker發(fā)生故障時,partition需要重新選舉leader卖漫,這個需要由Zookeeper主導(dǎo)完成费尽。

broker啟動后,會把自己的Broker ID注冊到到對應(yīng)topic節(jié)點的分區(qū)列表中羊始。

我們查看一個topicxxx旱幼,分區(qū)編號是1的信息,命令如下:

[root@master]?get?/brokers/topics/xxx/partitions/1/state
{"controller_epoch":15,"leader":11,"version":1,"leader_epoch":2,"isr":[11,12,13]}
?

當(dāng)broker退出后突委,Zookeeper會更新其對應(yīng)topic的分區(qū)列表柏卤。

?

2.1.3 consumer注冊

消費者組也會向Zookeeper進行注冊,Zookeeper會為其分配節(jié)點來保存相關(guān)數(shù)據(jù)匀油,節(jié)點路徑為/consumers/{group_id}缘缚,有3個子節(jié)點,如下圖:

這樣Zookeeper可以記錄分區(qū)跟消費者的關(guān)系敌蚜,以及分區(qū)的offset桥滨。[3]

2.2 負(fù)載均衡

brokerZookeeper進行注冊后,生產(chǎn)者根據(jù)broker節(jié)點來感知broker服務(wù)列表變化弛车,這樣可以實現(xiàn)動態(tài)負(fù)載均衡齐媒。

consumer group中的消費者,可以根據(jù)topic節(jié)點信息來拉取特定分區(qū)的消息,實現(xiàn)負(fù)載均衡纷跛。

?

實際上喻括,KafkaZookeeper中保存的元數(shù)據(jù)非常多,看下面這張圖:

隨著broker贫奠、topic和partition增多唬血,保存的數(shù)據(jù)量會越來越大。

?

3.Controller介紹

經(jīng)過上一節(jié)的講述唤崭,我們看到了KafkaZookeeper的依賴非常大拷恨,Kafka離開Zookeeper是沒有辦法獨立運行的。那Kafka是怎么跟Zookeeper進行交互的呢浩姥?

如下圖:[4]

Kafka集群中會有一個broker被選舉為Controller負(fù)責(zé)跟Zookeeper進行交互挑随,它負(fù)責(zé)管理整個Kafka集群中所有分區(qū)和副本的狀態(tài)。其他broker監(jiān)聽Controller節(jié)點的數(shù)據(jù)變化勒叠。

Controller的選舉工作依賴于Zookeeper,選舉成功后膏孟,Zookeeper會創(chuàng)建一個/controller臨時節(jié)點眯分。

Controller具體職責(zé)如下:

  • 監(jiān)聽分區(qū)變化
?

比如當(dāng)某個分區(qū)的leader出現(xiàn)故障時,Controller會為該分區(qū)選舉新的leader柒桑。當(dāng)檢測到分區(qū)的ISR集合發(fā)生變化時弊决,Controller會通知所有broker更新元數(shù)據(jù)。當(dāng)某個topic增加分區(qū)時,Controller會負(fù)責(zé)重新分配分區(qū)飘诗。

?
  • 監(jiān)聽topic相關(guān)的變化
  • 監(jiān)聽broker相關(guān)的變化
  • 集群元數(shù)據(jù)管理

下面這張圖展示了Controller与倡、Zookeeper和broker的交互細節(jié):

Controller選舉成功后,會從Zookeeper集群中拉取一份完整的元數(shù)據(jù)初始化ControllerContext昆稿,這些元數(shù)據(jù)緩存在Controller節(jié)點纺座。當(dāng)集群發(fā)生變化時,比如增加topic分區(qū)溉潭,Controller不僅需要變更本地的緩存數(shù)據(jù)净响,還需要將這些變更信息同步到其他Broker

Controller監(jiān)聽到Zookeeper事件喳瓣、定時任務(wù)事件和其他事件后馋贤,將這些事件按照先后順序暫存到LinkedBlockingQueue中,由事件處理線程按順序處理畏陕,這些處理多數(shù)需要跟Zookeeper交互配乓,Controller則需要更新自己的元數(shù)據(jù)。

4.Zookeeper帶來的問題

Kafka本身就是一個分布式系統(tǒng)惠毁,但是需要另一個分布式系統(tǒng)來管理扰付,復(fù)雜性無疑增加了。

4.1 運維復(fù)雜度

使用了Zookeeper仁讨,部署Kafka的時候必須要部署兩套系統(tǒng)羽莺,Kafka的運維人員必須要具備Zookeeper的運維能力。

4.2 Controller故障處理

Kafaka依賴一個單一Controller節(jié)點跟Zookeeper進行交互洞豁,如果這個Controller節(jié)點發(fā)生了故障盐固,就需要從broker中選擇新的Controller。如下圖,新的Controller變成了broker3丈挟。

新的Controller選舉成功后刁卜,會重新從Zookeeper拉取元數(shù)據(jù)進行初始化,并且需要通知其他所有的broker更新ActiveControllerId曙咽。老的Controller需要關(guān)閉監(jiān)聽蛔趴、事件處理線程和定時任務(wù)。分區(qū)數(shù)非常多時例朱,這個過程非常耗時孝情,而且這個過程中Kafka集群是不能工作的。

4.3 分區(qū)瓶頸

當(dāng)分區(qū)數(shù)增加時洒嗤,Zookeeper保存的元數(shù)據(jù)變多箫荡,Zookeeper集群壓力變大媳友,達到一定級別后骤视,監(jiān)聽延遲增加戈盈,給Kafaka的工作帶來了影響。

所以液肌,Kafka單集群承載的分區(qū)數(shù)量是一個瓶頸啥繁。而這又恰恰是一些業(yè)務(wù)場景需要的唱蒸。

5.升級

升級前后的架構(gòu)圖對比如下:

KIP-500Quorum Controller代替之前的Controller敷矫,Quorum中每個Controller節(jié)點都會保存所有元數(shù)據(jù),通過KRaft協(xié)議保證副本的一致性低矮。這樣即使Quorum Controller節(jié)點出故障了印叁,新的Controller遷移也會非常快商佛。

官方介紹喉钢,升級之后,Kafka可以輕松支持百萬級別的分區(qū)良姆。

?

Kafak團隊把通過Raft協(xié)議同步數(shù)據(jù)的方式Kafka Raft Metadata mode,簡稱KRaft

?

Kafka的用戶體量非常大肠虽,在不停服的情況下升級是必要的。

目前去除ZookeeperKafka代碼KIP-500已經(jīng)提交到trunk分支玛追,并且已經(jīng)在的2.8版本發(fā)布税课。

Kafaka計劃在3.0版本會兼容Zookeeper ControllerQuorum Controller,這樣用戶可以進行灰度測試痊剖。[5]

6.總結(jié)

在大規(guī)模集群和云原生的背景下韩玩,使用ZookeeperKafka的運維和集群性能造成了很大的壓力。去除Zookeeper是必然趨勢陆馁,這也符合大道至簡的架構(gòu)思想找颓。

Reference

[1]

參考1: https://www.confluent.io/blog/kafka-without-zookeeper-a-sneak-peek/

[2]

參考2: https://blog.csdn.net/Zidingyi_367/article/details/110490910

[3]

參考3: http://www.reibang.com/p/a036405f989c

[4]

參考4: https://honeypps.com/mq/kafka-controller-analysis/

[5]

參考5: https://mp.weixin.qq.com/s/ev6NM6hptltQBuTaCHJCQQ

本文使用 文章同步助手 同步

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叮贩,隨后出現(xiàn)的幾起案子击狮,更是在濱河造成了極大的恐慌,老刑警劉巖益老,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彪蓬,死亡現(xiàn)場離奇詭異,居然都是意外死亡捺萌,警方通過查閱死者的電腦和手機档冬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桃纯,“玉大人酷誓,你說我怎么就攤上這事〈炔危” “怎么了呛牲?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驮配。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么壮锻? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任琐旁,我火速辦了婚禮,結(jié)果婚禮上猜绣,老公的妹妹穿的比我還像新娘灰殴。我一直安慰自己,他們只是感情好掰邢,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布牺陶。 她就那樣靜靜地躺著,像睡著了一般辣之。 火紅的嫁衣襯著肌膚如雪掰伸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天怀估,我揣著相機與錄音狮鸭,去河邊找鬼。 笑死多搀,一個胖子當(dāng)著我的面吹牛歧蕉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播康铭,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼惯退,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了从藤?” 一聲冷哼從身側(cè)響起催跪,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呛哟,沒想到半個月后叠荠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡扫责,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年榛鼎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳖孤。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡者娱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苏揣,到底是詐尸還是另有隱情黄鳍,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布平匈,位于F島的核電站框沟,受9級特大地震影響藏古,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忍燥,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一拧晕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梅垄,春花似錦厂捞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至机久,卻和暖如春臭墨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吞加。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工裙犹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衔憨。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓叶圃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親践图。 傳聞我的和親對象是個殘疾皇子掺冠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一、kafka 架構(gòu)和原理 1.1 相關(guān)概念 [圖1] 1.2 zookeeper 節(jié)點 kafka 在 zook...
    yuluxs閱讀 9,063評論 0 8
  • (此文轉(zhuǎn)載自樂字節(jié)) ZooKeeper 的作用 ZooKeeper 是一個開源的分布式協(xié)調(diào)服務(wù)框架,你也可以認(rèn)為...
    代碼小背包閱讀 2,486評論 0 3
  • Kafka Kafka是最初由Linkedin公司開發(fā)揖盘,是一個分布式眉厨、支持分區(qū)的(partition)、多副本的(...
    redleaf閱讀 338評論 0 2
  • 姓名:周小蓬 16019110037 轉(zhuǎn)載自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw閱讀 34,707評論 13 425
  • 0 消息隊列使用場景 消息通訊 異步處理 應(yīng)用解耦 流量削峰 日志處理 1 消息中間件怎么保證消息冪等性/一致性兽狭?...
    allen鍋閱讀 625評論 0 0