寫在前邊
在搭建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
本文系原創文章,謝絕轉載