1. 程式人生 > >【拆分版】Docker-compose構建Zookeeper叢集管理Kafka叢集

【拆分版】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

本文系原創文章,謝絕轉