在Docker環(huán)境搭建Kafka server
使用的鏡像:wurstmeister/zookeeper涯捻、wurstmeister/kafka
準備工作
- 安裝docker-compose
- 在任意路徑(本例中為/data/docker/kafka-server)下創(chuàng)建docker-compose.yml
樣例:docker-compose.yml
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.100.129
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
nginx:
image: nginx
ports:
- "9094:9094"
links:
- kafka
volumes:
- /data/docker/kafka-server/nginx.conf:/etc/nginx/nginx.conf
注意nginx的數(shù)據(jù)卷配置,指向下一步的nginx配置文件
在相同路徑下放置一個nginx配置文件薇缅,并在其中加入以下配置:
stream {
upstream kafka {
server kafkaserver_kafka_1:9092;
server kafkaserver_kafka_2:9092;
server kafkaserver_kafka_3:9092;
}
server {
listen 9094;
proxy_pass kafka;
}
}
其中upstream的內容根據(jù)實際要創(chuàng)建的集群數(shù)量和名稱來定赖钞,并非不變的眯分,目前也沒有什么辦法可以繞過這個配置
創(chuàng)建和啟動容器
進入docker-compose.yml所在路徑企垦,執(zhí)行:
nohup docker-compose up --scale kafka=3 &
這里scale表示集群中實例的數(shù)量,若不使用此參數(shù)則為單實例,本例中設置為kafka=3表示集群包含3個kafka實例
執(zhí)行成功后即可使用docker ps看到自動創(chuàng)建了nginx即硼、zookeeper和kafka容器,確認運行狀態(tài)是否正常屡拨。
本例中可以看到創(chuàng)建了3個kafka實例只酥,對外映射端口號分別為9032、9033呀狼、9034裂允,訪問其中任意一個端口都是對集群的訪問,沒有差別哥艇。但每次重啟容器绝编,這幾個端口都會變化,因此不推薦使用貌踏。
同時因為使用了nginx十饥,并配置了對三個kafka實例的反向代理,對外映射了唯一一個固定端口9094祖乳,因此實際使用推薦使用這個9094端口逗堵,即使容器重啟或重建,這個端口也不會變化凡资。便于應用訪問砸捏。
普通的docker 搭建
docker run -it -d --restart=always -p 2181:2181 -p 2888:2888 -p 3888:3888 --name=zookeeper \
-v /home/zookeeper/logs:/logs \
-v /home/zookeeper/conf:/conf \
-v /home/zookeeper/data:/data \
-v /etc/localtime:/etc/localtime \
-v /etc/timezone:/etc/timezone \
-d zookeeper:latest
docker run -it -d --restart=always -p 9092:9092 --name kafka \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.84.128:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.84.128:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-v /home/kafka/config:/opt/kafka_2.12-2.1.1/config \
-v /home/kafka/logs:/opt/kafka_2.12-2.1.1/logs \
-v /etc/localtime:/etc/localtime \
-v /etc/timezone:/etc/timezone \
-d wurstmeister/kafka:latest
因為使用了掛載谬运,所以需要把映射對應的路徑中的配置文件先從docker容器中copy出來
然后再進行掛載,否則直接執(zhí)行垦藏,docker是無法啟動成功的
日常維護
關閉集群可以使用docker-compose stop梆暖,也可以使用docker原生命令挨個關閉容器。
啟動集群仍然使用docker-compose up掂骏,也可以使用docker原生命令挨個啟動容器轰驳。需要注意由于kafka依賴zookeeper才能運行,所以要先啟動zookeeper
docker-compose其他的命令也可以使用弟灼,只要配置文件正確级解,就可以保證整個服務正常運行
注意事項
本例中配置了3個kafka實例組成的集群,理論上來說田绑,其中任意一個節(jié)點宕機應不影響整個集群的運行勤哗。
然而實際上,由于使用了nginx的固定配置做負載均衡掩驱,再加上kafka的客戶端的連接管理實現(xiàn)方式問題芒划,導致任意一個節(jié)點宕機都可能使“部分”生產(chǎn)者或消費者無法連接,具體哪些不好用是隨機的欧穴。
因此當前的集群搭建方案仍不是最終方案民逼,將繼續(xù)學習文檔,可能利用docker-swarm實現(xiàn)更合理的集群涮帘。