原来学习 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
|
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 容器并无绑定宿主机的端口, 所以咱们不能直接访问它. 可是咱们能够经过 Docker 的 link 机制来对这个 ZK 容器进行访问. 执行以下命令:post
1
|
docker run -it --
rm
--link my_zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper
|
若是对 Docker 有过了解的话, 那么对上面的命令必定不会陌生了.
这个命令的含义是:学习
启动一个 zookeeper 镜像, 并运行这个镜像内的 zkCli.sh 命令, 命令参数是 "-server zookeeper"ui
将咱们先前启动的名为 my_zookeeper 的容器链接(link) 到咱们新建的这个容器上, 并将其主机名命名为 zookeeperurl
当咱们执行了这个命令后, 就能够像正常使用 ZK 命令行客户端同样操做 ZK 服务了.spa
由于一个一个地启动 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-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
|
由于咱们分别将 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 集群确实是搭建起来了.