Docker 一步搞定 ZooKeeper 集羣的搭建

Docker 一步搞定 ZooKeeper 集羣的搭建

背景

原來學習 ZK 時, 我是在本地搭建的僞集羣, 雖說使用起來沒有什麼問題, 可是總感受部署起來有點麻煩. 恰好我發現了 ZK 已經有了 Docker 的鏡像了, 因而就嘗試了一下, 發現真是爽爆了, 幾個命令就能夠搭建一個完整的 ZK 集羣. 下面我簡單記錄一下使用 Docker 搭建 ZK 集羣的一些步驟.html

 

鏡像下載

hub.docker.com 上有很多 ZK 鏡像, 不過爲了穩定起見, 咱們就使用官方的 ZK 鏡像吧.
首先執行以下命令:docker

1
docker pull zookeeper

  

當出現以下結果時, 表示鏡像已經下載完成了:bash

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 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 鏡像

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

  

這個命令會在後臺運行一個 zookeeper 容器, 名字是 my_zookeeper, 而且它默認會導出 2181 端口.
接着咱們使用:服務器

1
docker logs -f my_zookeeper

  

這個命令查看 ZK 的運行狀況, 輸出相似以下內容時, 表示 ZK 已經成功啓動了:tcp

1
2
3
4
5
>>> 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:NIOServerCnxnFactory@89] - binding to port 0.0.0.0 /0 .0.0.0:2181

  

使用 ZK 命令行客戶端鏈接 ZK

由於剛纔咱們啓動的那個 ZK 容器並無綁定宿主機的端口, 所以咱們不能直接訪問它. 可是咱們能夠經過 Docker 的 link 機制來對這個 ZK 容器進行訪問. 執行以下命令:post

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

  

若是對 Docker 有過了解的話, 那麼對上面的命令必定不會陌生了.
這個命令的含義是:學習

  1. 啓動一個 zookeeper 鏡像, 並運行這個鏡像內的 zkCli.sh 命令, 命令參數是 "-server zookeeper"ui

  2. 將咱們先前啓動的名爲 my_zookeeper 的容器鏈接(link) 到咱們新建的這個容器上, 並將其主機名命名爲 zookeeperurl

當咱們執行了這個命令後, 就能夠像正常使用 ZK 命令行客戶端同樣操做 ZK 服務了.spa

ZK 集羣的搭建

由於一個一個地啓動 ZK 太麻煩了, 因此爲了方便起見, 我直接使用 docker-compose 來啓動 ZK 集羣.
首先建立一個名爲 docker-compose.yml 的文件, 其內容以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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 當前目錄下運行:

1
COMPOSE_PROJECT_NAME=zk_test docker-compose up

  

便可啓動 ZK 集羣了.
執行上述命令成功後, 接着在另外一個終端中運行 docker-compose ps 命令能夠查看啓動的 ZK 容器:

1
2
3
4
5
6
>>> 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 它們便可:

1
2
3
4
5
6
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 集羣了:

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

  

查看集羣

咱們能夠經過 nc 命令鏈接到指定的 ZK 服務器, 而後發送 stat 能夠查看 ZK 服務的狀態, 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
>>>  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 集羣確實是搭建起來了.

相關文章
相關標籤/搜索