前言
本文主要介紹瞭如何通過docker搭建一個可以用於生產環境的kafka集羣。
kafka集羣使用了3個節點,依賴zookeeper進行協調,所以會同時搭建一套3節點的zookeeper集羣。
準備工作
本次實踐準備了三臺CentOS8服務器,ip地址如下:
192.168.1.34
192.168.1.36
192.168.1.73
實踐目標
在每臺機器上安裝一個zookeeper和一個kafka組成整體的集羣。
前提條件
三臺機器上已經安裝了docker和docker-compose。
docker的安裝本文不會介紹,docker-compose的安裝如下:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose --version
說明:不一定非要安裝docker-compose,此處安裝docker-compose是因爲在本文的實踐中使用了docker-compose,你完全可以把yml文件翻譯成docker run命令,來完成整個集羣的搭建工作。
開啓防火牆端口
正常使用kafka集羣需要開放一些端口,如果你的機器沒有開啓防火牆,可以忽略。
開啓端口命令如下:
firewall-cmd --zone=public --add-port=2181/tcp --permanent firewall-cmd --zone=public --add-port=2888/tcp --permanent firewall-cmd --zone=public --add-port=3888/tcp --permanent firewall-cmd --zone=public --add-port=9092/tcp --permanent firewall-cmd --zone=public --add-port=9000/tcp --permanent firewall-cmd --reload firewall-cmd --list-all
搭建zookeeper集羣
進入三臺服務器,創建目錄/home/zk,並創建zk.yml文件
mkdir /home/zk cd /home/zk touch zk.yml
zk.yml是docker-compose的編排文件,三臺服務器的zk.yml文件內容分別如下:
192.168.1.34中的zk.yml
version: '3.1'
services:
zk1:
image: 'zookeeper:3.7'
restart: always
hostname: zoo1
container_name: zk1
network_mode: host
ports:
- 2181:2181
- 2888:2888
- 3888:3888
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=192.168.1.34:2888:3888;2181 server.2=192.168.1.36:2888:3888;2181 server.3=192.168.1.73:2888:3888;2181
192.168.1.36中的zk.yml
version: '3.1'
services:
zk2:
image: 'zookeeper:3.7'
restart: always
hostname: zoo2
container_name: zk2
network_mode: host
ports:
- 2181:2181
- 2888:2888
- 3888:3888
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=192.168.1.34:2888:3888;2181 server.2=192.168.1.36:2888:3888;2181 server.3=192.168.1.73:2888:3888;2181
192.168.1.73中的zk.yml
version: '3.1'
services:
zk3:
image: 'zookeeper:3.7'
restart: always
hostname: zoo3
container_name: zk3
network_mode: host
ports:
- 2181:2181
- 2888:2888
- 3888:3888
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=192.168.1.34:2888:3888;2181 server.2=192.168.1.36:2888:3888;2181 server.3=192.168.1.73:2888:3888;2181
分別在三臺機器的/home/zk目錄下執行以下命令,開啓zk集羣
docker-compose -f zk.yml up -d
進入容器內部查看是否啓動成功:
docker exec -it zk1 bash zkServer.sh status docker exec -it zk2 bash zkServer.sh status docker exec -it zk3 bash zkServer.sh status
如果啓動成功,可以看到如下內容:
至此,一個部署在三臺服務器上的3節點zookeeper集羣就搭建成功了。
搭建kafka集羣
進入三臺服務器,創建目錄/home/kafka,並創建zk.yml文件
mkdir /home/kafka cd /home/kafka touch kafka.yml
kafka.yml是docker-compose的編排文件,三臺服務器的kafka.yml文件內容分別如下:
192.168.1.34中的kafka.yml
version: '2'
services:
k1:
image: 'bitnami/kafka:3.2.0'
restart: always
container_name: k1
network_mode: host
ports:
- 9092:9092
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=192.168.1.34:2181,192.168.1.36:2181,192.168.1.73:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_BROKER_ID=1
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.34:9092
- KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
- KAFKA_CFG_NUM_PARTITIONS=3
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
192.168.1.36中的kafka.yml
version: '2'
services:
k2:
image: 'bitnami/kafka:3.2.0'
restart: always
container_name: k2
network_mode: host
ports:
- 9092:9092
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=192.168.1.34:2181,192.168.1.36:2181,192.168.1.73:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_BROKER_ID=2
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.36:9092
- KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
- KAFKA_CFG_NUM_PARTITIONS=3
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
192.168.1.73中的kafka.yml
version: '2'
services:
k3:
image: 'bitnami/kafka:3.2.0'
restart: always
container_name: k3
network_mode: host
ports:
- 9092:9092
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=192.168.1.34:2181,192.168.1.36:2181,192.168.1.73:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_BROKER_ID=3
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.73:9092
- KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
- KAFKA_CFG_NUM_PARTITIONS=3
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
分別在三臺機器的/home/kafka目錄下執行以下命令,開啓kafka集羣
docker-compose -f kafka.yml up -d
創建topic並驗證消費者和生產者
進入192.168.1.34的kafka容器內部
docker exec -it k1 bash cd /opt/bitnami/kafka/bin ./kafka-topics.sh --create --bootstrap-server 192.168.1.34:9092 --replication-factor 1 --partitions 3 --topic chattest
進入其他機器的kafka容器內部,查看是否存在剛創建的topic,如果存在則說明Kafka集羣搭建成功。
docker exec -it k2 bash kafka-topics.sh --list --bootstrap-server 192.168.1.36:9092 docker exec -it k3 bash kafka-topics.sh --list --bootstrap-server 192.168.1.73:9092
搭建kafka-manager
kafka-manager是一個kafka集羣的可視化監控工具,在一臺機器上安裝即可,我們選擇在192.168.1.36這臺服務器上安裝
進入目錄/home/kafka,並創建manager.yml文件
cd /home/kafka touch manager.yml
manager.yml是docker-compose的編排文件,內容如下:
version: '3.0'
services:
kafka-manager:
image: hlebalbau/kafka-manager
restart: always
container_name: kafka-manager
hostname: kafka-manager
network_mode: host
ports:
- 9000:9000
environment:
ZK_HOSTS: 192.168.1.34:2181,192.168.1.36:2181,192.168.1.73:2181
KAFKA_BROKERS: 192.168.1.34:9092,192.168.1.36:9092,192.168.1.73:9092
APPLICATION_SECRET: letmein
KAFKA_MANAGER_AUTH_ENABLED: "true" # 開啓驗證
KAFKA_MANAGER_USERNAME: "admin" # 用戶名
KAFKA_MANAGER_PASSWORD: "admin" # 密碼
KM_ARGS: -Djava.net.preferIPv4Stack=true
在/home/kafka目錄下執行以下命令,開啓監控工具
docker-compose -f manager.yml up -d
瀏覽器訪問192.168.1.36:9000,輸入用戶名密碼即可進入監控頁面。
按照下圖操作增加對kafka集羣的監控。
大功告成了!