【拆分版】Docker-compose構建Zookeeper叢集管理Kafka叢集
寫在前邊
在搭建Logstash多節點之前,想到就算先搭好Logstash啟動會因為日誌無法連線到Kafka Brokers而無限重試,所以這裡先構建下Zookeeper叢集管理的Kafka叢集。
眾所周知,Zookeeper是一個高效的分散式協調中介軟體,可以提供配置資訊管理、命名、分散式同步(分散式鎖)、叢集管理、資料庫切換等服務。這裡主要用它的叢集管理功能,它可以確保在網路狀態不一致,選出一致的Master節點。它是Apache下的一個Java專案,隸屬於Hadroop系統,正如其名"動物管理員",作為管理員的角色存在。
有興趣瞭解zookeeper的原理,可以學習Paxos協議與Zab協議。
ps: Hadroop系統下基本上所有的軟體都是動物命名的
在這裡,我們將使用Zookeeper來管理Kafka叢集,Kafka是一種訊息佇列(Message Queue)中介軟體,具有高併發、高吞吐量、容錯性強、可擴充套件等優點。在ELK日誌系統中使用Kafka作為資料的緩衝層,提高了系統的效能與穩定性。
正好今天通過翻看兩者官方的文件與其Docker映象的文件,終於搭建成功,遂記之分享諸君。鑑於水平有限,如有寫得不對的地方,歡迎大家指正。
本文搭建架構圖
說明:
Zookeeper搭建成集群后,提供命名服務與叢集協調服務,Kafka的節點Broker通過domain與ip進行註冊到Zookeeper叢集中,通過Zookeeper的協調能力,選出唯一的Leader節點,叢集服務啟動並對外提供服務。
環境準備
- GNU/Debian Stretch 9.9 linux-4.19
- Docker 18.09.6
- Docker-Compose 1.17.1
目錄結構
├── docker-kafka-cluster │ ├── docker-kafka-cluster-down.sh │ ├── docker-kafka-cluster-up.sh │ ├── kafka-01 │ │ ├── docker-compose.yml │ │ └── .env │ ├── kafka-02 │ │ ├── docker-compose.yml │ │ └── .env │ ├── kafka-03 │ │ ├── docker-compose.yml │ │ └── .env │ └── kafka-manager │ ├── docker-compose.yml │ └── .env └── docker-zookeeper-cluster ├── docker-zk-cluster-down.sh ├── docker-zk-cluster-up.sh ├── zk-01 │ ├── docker-compose.yml │ └── .env ├── zk-02 │ ├── docker-compose.yml │ └── .env └── zk-03 ├── docker-compose.yml └── .env
docker-zookeeper-cluster原始碼參見我的Git倉庫 https://github.com/hellxz/docker-zookeeper-cluster.git
docker-kafka-cluster原始碼參見我的Git倉庫 https://github.com/hellxz/docker-kafka-cluster.git
各節點容器說明列表
Zookeeper叢集
節點目錄名 | 容器名 | client port | follower port | election port |
---|---|---|---|---|
zk-01 | zk-01 | 2181 | 2888 | 3888 |
zk-02 | zk-02 | 2182 | 2889 | 3889 |
zk-03 | zk-03 | 2183 | 2890 | 3890 |
Kafka叢集
節點目錄名 | 容器名 | 佔用埠 |
---|---|---|
kafka-01 | kafka-1 | 9092 |
kafka-02 | kafka-2 | 9093 |
kafka-03 | kafka-3 | 9094 |
kafka-manager | kafka-manager | 19000 |
各檔案內容說明
Zookeeper部分
docker-zookeeper-cluster/zk-01
目錄下的.env
.env
配置檔案為docker-compose.yml
提供了多個zookeeper的發現服務節點列表
配置格式為 server.x=x節點主機ip:隨從埠:選舉埠;客戶埠
其中x
為ZOO.MY.ID
的數值,客戶埠前是;
# set args to docker-compose.yml by default
# set zookeeper servers, pattern is `server.x=ip:follower-port:election-port;client:port`,
# such as "server.1=192.168.1.1:2888:3888;2181 server.2=192.168.1.2:2888:3888;2181",
# `x` is the `ZOO.MY.ID` in docker-compose.yml, multiple server separator by white space.
# now you can overide the ip for server.1 server.2 server.3, here demonstrate in one machine so ip same.
ZOO_SERVERS=server.1=10.2.114.110:2888:3888;2181 server.2=10.2.114.111:2889:3889;2182 server.3=10.2.114.112:2890:3890;2183
docker-zookeeper-cluster/zk-01
目錄下的docker-compose.yml
version: '3'
services:
zk-01:
image: zookeeper:3.5.5
restart: always
container_name: zk-01
ports:
- 2181:2181 # client port
- 2888:2888 # follower port
- 3888:3888 # election port
environment:
ZOO_MY_ID: 1 # this zookeeper's id, and others zookeeper node distinguishing
ZOO_SERVERS: ${ZOO_SERVERS} # zookeeper services list
network_mode: "host"
Kafka部分
以kafka-01
目錄下的.env
為例
.env
配置檔案為docker-compose.yml
提供了多個zookeeper的ip:client-port
列表
# default env for kafka docker-compose.yml
# set zookeeper cluster, pattern is "zk1-host:port,zk2-host:port,zk3-host:port", use a comma as multiple servers separator.
ZOO_SERVERS=10.2.114.110:2181,10.2.114.111:2182,10.2.114.112:2183
以kafka-01
目錄下的docker-compose.yml
,為docker-compse的配置檔案
version: "3"
services:
kafka-1:
image: wurstmeister/kafka:2.12-2.1.1
restart: always
container_name: kafka-1
environment:
- KAFKA_BROKER_ID=1 #kafka的broker.id,區分不同broker
- KAFKA_LISTENERS=PLAINTEXT://kafka1:9092 #繫結監聽9092埠
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka1:9092 #繫結釋出訂閱的埠
- KAFKA_ZOOKEEPER_CONNECT=${ZOO_SERVERS} #連線zookeeper的服務地址
- KAFKA_MESSAGE_MAX_BYTES=2000000 #單條訊息最大位元組數
#- KAFKA_CREATE_TOPICS=Topic1:1:3,Topic2:1:1:compact #建立broker時建立的topic:partition-num:replica-num[:clean.policy]
network_mode: "host"
KAFKA_CREATE_TOPICS
使用官方說明:Topic 1
will have 1 partition and 3 replicas,Topic 2
will have 1 partition, 1 replica and acleanup.policy
set tocompact
. 文件地址:https://hub.docker.com/r/wurstmeister/kafka
Zookeeper叢集使用
- 請確保所佈署的 1~3 臺伺服器網路可以ping通
- 確保第一臺主機的2181\2888\3888埠未佔用,第二臺主機的2182\2889\3889埠未佔用,第三臺主機的2183\2890\3890埠未佔用
- 複製zk-01到第一臺主機、複製zk-02到第二臺主機、複製zk-03到第三臺主機
- 修改zk-01\zk-02\zk-03目錄下的.env中的
ZOO_SERVERS
的值,按上述配置要求修改。修改完後的配置應該是叢集內通用的,可以scp複製過去。 - 單臺主機請為
docker-zk-cluster-up.sh
與docker-zk-cluster-down.sh
授執行權,使用它們進行up和down操作;多臺主機請手動分別進入zk-0x目錄,執行docker-compose up -d
以啟動,執行docker-compose down
以關閉。
Kafka叢集使用
使用前確保各主機可以互相ping通
確保zookeeper的服務列表與各對應的zookeeper的ip與客戶埠相同,如不同注意修改
.env
,叢集中.env
檔案相同,可scp複製確保zookeeper叢集啟動
複製kafka-01到第一臺主機、複製kafka-02到第二臺主機、複製kafka-03到第三臺主機
確保這幾臺主機對應的佔用埠號不被佔用
kafka-01對應9092
、kafka-02對應9093
、kafka-03對應9094
、kafka-manager對應19000
分別對每一臺kafka-0x所在的主機修改
/etc/hosts
,例10.2.114.110 kafka1 10.2.114.111 kafka2 10.2.114.112 kafka3
其中每個主機只需要設定自己的主機上的host,比如我複製了
kafka-01
我就寫本機ip kafka1
,依次類推.單臺主機部署kafka叢集請為
docker-kafka-cluster-up.sh
與docker-kafka-cluster-down.sh
授執行權,不要移動目錄,通過這兩個shell指令碼來啟動專案;多臺主機請手動進入kafka-0x
目錄下,執行docker-compose up -d
以後臺啟動,執行docker-compose down
以移除容器啟動指令碼中沒有啟動
kafka-manager
,有需要請自行啟動。為了匹配kafka的版本,使用時設定2.1.1即可。
文中配置部分的ip因使用同一臺主機做的測試,所以ip相同,為了防止誤解,在文中已經修改了ip,具體詳見:
docker-zookeeper-cluster原始碼 https://github.com/hellxz/docker-zookeeper-cluster.git
docker-kafka-cluster原始碼 https://github.com/hellxz/docker-kafka-cluster.git
本文系原創文章,謝絕轉