<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          帥呆了!Kafka移除了Zookeeper!

          共 3479字,需瀏覽 7分鐘

           ·

          2021-05-10 11:46

          普天同慶!最新版的Kafka 2.8.0,移除了對Zookeeper的依賴,通過KRaft進(jìn)行自己的集群管理。很好很好,終于有點(diǎn)質(zhì)的改變了。

          一聽到KRaft,我們就想到了Raft協(xié)議。Raft協(xié)議是當(dāng)今最流行的分布式協(xié)調(diào)算法,Etcd、Consul等系統(tǒng)的基礎(chǔ),就來自于此。現(xiàn)在Kafka也有了。

          由于這個(gè)功能太新了,所以2.8.0版本默認(rèn)還是要用ZooKeeper的,但并不妨礙我們嘗嘗鮮。另外,不要太激動(dòng)了,據(jù)官方聲稱有些功能還不是太完善,所以不要把它用在線上。

          1. 如何開始KRaft?

          Kafka使用內(nèi)嵌的KRaft替代了ZooKeeper,是一個(gè)非常大的進(jìn)步,因?yàn)橄馝S之類的分布式系統(tǒng),這種集群meta信息的同步,都是自循環(huán)的。

          但如何使用KRaft啟動(dòng)呢?很多同學(xué)直接暈菜了,這方面的資料也比較少,但使用起來非常簡單。

          我們注意到,在config目錄下,多了一個(gè)叫做kraft的目錄,里面包含著一套新的配置文件,可以直接摒棄對ZK的依賴。


          通過下面三行命令,即可開啟一個(gè)單機(jī)的broker,從始至終沒有ZK的參與。

          # ./bin/kafka-storage.sh random-uuid
          # ./bin/kafka-storage.sh format -t TBYU7WMiREexuZqrjKG60g -c ./config/kraft/server.properties
          # ./bin/kafka-server-start.sh ./config/kraft/server.properties

          經(jīng)過一陣噼里啪啦的運(yùn)行,No ZK的Kafka已經(jīng)啟動(dòng)起來了。


          就是這么簡單。

          2. 如何配置的?

          kafka又加了一個(gè)內(nèi)部主題,叫做@metadata,用來存這些元信息。

          接下來我們就要看一些關(guān)鍵的配置信息。你可以使用vimdiff config/server.properties config/kraft/server.properties看一下這些主要的區(qū)別。

          首先,kraft多了一個(gè)叫做process.roles的配置。在我們的配置文件里它是這樣的。

          process.roles=broker,controller

          它其實(shí)有三個(gè)取值。

          • broker: 這臺機(jī)器將僅僅當(dāng)作一個(gè)broker
          • controller:  作為 Raft quorum的控制器之一進(jìn)行啟動(dòng)
          • broker,controller: 包含兩者的功能

          熟悉ES的同學(xué)可以看出,這些劃分就像是es的master和node,所以分布式的概念其實(shí)在一定程度上是相通的。

          接下來是監(jiān)聽地址的變化,因?yàn)槲覀兊膕erver有了兩個(gè)功能,所以也就需要開啟兩個(gè)端口。

          listeners=PLAINTEXT://:9092,CONTROLLER://:9093

          另外,還有一個(gè)叫做node.id的東西。不同于原來的broker.id,這個(gè)nodeid是用來投票用的。

          node.id=1

          因?yàn)閞aft協(xié)議的特性,我們的投票配置就要使用上面的node.id。寫起來比較怪異是不是?但總比Zk的好看多了。所以這些配置在后面的版本是有可能改動(dòng)的。

          controller.quorum.voters=1@localhost:9093

          這就是配置文件的主要區(qū)別。我們來看看它的集合。

          process.roles=broker,controller 
          listeners=PLAINTEXT://:9092,CONTROLLER://:9093
          node.id=1
          controller.quorum.voters=1@localhost:9093

          3. 為什么要干掉ZK?

          Kafka作為一個(gè)消息隊(duì)列,竟然要依賴一個(gè)重量級的協(xié)調(diào)系統(tǒng)ZooKeeper,不得不說是一個(gè)笑話。同樣作為消息隊(duì)列,人家RabbitMQ早早的就實(shí)現(xiàn)了自我管理。

          Zookeeper非常笨重,還要求奇數(shù)個(gè)節(jié)點(diǎn)的集群配置,擴(kuò)容和縮容也不方便。Zk的配置方式,也和kafka的完全不一樣,要按照調(diào)優(yōu)Kafka,竟然還要兼顧另外一個(gè)系統(tǒng),這真是日了狗了。

          Kafka要想往輕量級,開箱即用的方向發(fā)展,就不得不干掉Zk。

          另外,由于Zk和Kafka畢竟不是在一個(gè)存儲體系里面,當(dāng)Topic和Partition的數(shù)量上了規(guī)模,數(shù)據(jù)同步問題就變的顯著起來。Zk是可靠,但是它慢啊,完全不如放在Kafka的日志存儲體系里面,這對標(biāo)榜速度的Kafka來說,是不得不繞過的一環(huán)。

          使用過Kafka-admin的同學(xué),應(yīng)該都對緩慢的監(jiān)控?cái)?shù)據(jù)同步歷歷在目。它需要先從zk上轉(zhuǎn)一圈,獲取一些元數(shù)據(jù)信息,然后再從Kafka的JMX接口中拉取數(shù)據(jù)。這么一轉(zhuǎn)悠,就幾乎讓大型集群死翹翹。

          4. 會(huì)有哪些改變?

          部署更簡單

          首先,部署變的更加簡單。對于一些不太追求高可用的系統(tǒng),甚至一個(gè)進(jìn)程就能把可愛的kafka跑起來。我們也不需要再申請對zookeeper友好的SSD磁盤,也不用再關(guān)注zk的容量是不是夠用了。

          監(jiān)控更便捷。

          其次,由于信息的集中,從Kafka獲取監(jiān)控信息,就變得輕而易舉,不用再到zk里轉(zhuǎn)一圈了。與grafana/kibana/promethus等系統(tǒng)的集成,指日可待。

          速度更快捷。

          最重要的當(dāng)然是速度了。Raft比ZK的ZAB協(xié)議更加易懂,也更加高效,partition的主選舉將變得更快捷,controller的調(diào)度速度將上一個(gè)檔次。

          以后,再也不會(huì)有這樣的連接方式。

          zookeeper.connect=zookeeper:2181	

          取而代之的,只會(huì)剩下bootstrap的連接方式。Kafka的節(jié)點(diǎn),越來越像對等節(jié)點(diǎn)。

          bootstrap.servers=broker:9092

          kafka還提供了一個(gè)叫做kafka-metadata-shell.sh的工具,能夠看到topic和partion的分布,這些信息原來是可以通過zk獲取的,現(xiàn)在可以使用這個(gè)命令行獲取。

          $ ./bin/kafka-metadata-shell.sh  --snapshot /tmp/kraft-combined-logs/\@metadata-0/00000000000000000000.log
          >> ls /
          brokers  local  metadataQuorum  topicIds  topics
          >> ls /topics
          foo
          >> cat /topics/foo/0/data
          {
            "partitionId" : 0,
            "topicId" : "5zoAlv-xEh9xRANKXt1Lbg",
            "replicas" : [ 1 ],
            "isr" : [ 1 ],
            "removingReplicas" : null,
            "addingReplicas" : null,
            "leader" : 1,
            "leaderEpoch" : 0,
            "partitionEpoch" : 0
          }
          >> exit

          最后,還是要提醒一下,目前不要在線上環(huán)境開啟這個(gè)功能,還是老老實(shí)實(shí)用ZK吧。功能就是原因,因?yàn)檫@些功能的配套設(shè)施還沒有到位,代碼也沒有達(dá)到讓人放心的程度。你要是用了,很可能會(huì)因?yàn)楣ぞ卟蝗蛘唠y纏的bug痛不欲生。

          不過,這勇敢的第一步已經(jīng)賣出,方向也已經(jīng)指明,我們剩下的就是等待了。無論如何,干掉Zk,是件大好事。

          瀏覽 74
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  苍井空一区二区三区四区 | 夜夜干天天撸 | 男人天堂网www | 豆花视频成人网站 | 俺来也俺就去www色情网 |