docker 搭建 zookeeper 集群

1. Zookeeper 基本使用

下载 zookeeper 镜像

默认下载最新版本,指定版本可以在 zookeeper 后面添加 tag,如 zookeeper:latest

1
docker pull zookeeper

启动 zookeeper 镜像。

1
docker run --name first-zk -d zookeeper

这个命令会创建名为 first-zk 的 zookeeper 容器,在后台运行,并默认导出 2181 端口。

测试 zookeeper 容器

以下命令通过输出日志可以查看 zk 运行情况。

1
docker logs -f first-zk

客户端连接 zk 服务器

1. 在已创建的 first-zk 容器中,执行 zkCli.sh:

1
docker exec -it first-zk zkCli.sh

2. 新建 zookeeper 容器作为客户端,并连接到 first-zk:

1
docker run -it --rm --link first-zk zookeeper zkCli.sh -server first-zk

这里 --link first-zk 通过 docker 的 link 机制来访问 first-zk 容器;
--rm 在容器退出后会自动删除容器;
zkCli.sh -server first-zk 则启动 zkCli.sh 命令,连接到 first-zk。

zkCli.sh 常用命令的使用,请参考这里

2. Zookeeper 集群搭建

编写 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
version: '2.2'
services:
zk1:
image: zookeeper
restart: always
container_name: zk1
ports:
- "2181:2181"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
zk2:
image: zookeeper
restart: always
container_name: zk2
ports:
- "2182:2181"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
zk3:
image: zookeeper
restart: always
container_name: zk3
ports:
- "2183:2181"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888

在这个配置文件中,docker 运行了 3 个 zookeeper 镜像,通过 ports 字段分别将本地的 2181, 2182, 2183 端口绑定到对应容器的 2181 端口上。

ZOO_MY_IDZOO_SERVERS 是搭建 Zookeeper 集群需要的两个环境变量。
ZOO_MY_ID 标识服务的 id,为 1-255 之间的整数,必须在集群中唯一。
ZOO_SERVERS 是集群中的主机列表。

docker-compose.yml 所在目录下执行 COMPOSE_PROJECT_NAME=docker-zk-cluster docker-compose up

1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  docker-zk-cluster COMPOSE_PROJECT_NAME=docker-zk-cluster docker-compose up

Creating network "docker-zk-cluster_default" with the default driver
Creating zk2 ... done
Creating zk1 ... done
Creating zk3 ... done
Attaching to zk3, zk1, zk2
zk3 | ZooKeeper JMX enabled by default
zk1 | ZooKeeper JMX enabled by default
zk2 | ZooKeeper JMX enabled by default
zk2 | Using config: /conf/zoo.cfg
zk3 | Using config: /conf/zoo.cfg
zk1 | Using config: /conf/zoo.cfg
...

COMPOSE_PROJECT_NAME=docker-zk-cluster 设置该环境变量是为当前的 compose 工程取的名字,与其他工程做区分。

启动后,打开另一终端窗口,运行 COMPOSE_PROJECT_NAME=docker-zk-cluster docker-compose ps,查看服务运行状态

1
2
3
4
5
6
7
8
9
10
➜  COMPOSE_PROJECT_NAME=docker-zk-cluster docker-compose ps

Name Command State Ports
--------------------------------------------------------------------------------
zk1 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2181->2181/tcp,
2888/tcp, 3888/tcp
zk2 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2182->2181/tcp,
2888/tcp, 3888/tcp
zk3 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2183->2181/tcp,
2888/tcp, 3888/tcp

使用 Docker 命令行客户端连接 ZK 集群

1
2
docker run -it --rm --link zk1 --link zk2 --link zk3 --net docker-zk-cluster_default zookeeper zkCli.sh -server zk1:2181,zk2:2181,zk3:2181
Connecting to zk1:2181,zk2:2181,zk3:2181

--net docker-zk-cluster_default 其中 docker-zk-cluster 是 compose 工程名,不作这个配置会导致 docker: Error response from daemon: Cannot link to /zk1, as it does not belong to the default network. 异常。具体原因请看这里

查看集群

通过 nc 命令连接到指定 Zookeeper 服务器,发送 stat 来查看状态。

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
41
➜  ~ echo stat | nc localhost 2181
Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
Clients:
/172.19.0.5:40210[1](queued=0,recved=31,sent=31)
/172.19.0.1:34682[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/2/76
Received: 32
Sent: 31
Connections: 2
Outstanding: 0
Zxid: 0x100000001
Mode: follower
Node count: 4
➜ ~ echo stat | nc localhost 2182
Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
Clients:
/172.19.0.1:37312[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000001
Mode: follower
Node count: 4
➜ ~ echo stat | nc localhost 2183
Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
Clients:
/172.19.0.1:54278[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000001
Mode: leader
Node count: 4
Proposal sizes last/min/max: 36/36/36

如上,我们发现 zk3(端口为 2183)为 leader,其他为 follower。