19 07 2021

ZooKeeper 单点搭建

1、镜像拉取(拉取最新的)

  1. docker pull zookeeper:latest

2、创建并启动 zk 镜像

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

这个命令会在后台运行一个 zookeeper 容器, 名字是 my_zookeeper, 并且它默认会导出 2181 端口,也可以通过 -p 2181:2181 绑定宿主机端口供一些客户端连接。

  1. docker logs -f my_zookeeper

使用如上命令,我们可以看到 ZooKeeper 相关日主信息。

3、使用 ZK 命令行客户端连接 ZK

因为刚才我们启动的那个 ZK 容器并没有绑定宿主机的端口, 因此我们不能直接访问它. 但是我们可以通过 Docker 的 link 机制来对这个 ZK 容器进行访问. 执行如下命令:

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

这个命令的含义是:

  1. 启动一个 zookeeper 镜像, 并运行这个镜像内的 zkCli.sh 命令, 命令参数是 “-server zookeeper”
  2. 将我们先前启动的名为 my_zookeeper 的容器连接(link) 到我们新建的这个容器上, 并将其主机名命名为 zookeeper

当我们执行了这个命令后, 就可以像正常使用 ZK 命令行客户端一样操作 ZK 服务了。

ZooKeeper 集群搭建

1、docker-compose.yml

首先创建一个名为 docker-compose.yml 的文件, 其内容如下:

  1. version: '3.1'
  2. services:
  3. zoo1:
  4. image: zookeeper
  5. restart: always
  6. hostname: zoo1
  7. container_name: zoo1
  8. ports:
  9. - "2181:2181"
  10. environment:
  11. ZOO_MY_ID: 1
  12. ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
  13. zoo2:
  14. image: zookeeper
  15. restart: always
  16. hostname: zoo2
  17. container_name: zoo2
  18. ports:
  19. - "2182:2181"
  20. environment:
  21. ZOO_MY_ID: 2
  22. ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
  23. zoo3:
  24. image: zookeeper
  25. restart: always
  26. hostname: zoo3
  27. container_name: zoo3
  28. ports:
  29. - "2183:2181"
  30. environment:
  31. ZOO_MY_ID: 3
  32. ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
  33. networks:
  34. default:
  35. external:
  36. name: zookeeper_network

这个配置文件会告诉 Docker 分别运行三个 zookeeper 镜像, 并分别将本地的 2181, 2182, 2183 端口绑定到对应的容器的2181端口上。

ZOO_MY_ID 和 ZOO_SERVERS 是搭建 ZK 集群需要设置的两个环境变量:

  • ZOO_MY_ID 表示 ZK 服务的 id, 它是1-255 之间的整数, 必须在集群中唯一。
  • ZOO_SERVERS 是ZK 集群的主机列表。

端口:

  • 2888是zk之间通信的端口。
  • 3888是zk之间投票选举的端口。

networks创建:

  1. docker networks create zookeeper_network

2、启动 ZK 集群

接着我们在 docker-compose.yml 当前目录下运行:

  1. COMPOSE_PROJECT_NAME=zk_cluster docker-compose up -d

即可启动 ZK 集群了。

3、查看 ZK 集群容器

接着在另一个终端中运行 docker-compose ps 命令(在当前目录下执行),可以查看启动的 ZK 容器:

  1. >>> COMPOSE_PROJECT_NAME=zk_cluster docker-compose ps
  2. Name Command State Ports
  3. ----------------------------------------------------------------------------------------------------
  4. zoo1 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp
  5. zoo2 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2182->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp
  6. zoo3 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2183->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp

注意, 我们在 “docker-compose up” 和 “docker-compose ps” 前都添加了 COMPOSE_PROJECT_NAME=zk_cluster 这个环境变量, 这是为我们的 compose 工程起一个名字, 以免与其他的 compose 混淆。

4、关闭 ZK 集群

  1. COMPOSE_PROJECT_NAME=zk_cluster docker-compose stop

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

通过 docker-compose ps 命令, 我们知道启动的 ZK 集群的三个主机名分别是 zoo1, zoo2, zoo3, 因此我们分别 link 它们即可:

  1. docker run -it --rm \
  2. --link zoo1:zk1 \
  3. --link zoo2:zk2 \
  4. --link zoo3:zk3 \
  5. --net zookeeper_network \
  6. zookeeper zkCli.sh -server zk1:2181,zk2:2181,zk3:2181

6、直接进入容器内部查看

  1. docker exec -it zoo1 bash
  2. ./bin/zkServer.sh status
  3. ----------------------------------------------------------------------------------------------------
  4. ZooKeeper JMX enabled by default
  5. Using config: /conf/zoo.cfg
  6. Client port found: 2181. Client address: localhost. Client SSL: false.
  7. Mode: follower
  1. docker exec -it zoo2 bash
  2. ./bin/zkServer.sh status
  3. ----------------------------------------------------------------------------------------------------
  4. ZooKeeper JMX enabled by default
  5. Using config: /conf/zoo.cfg
  6. Client port found: 2181. Client address: localhost. Client SSL: false.
  7. Mode: follower
  1. docker exec -it zoo3 bash
  2. ./bin/zkServer.sh status
  3. ----------------------------------------------------------------------------------------------------
  4. ZooKeeper JMX enabled by default
  5. Using config: /conf/zoo.cfg
  6. Client port found: 2181. Client address: localhost. Client SSL: false.
  7. Mode: leader

从上状态可以看出,zoo3为leader节点,zoo1和zoo2位follower节点,至此zk集群搭建成功了。

命令总结

拉取镜像

  1. docker pull {镜像名称}:{版本号(默认为latest)}

创建并启动镜像

  1. docker run --name {自定义容器名称} -d {镜像名称}:{版本号(默认为latest)}

查看日志

  1. docker logs -f {容器名称}

创建网络

  1. docker networks create {网络名称}

运行docker-compose

  1. COMPOSE_PROJECT_NAME={自定义docker-compose名称,用于区分} docker-compose up -d

查看docker-compose相关容器

  1. COMPOSE_PROJECT_NAME={自定义docker-compose名称,用于区分} docker-compose ps

停止docker-compose

  1. COMPOSE_PROJECT_NAME={自定义docker-compose名称,用于区分} docker-compose stop

进入容器

  1. docker exec -it {容器名称或容器ID} bash

查看ZooKeeper服务状态

  1. ./zkServer.sh status
延伸阅读
  1. Apache Dubbo入门
  2. ZooKeeper(2):linux 安装 ZooKeeper
  3. ZooKeeper(1):入门
  4. RPC 基础
  5. ZooKeeper(3):使用 Docker 搭建 ZooKeeper 集群
发表评论