Docker 搭建 ZooKeeper 集群

613

前言

几乎现在大部分的分布式中间件都需要使用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 container的环境变量中。
    • Env标签下除了我们在yaml文件中显式配置的环境变量以外,还有一些容器自带的环境变量,对于zookeeperdocker 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.101192.168.1.102192.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

文章参考:参考文章一参考文章