【拆分版】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:隨從端口:選舉端口;客戶端口 其中xZOO.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 a cleanup.policy set to compact. 文檔地址:https://hub.docker.com/r/wurstmeister/kafka

Zookeeper集群使用

  1. 請確保所布署的 1~3 台服務器網絡可以ping通
  2. 確保第一台主機的2181\2888\3888端口未佔用,第二台主機的2182\2889\3889端口未佔用,第三台主機的2183\2890\3890端口未佔用
  3. 複製zk-01到第一台主機、複製zk-02到第二台主機、複製zk-03到第三台主機
  4. 修改zk-01\zk-02\zk-03目錄下的.env中的ZOO_SERVERS的值,按上述配置要求修改。修改完后的配置應該是集群內通用的,可以scp複製過去。
  5. 單台主機請為docker-zk-cluster-up.shdocker-zk-cluster-down.sh授執行權,使用它們進行up和down操作;多台主機請手動分別進入zk-0x目錄,執行docker-compose up -d以啟動,執行docker-compose down以關閉。

Kafka集群使用

  1. 使用前確保各主機可以互相ping通

  2. 確保zookeeper的服務列表與各對應的zookeeper的ip與客戶端口相同,如不同注意修改.env,集群中.env文件相同,可scp複製

  3. 確保zookeeper集群啟動

  4. 複製kafka-01到第一台主機、複製kafka-02到第二台主機、複製kafka-03到第三台主機

  5. 確保這幾台主機對應的佔用端口號不被佔用 kafka-01對應9092kafka-02對應9093kafka-03對應9094kafka-manager對應19000

  6. 分別對每一台kafka-0x所在的主機修改/etc/hosts,例

    10.2.114.110 kafka1
    10.2.114.111 kafka2
    10.2.114.112 kafka3

    其中每個主機只需要設置自己的主機上的host,比如我複製了kafka-01我就寫本機ip kafka1 ,依次類推.

  7. 單台主機部署kafka集群請為docker-kafka-cluster-up.shdocker-kafka-cluster-down.sh授執行權,不要移動目錄,通過這兩個shell腳本來啟動項目;多台主機請手動進入kafka-0x目錄下,執行docker-compose up -d以後台啟動,執行docker-compose down以移除容器

  8. 啟動腳本中沒有啟動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

本文系原創文章,謝絕轉載

【精選推薦文章】

自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

您可能也會喜歡…