新聞中心
牢記這三種方法!即便沒有Zookeeper也能運(yùn)行Kafka
原創(chuàng)
作者: 崔皓 2022-01-11 08:00:00
云計(jì)算
Kafka 從 Kafka 2.8 開始,在沒有 Zookeeper 的情況下也可以運(yùn)行 Kafka 集群。本文將介紹三種方法,它們可以在使用容器單節(jié)點(diǎn)集群的情況下運(yùn)行Kafka。

???
【51CTO.com原創(chuàng)稿件】從 Kafka 2.8 開始,在沒有 Zookeeper 的情況下也可以運(yùn)行 Kafka 集群。本文將介紹三種方法,它們可以在使用容器單節(jié)點(diǎn)集群的情況下運(yùn)行Kafka。
Apache Zookeeper作為Kafka的依賴項(xiàng)一直用來管理Apache Kafka的元數(shù)據(jù)。值得慶幸的是從Kafka 2.8 版本開始,就可以在沒有 Zookeeper 的情況下運(yùn)行 Kafka 集群了。下面就給大家介紹使用容器單節(jié)點(diǎn)集群的三種簡單方法。
Control plane(控制面)和data plane(數(shù)據(jù)面)
Apache Kafka 為其集群實(shí)現(xiàn)了獨(dú)立的control plane(控制面)和data plane(數(shù)據(jù)面)。Control plane用來管理集群,跟蹤哪些brokers(代理)處于活動狀態(tài),并在set(集合)更改時(shí)采取對應(yīng)的行動。同時(shí),data plane(數(shù)據(jù)面)需要處理producer(生產(chǎn)者)和consumer(消費(fèi)者)及其兩者產(chǎn)生的記錄信息。在之前的Kafka 版本中,Zookeeper 是實(shí)現(xiàn)Control plane功能的主要集群組件。
經(jīng)過幾年的努力,Kafka實(shí)現(xiàn)了Control plane的第一版功能,我們把此次更新稱為KIP-500。其中 Apache Kafka Raft(也稱為 KRaft)是為取代 Zookeeper 而引入的新共識協(xié)議。brokers可以作為仲裁控制器的角色來管理集群Control plane(控制面)。此更改簡化了集群部署、監(jiān)控和管理等功能。新的 KRaft 控制器可以在 Apache Kafka 2.8中體驗(yàn)到。
容器化單節(jié)點(diǎn)
Apache Kafka的強(qiáng)項(xiàng)是消息處理機(jī)制的水平擴(kuò)展和管理高吞吐量的消息,這也是一直推動Kafka發(fā)展的源動力。正因?yàn)槿绱耍枰谏a(chǎn)環(huán)境的Kafka集群中使用多個broker完成上述功能。為了簡單和快速入門今天的知識點(diǎn),這里會從單節(jié)點(diǎn)集群切入給大家介紹Kafaka是如何進(jìn)行進(jìn)群管理的。
本文會使用Strimzi容器來包含所需要的應(yīng)用環(huán)境。Strimzi 是Cloud Native Computing Foundation項(xiàng)目成員,它讓Apache Kafka在Kubernetes 運(yùn)行起來更加從容,同時(shí)還提供了一套成熟的操作集合和容器鏡像。
在本文中,我們將通過Quay Container Registry 發(fā)布和應(yīng)用 Apache Kafka 2.8.1 鏡像。
Docker 或 Podman
首先需要在同一實(shí)例中運(yùn)行具有代理和控制器角色的單個容器。安裝Docker或Podman并執(zhí)行以下命令:
docker run -it --name kafka-zkless -p 9092:9092 -e LOG_DIR=/tmp/logs quay.io/strimzi/kafka:latest-kafka-2.8.1-amd64 /bin/sh -c 'export CLUSTER_ID=$(bin/kafka-storage.sh random-uuid) && bin/kafka-storage.sh format -t $CLUSTER_ID -c config/kraft/server.properties && bin/kafka-server-start.sh config/kraft/server.properties'
上面的命令啟動一個名為“kafka-zkless”的容器并暴露Kafka的端口 9092。我們覆蓋entry point(入口點(diǎn))的信息,這里包括三個方面的工作。
第一、設(shè)置環(huán)境變量,通過UUID設(shè)置集群ID。
第二、通過執(zhí)行`kafka-storage.sh`腳本來格式化存儲目錄。
第三、使用 KRaft 配置啟動 Kafka 服務(wù)器。
同時(shí),可以使用標(biāo)準(zhǔn)的 Kafka 工具(如kcat:以前稱為 kafkacat)連接到broker生成和使用相關(guān)記錄。
Docker Compose
您可以使用Compose 規(guī)范來定義您的組件。如圖 1 所示, docker-compose yaml 文件的示例:
???
圖1
從圖中可以看出通過container_name定義容器名稱,image定義容器鏡像,其中command的部分是要執(zhí)行的命令。由于該命令過長將其分成兩行解釋(實(shí)際上是一行,這里人為加入了回車為的是方便大家閱讀),上面的一行和Docker中的命令一致,包括集群ID定義、格式化存儲目錄以及啟動Kafaka服務(wù)器的部分。下面一行主要是重寫了advertised中的listeners、security.protocol.map 以及l(fā)isteners的信息。接著就是定義ports 端口為9092,在environment中定義了需要在命令行中重寫的三類信息:KAFKA_ADVERTISED_LISTENERS 對應(yīng)advertised中的listeners;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP對應(yīng)security.protocol.map;KAFKA_LISTENERS對應(yīng)listeners的信息。
可以通過如下命令執(zhí)行上述示例:
docker-compose up -d
本例會公開主機(jī)9092端口,如果需要在更廣泛的組合部署中訪問它,可以將其修改為kafka:29092,避免與其他端口沖突。
Kubernetes 部署
如果習(xí)慣使用Kubernetes,您可以如圖2 所示的部署描述:
???
圖2
如圖2 所示,我們關(guān)注containers節(jié)點(diǎn)下面的內(nèi)容,容器的名字為zkless-kafka,通過image定義了容器鏡像,在command中定義容器啟動時(shí)候的命令。
和Docker一樣由于該命令過長將其分成兩行解釋,上面的一行依舊包括集群ID定義、格式化存儲目錄以及啟動Kafaka服務(wù)器的部分。下面一行只定義了advertised的listeners 的信息,這個信息是從env(環(huán)境變量)中的KAFKA_ADVERTISED_LISTENERS 對應(yīng)的value中讀取。
可以通過如下命令執(zhí)行上面的文件:
kubectl apply -f kubernetes.yaml
執(zhí)行之后會對鏡像進(jìn)行部署,將通過使用zkless-kafka-bootstrap主機(jī)名公開引導(dǎo)服務(wù)器。同時(shí)會對部署服務(wù)器所在的當(dāng)前命名空間的訪問限制。此時(shí)就可以和其他advertised listeners(廣播監(jiān)聽者)一樣獲取你想要的消息了。
概括
本文簡要介紹了 Apache Kafka 新Control plane(控制面)的實(shí)現(xiàn)。由于上一個版本的Kafaka完成集群控制的功能,借此可以使用功能強(qiáng)大的 Zookeeperless Kafka 集群。我們回顧了使用容器鏡像部署單節(jié)點(diǎn)集群的三種簡單方法:執(zhí)行簡單的 Docker 或 podman 命令、執(zhí)行 docker-compose 文件以及在 Kubernetes 上部署運(yùn)行中的 pod。
作者簡介
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。曾任惠普技術(shù)專家。樂于分享,撰寫了很多熱門技術(shù)文章,閱讀量超過60萬?!斗植际郊軜?gòu)原理與實(shí)踐》作者。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請注明原文作者和出處為51CTO.com】
網(wǎng)頁標(biāo)題:牢記這三種方法!即便沒有Zookeeper也能運(yùn)行Kafka
標(biāo)題鏈接:http://m.fisionsoft.com.cn/article/cciojpg.html


咨詢
建站咨詢
