Kafka是由Apache軟件基金會(huì)開發(fā)一個(gè)開源流處理平臺(tái),使用Scala和Java編寫, 該項(xiàng)目的目標(biāo)是為處理實(shí)時(shí)數(shù)據(jù)提供一個(gè)統(tǒng)一、高吞吐、低延遲的平臺(tái)。其持久化層本質(zhì)上是一個(gè)按照分布式事務(wù)日志架構(gòu)的大規(guī)模發(fā)布/訂閱消息隊(duì)列。這種工作方式使它為企業(yè)級(jí)基礎(chǔ)設(shè)施來處理流失數(shù)據(jù)非常有價(jià)值。
本文的目的是使用Docker容器來部署Kafka, 這樣可以省略Kafka安裝配置的中間過程, 節(jié)省大量時(shí)間。文章中分別從幾個(gè)維度來闡述Kafka的部署過程, 包括:基礎(chǔ)環(huán)境要求、安裝zookeeper、容器內(nèi)的設(shè)置等, 最后給出了一個(gè)從生產(chǎn)者角度向消費(fèi)者發(fā)送消息, 消費(fèi)者成功接收到消息作為結(jié)尾, 最后給出了一個(gè)在全過程當(dāng)中遇到問題排查的正確方法。
認(rèn)識(shí)Kafka
Kafka存儲(chǔ)的消息來自任務(wù)多被稱為"生產(chǎn)者"(Producer)的進(jìn)程。數(shù)據(jù)從而可以被分配到不同的"分區(qū)"(Partition)、不同的“Topic”下。在一個(gè)分區(qū)內(nèi), 消息被索引并連同時(shí)間戳存儲(chǔ)在一起。而其它被稱為"消費(fèi)者"(Consumer)的進(jìn)程可以從分區(qū)查詢消息。Kafka運(yùn)行在一個(gè)由一臺(tái)或多臺(tái)服務(wù)器組成的集群上, 并且分區(qū)可以跨集群節(jié)點(diǎn)分布。Kafka的架構(gòu)如下圖所示:
以下列出了Kafka技術(shù)相關(guān)的術(shù)語:
- Topic - 用來對(duì)消息進(jìn)行分類, 每個(gè)進(jìn)入到Kafka的信息都會(huì)被放到一個(gè)Topic下。
- Broker - 用來實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的主機(jī)服務(wù)器。
- Partition - 每個(gè)Topic中的消息會(huì)被分為若干個(gè)Partition,以提高消息的處理效率
- Producer - 消息的生產(chǎn)者
- Consumer - 消息的消費(fèi)者
了解了以上概念之后,對(duì)于Kafka的部署已經(jīng)沒有什么障礙, 下面開始正式的部署過程。
基礎(chǔ)環(huán)境準(zhǔn)備
大多數(shù)Linux發(fā)行版都支持安裝Kafka,這里我準(zhǔn)備了一臺(tái)ubuntu 22.04.3 LTS版本的虛擬機(jī)作為試驗(yàn)環(huán)境。
登錄到系統(tǒng)輸入:docker -v 命令, 如果出現(xiàn):
Docker version 24.0.5, build 24.0.5-0ubuntu1~22.04.1
類似于這樣的提示信息,說明Docker已安裝,如果沒有,請(qǐng)輸入以下命令安裝Docker:
$ sudo apt update
$ sudo apt install docker.io
安裝zookeeper
由于Kafka依賴Zookeeper實(shí)現(xiàn)高可用性和一致性,其為Kafka提供了關(guān)鍵的分布式協(xié)調(diào)服務(wù),因此部署Kafka必須先部署Zookeeper集群作為基礎(chǔ), 以下進(jìn)入部署Zookeeper的過程:
在命令行直接輸入以下命令,docker會(huì)自動(dòng)拉取對(duì)應(yīng)鏡像:
# docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper
拉取過程如圖:
安裝Kafka
Zookeeper安裝成功后, 接著安裝Kafka組件, 在命令行直接輸入以下命令,docker會(huì)自動(dòng)拉取對(duì)應(yīng)鏡像:
# docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=[你的IP地址]:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://[你的IP地址]:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka
注意, 我的服務(wù)器IP是192.168.201.206,所以上面的IP要根據(jù)自己的實(shí)際情況進(jìn)行變更,我變更后的命令如下:
# docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.201.206:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.201.206:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka
拉取過程如圖:
進(jìn)入容器
Kafka安裝完畢后,還要進(jìn)入到容器中啟動(dòng)生產(chǎn)者和消費(fèi)者,這樣可以驗(yàn)證kafka功能是否正常,順序執(zhí)行命令如下:
# docker ps -a #查看kafka鏡像的容器ID
# docker exec -it 容器ID /bin/sh #進(jìn)入到容器內(nèi)部
# cd /opt/kafka/bin # 切到容器內(nèi)部kafka執(zhí)行目錄下
執(zhí)行最后的結(jié)果如圖:
啟動(dòng)生產(chǎn)者
在容器里執(zhí)行以下命令啟動(dòng)生產(chǎn)者:
./kafka-console-producer.sh --broker-list localhost:9092 --topic [你的topic名稱]
我這里自己起了一個(gè)topic名稱,名字為test123, 如圖:
產(chǎn)生者腳本啟動(dòng)成功后,會(huì)有一個(gè)">"提示符。
啟動(dòng)消費(fèi)者
為了看到生產(chǎn)者和消費(fèi)者之間的消息傳遞效果,這里需要另開一個(gè)終端,按照上面的方法進(jìn)入容器對(duì)應(yīng)目錄,并執(zhí)行以下命令:
./kafka-console-consumer.sh --bootstrap-server [你的IP地址]:9092 --topic [你的topic名稱]
注意,這里有兩個(gè)變量需要自己調(diào)整,一個(gè)是IP地址,另一個(gè)是上面建立的Topic名稱, 我這里填入信息后的完整命令如下:
./kafka-console-consumer.sh --bootstrap-server 192.168.201.206:9092 --topic test123
執(zhí)行過程如圖:
生產(chǎn)者與消費(fèi)者測(cè)試
切換到生產(chǎn)者窗口,連續(xù)輸入一些信息,如圖:
再切換回消費(fèi)者窗口, 正常的話已經(jīng)可以收到生產(chǎn)者發(fā)送的信息了,如圖:
1故障排查
如果在使用Docker過程中遇到任何錯(cuò)誤, 可以命令:
docker logs 容器ID
通過查看容器日志進(jìn)行故障排查,過程如圖:
總結(jié)
在部署Kafka的整個(gè)過程中, 遵循以下部署順序流程:
- 首先檢查Docker安裝是否正常, 確保Docker安裝無任何異常。
- 其次安裝Kafka的依賴服務(wù)Zookeeper, 只需要一句命令可實(shí)現(xiàn)自動(dòng)鏡像拉取。
- 接著安裝Kafka組件,也是一句命令即可搞定, 自動(dòng)拉取對(duì)應(yīng)的鏡像。
- 進(jìn)入到容器內(nèi)部, 分別啟動(dòng)生產(chǎn)者和消費(fèi)者腳本, 便可以開始進(jìn)行發(fā)送消息測(cè)試了。
- 在整個(gè)部署過程中,遇到任何錯(cuò)誤或問題都可以通過Docker日志進(jìn)行問題排查。