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