Docker 搭建 ZooKeeper 集群
前言
几乎现在大部分的分布式中间件都需要使用zk作为协调者,所以在我们搭建各种中间件的时候难免需要额外搭建一个zk集群。通过docker compose可以很方便的搭建一个少量zk节点的zk集群。
伪集群搭建
构建文件结构
#新建文件夹
mkdir -p /mnt/docker/zookeeper
#在redis文件夹下新建docker-compose.yml文件
cd /mnt/docker/zookeeper
touch docker-compose.yaml
编写docker-compose.yaml
文件
version: '3.7'
networks:
zk-net:
name: zk-net
services:
zoo1:
image: zookeeper:3.4.14
hostname: zoo1
container_name: zoo1
ports:
- 2181:2181
volumes:
- ./zk1/data:/data
- ./zk1/datalog:/datalog
environment:
TZ: Asia/Shanghai
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
networks:
- zk-net
zoo2:
image: zookeeper:3.4.14
hostname: zoo2
container_name: zoo2
ports:
- 2182:2181
volumes:
- ./zk2/data:/data
- ./zk2/datalog:/datalog
environment:
TZ: Asia/Shanghai
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888
networks:
- zk-net
zoo3:
image: zookeeper:3.4.14
hostname: zoo3
container_name: zoo3
ports:
- 2183:2181
volumes:
- ./zk3/data:/data
- ./zk3/datalog:/datalog
environment:
TZ: Asia/Shanghai
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888
networks:
- zk-net
配置说明
-
网络配置
-
顶级的
networks
标签指定创建了一个标识为zk-net
的隔离网络,并且给该网络命名为zk-net
。虽然这里将标识和命名都设置为zk-net
,但其实他们是不同的配置。网络标志符是为了配置
docker container
属于某个网络的标志,而命名是为了开发者能够查看和区分宿主机上的所有网络环境,便于了解宿主机上的系统运行情况。docker network ls 查看宿主机上所有网络
-
services
标签下的每一个子标签代表一个docker container
实例,以zoo1
标签为例。zoo1
标签下的networks
子标签,表示将zoo1
所对应的docker container
加入到标识为zk-net
的子网中。
-
-
环境变量
zoo1、zoo2、zoo3
标签下都有一个environment
标签,该标签配置的是容器的环境变量。配置在environment
标签下的环境变量最终会被添加到docker containe
r的环境变量中。Env
标签下除了我们在yaml
文件中显式配置的环境变量以外,还有一些容器自带的环境变量,对于zookeeper
的docker container
来说,这两个配置的十分重要的,必须要来了解一下。
ZOO_MY_ID 表示当前zookeeper实例在zookeeper集群中的编号,范围为1-255,所以一个zk集群最多有255个节点
ZOO_SERVERS 表示当前zookeeper实例所在zookeeper集群中的所有节点的编号、端口、主机名(或IP地址)配置Zookeeper
一共需要用到三个端口:
1、2181:对client端提供服务的端口
2、3888:选举leader使用
3、2888:集群内机器通讯使用(Leader监听此端口)
启动容器
配置完docker-compose.yaml
文件之后,在其所在的目录中运行如下命令:
docker-compose up -d
出现如下提示标识创建成功:
Creating zoo1 ... done
Creating zoo2 ... done
Creating zoo3 ... done
查看节点状态
使用如下命令分别查看节点选举状态:
## zoo1
docker exec -it zoo1 zkServer.sh status
## zoo2
docker exec -it zoo2 zkServer.sh status
## zoo3
docker exec -it zoo3 zkServer.sh status
显示如下类似信息表示zookepper
伪集群搭建成功。
[root@dev-server ~]# docker exec -it zoo1 zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: follower
[root@dev-server ~]#
生产集群搭建
构件文件结构
假设有三台服务器,分别为:192.168.1.101
、192.168.1.102
、192.168.1.103
在每台服务器执行如下指令。
#新建文件夹
mkdir -p /mnt/docker/zookeeper
#在redis文件夹下新建docker-compose.yml文件
cd /mnt/docker/zookeeper
touch docker-compose.yaml
编写docker-compose.yaml
文件
192.168.1.101
服务器
version: '3.7'
networks:
zk-net:
name: zk-net
services:
zoo1:
image: zookeeper:3.4.14
container_name: zoo1
ports:
- 2181:2181
- 2888:2888
- 3888:3888
volumes:
- ./zk1/data:/data
- ./zk1/datalog:/datalog
environment:
TZ: Asia/Shanghai
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=192.168.1.102:2888:3888 server.3=192.168.1.103:2888:3888
networks:
- zk-net
192.168.1.102
服务器
version: '3.7'
networks:
zk-net:
name: zk-net
services:
zoo2:
image: zookeeper:3.4.14
container_name: zoo2
ports:
- 2181:2181
- 2888:2888
- 3888:3888
volumes:
- ./zk2/data:/data
- ./zk2/datalog:/datalog
environment:
TZ: Asia/Shanghai
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=192.168.1.101:2888:3888 server.2=0.0.0.0:2888:3888 server.3=192.168.1.103:2888:3888
networks:
- zk-net
192.168.1.103
服务器
version: '3.7'
networks:
zk-net:
name: zk-net
services:
zoo3:
image: zookeeper:3.4.14
container_name: zoo3
ports:
- 2181:2181
- 2888:2888
- 3888:3888
volumes:
- ./zk3/data:/data
- ./zk3/datalog:/datalog
environment:
TZ: Asia/Shanghai
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=192.168.1.101:2888:3888 server.2=192.168.1.102:2888:3888 server.3=0.0.0.0:2888:3888
networks:
- zk-net
启动容器
以
192.168.1.101
服务器为例,其他服务器执行方式与本服务器一致。
配置完docker-compose.yaml
文件之后,在其所在的目录中运行如下命令:
docker-compose up -d
出现如下提示标识创建成功:
Creating zoo1 ... done
查看节点状态
以
192.168.1.101
服务器为例,其他服务器执行方式与本服务器一致。
使用如下命令查看节点选举状态:
## zoo1
docker exec -it zoo1 zkServer.sh status
显示如下类似信息表示zookepper
伪集群搭建成功。
[root@dev-server ~]# docker exec -it zoo1 zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: follower
[root@dev-server ~]#
后记
至此,zookeeper集群搭建完成。
enjoy