1. 程式人生 > >使用 Docker搭建 ZooKeeper 叢集

使用 Docker搭建 ZooKeeper 叢集

備註,此文來源:

https://segmentfault.com/a/1190000006907443

防止以後找不到,故記錄一下:

映象下載

hub.docker.com 上有不少 ZK 映象, 不過為了穩定起見, 我們就使用官方的 ZK 映象吧.
首先執行如下命令:

docker pull zookeeper

當出現如下結果時, 表示映象已經下載完成了:

>>> docker pull zookeeper
Using default tag: latest
latest: Pulling from library/zookeeper

e110a4a17941: Pull complete
a696cba1f6e8:
Pull complete bc427bd93e95: Pull complete c72391ae24f6: Pull complete 40ab409b6b34: Pull complete d4bb8183b85d: Pull complete 0600755f1470: Pull complete Digest: sha256:12458234bb9f01336df718b7470cabaf5c357052cbcb91f8e80be07635994464 Status: Downloaded newer image for zookeeper:latest

ZK 映象的基本使用

啟動 ZK 映象

>>> docker run
 --name my_zookeeper -d zookeeper:latest

這個命令會在後臺執行一個 zookeeper 容器, 名字是 my_zookeeper, 並且它預設會匯出 2181 埠.
接著我們使用:

docker logs -f my_zookeeper

這個命令檢視 ZK 的執行情況, 輸出類似如下內容時, 表示 ZK 已經成功啟動了:

>>> docker logs -f my_zookeeper
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
...
2016-09-14 06:40
:03,445 [myid:] - INFO [main:[email protected]89] - binding to port 0.0.0.0/0.0.0.0:2181

使用 ZK 命令列客戶端連線 ZK

因為剛才我們啟動的那個 ZK 容器並沒有繫結宿主機的埠, 因此我們不能直接訪問它. 但是我們可以通過 Docker 的 link 機制來對這個 ZK 容器進行訪問. 執行如下命令:

docker run -it --rm --link my_zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper

如果對 Docker 有過了解的話, 那麼對上面的命令一定不會陌生了.
這個命令的含義是:

  1. 啟動一個 zookeeper 映象, 並執行這個映象內的 zkCli.sh 命令, 命令引數是 "-server zookeeper"

  2. 將我們先前啟動的名為 my_zookeeper 的容器連線(link) 到我們新建的這個容器上, 並將其主機名命名為 zookeeper

當我們執行了這個命令後, 就可以像正常使用 ZK 命令列客戶端一樣操作 ZK 服務了.

ZK 叢集的搭建

因為一個一個地啟動 ZK 太麻煩了, 所以為了方便起見, 我直接使用 docker-compose 來啟動 ZK 叢集.
首先建立一個名為 docker-compose.yml 的檔案, 其內容如下:

version: '2'
services:
    zoo1:
        image: zookeeper
        restart: always
        container_name: zoo1
        ports:
            - "2181:2181"
        environment:
            ZOO_MY_ID: 1
            ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

    zoo2:
        image: zookeeper
        restart: always
        container_name: zoo2
        ports:
            - "2182:2181"
        environment:
            ZOO_MY_ID: 2
            ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

    zoo3:
        image: zookeeper
        restart: always
        container_name: zoo3
        ports:
            - "2183:2181"
        environment:
            ZOO_MY_ID: 3
            ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

這個配置檔案會告訴 Docker 分別執行三個 zookeeper 映象, 並分別將本地的 2181, 2182, 2183 埠繫結到對應的容器的2181埠上.
ZOO_MY_ID 和 ZOO_SERVERS 是搭建 ZK 叢集需要設定的兩個環境變數, 其中 ZOO_MY_ID 表示 ZK 服務的 id, 它是1-255 之間的整數, 必須在叢集中唯一. ZOO_SERVERS 是ZK 叢集的主機列表.

接著我們在 docker-compose.yml 當前目錄下執行:

COMPOSE_PROJECT_NAME=zk_test docker-compose up

即可啟動 ZK 叢集了.
執行上述命令成功後, 接著在另一個終端中執行 docker-compose ps 命令可以檢視啟動的 ZK 容器:

>>> COMPOSE_PROJECT_NAME=zk_test docker-compose ps
Name              Command               State           Ports
----------------------------------------------------------------------
zoo1   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2181->2181/tcp
zoo2   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2182->2181/tcp
zoo3   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2183->2181/tcp

注意, 我們在 "docker-compose up" 和 "docker-compose ps" 前都添加了 COMPOSE_PROJECT_NAME=zk_test 這個環境變數, 這是為我們的 compose 工程起一個名字, 以免與其他的 compose 混淆.

使用 Docker 命令列客戶端連線 ZK 叢集

通過 docker-compose ps 命令, 我們知道啟動的 ZK 叢集的三個主機名分別是 zoo1, zoo2, zoo3, 因此我們分別 link 它們即可:

docker run -it --rm \
        --link zoo1:zk1 \
        --link zoo2:zk2 \
        --link zoo3:zk3 \
        --net zktest_default \
        zookeeper zkCli.sh -server zk1:2181,zk2:2181,zk3:2181

通過本地主機連線 ZK 叢集

因為我們分別將 zoo1, zoo2, zoo3 的 2181 埠對映到了 本地主機的2181, 2182, 2183 埠上, 因此我們使用如下命令即可連線 ZK 叢集了:

zkCli.sh -server localhost:2181,localhost:2182,localhost:2183

檢視叢集

我們可以通過 nc 命令連線到指定的 ZK 伺服器, 然後傳送 stat 可以檢視 ZK 服務的狀態, 例如:

>>> echo stat | nc 127.0.0.1 2181
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT
Clients:
 /172.18.0.1:49810[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 5/39/74
Received: 4
Sent: 3
Connections: 1
Outstanding: 0
Zxid: 0x200000002
Mode: follower
Node count: 4
>>> echo stat | nc 127.0.0.1 2182
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT
Clients:
 /172.18.0.1:50870[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x200000002
Mode: follower
Node count: 4
>>> echo stat | nc 127.0.0.1 2183
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT
Clients:
 /172.18.0.1:51820[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x200000002
Mode: leader
Node count: 4

通過上面的輸出, 我們可以看到, zoo1, zoo2 都是 follower, 而 zoo3 是 leader, 因此證明了我們的 ZK 叢集確實是搭建起來了.

因為docker-compose.yml的格式比較蛋疼,如果你按照上述檔案手寫起不來,報錯.yml檔案報錯。那就複製貼上然後啟動。親自試用,絕對可行。