zookeeper 命令_使用Docker搭建ZooKeeper集群

1. 下载镜像

我们使用官方提供的Zookeeper镜像:

docker pull zookeeper:3.5.8

选择 3.5.8 版本

当出现如下信息时表示镜像下载成功:

wy:study wy$ docker pull zookeeper:3.5.83.5.8: Pulling from library/zookeeper...Digest: sha256:12af523731cbe390f5332d6c1e254f1d56c734a786910d5582653445a5cee299Status: Downloaded newer image for zookeeper:3.5.8docker.io/library/zookeeper:3.5.8

通过如下命令查看下载的 Zookeeper 镜像:

docker images

26f2832768066b698459e2941c2b3a59.png

2. Standalone模式

2.1 启动容器

通过如下命令启动容器:

docker run -p 8080:8080 --name zookeeper-standalone --restart always -d zookeeper:3.5.8

上述命令在后台运行一个名为 zookeeper-standalone 的容器。由于 Zookeeper 是’快速失败’,因此最好通过 --retart参数设置容器在意外停止时自动重启。默认是 no,表示不重启。-p 参数将宿主机端口 8080 与容器端口 8080 映射。通过如下命令查看运行中的 Zookeeper 容器:

docker ps

e2c4814cebffe05b0c6a6693f7b88aac.png

通过上图我们可以看到容器对外暴露了4个端口:2181 2888 3888 8080(分别是 Zookeeper 客户端端口,主从节点交互信息的端口,选举端口以及 AdminServer 端口)。暴露端口主要是镜像包含了 EXPOSE 2181 2888 3888 8080 命令,具体可以参阅镜像Dockerfile。

Zookeeper 3.5 版本开始提供 AdminServer 功能。AdminServer 是嵌入式 Jetty 服务器,为四字母命令提供 HTTP 接口。默认端口是8080。由于在启动容器时做了端口映射,我们可以直接通过 http://localhost:8080/commands/stats 进行访问:

{  "version" : "3.5.8-f439ca583e70862c3068a1f2a7d4d068eec33315, built on 05/04/2020 15:07 GMT",  "read_only" : false,  "server_stats" : {    "packets_sent" : 0,    "packets_received" : 0,    "max_latency" : 0,    "min_latency" : 0,    "fsync_threshold_exceed_count" : 0,    "client_response_stats" : {      "last_buffer_size" : -1,      "min_buffer_size" : -1,      "max_buffer_size" : -1    },    "server_state" : "standalone",    "avg_latency" : 0,    "num_alive_client_connections" : 0,    "provider_null" : false,    "data_dir_size" : 0,    "log_dir_size" : 424,    "last_processed_zxid" : 0,    "outstanding_requests" : 0  },  "client_response" : {    "last_buffer_size" : -1,    "min_buffer_size" : -1,    "max_buffer_size" : -1  },  "node_count" : 5,  "connections" : [ ],  "secure_connections" : [ ],  "command" : "stats",  "error" : null}

在Docker中容器默认是无法与外部通信,需要将容器内的端口映射到本地宿主机的端口,这样用户通过访问宿主机指定端口时相当于访问容器内的端口。

2.2 进入容器

通过如下命令进入容器内:

wy:study wy$ docker exec -it zookeeper-standalone /bin/bashroot@6862ee5bda9c:/apache-zookeeper-3.5.8-bin#root@6862ee5bda9c:/apache-zookeeper-3.5.8-bin#root@6862ee5bda9c:/apache-zookeeper-3.5.8-bin#

容器的默认工作目录为 /apache-zookeeper-3.5.8-bin,是因为 Zookeeper 镜像做如下设置:

ARG DISTRO_NAME=apache-zookeeper-3.5.8-binWORKDIR $DISTRO_NAME

配置文件默认在 /conf 目录下,我们具体看一下默认配置:

root@d3a8ecd271fc:/apache-zookeeper-3.5.8-bin# cat /conf/zoo.cfgdataDir=/datadataLogDir=/datalogtickTime=2000initLimit=5syncLimit=2autopurge.snapRetainCount=3autopurge.purgeInterval=0maxClientCnxns=60standaloneEnabled=trueadmin.enableServer=trueserver.1=localhost:2888:3888;2181

我们可以使用 zkServer.sh status 命令来查看 Zookeeper 启动状态:

root@d3a8ecd271fc:/apache-zookeeper-3.5.8-bin# zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgClient port found: 2181. Client address: localhost.Mode: standaloneroot@d3a8ecd271fc:/apache-zookeeper-3.5.8-bin#

从上面可以看到确实是 standalone 模式。

2.3 连接Zookeeper服务

我们可以使用如下命令连接Zookeeper服务:

zkCli.sh -server 127.0.0.1:2181

如果看到如下信息,表示我们连接成功:

7d160672820d01a5f02309ee7f725caa.png

我们可以不用先进入容器再连接Zookeeper服务,使用如下命令一步到位:

docker exec -it zookeeper-standalone zkCli.sh -server 127.0.0.1:2181

3. 集群模式

这里我们就搭建3个 Zookeeper 节点的集群。

3.1 启动容器

为了避免一个一个的启动,我们使用 docker-compose 的方式来启动 Zookeeper 集群。首先创建一个名为 docker-compose.yml 的文件, 其内容如下:

version: '3.1'services:  zoo1:    image: zookeeper:3.5.8    restart: always    hostname: zoo1    ports:      - 2181:2181    environment:      ZOO_MY_ID: 1      ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181  zoo2:    image: zookeeper:3.5.8    restart: always    hostname: zoo2    ports:      - 2182:2181    environment:      ZOO_MY_ID: 2      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181  zoo3:    image: zookeeper:3.5.8    restart: always    hostname: zoo3    ports:      - 2183:2181    environment:      ZOO_MY_ID: 3      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181

上述配置将以副本模式启动 Zookeeper 3.5.8,同时会告诉 Docker 运行三个 Zookeeper 容器:zoo1、zoo2、zoo3,并分别将本地的 2181, 2182, 2183 端口绑定到对应的容器的 2181 端口上。

ZOO_MY_ID 和 ZOO_SERVERS 是搭建 Zookeeper 集群需要设置的两个环境变量, 其中 ZOO_MY_ID 表示 Zookeeper 服务的 id, 它是1-255 之间的整数, 必须在集群中唯一。ZOO_SERVERS 是Zookeeper 集群的主机列表。

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

COMPOSE_PROJECT_NAME=zookeeper_cluster docker-compose up -d

或者指定配置文件名称 COMPOSE_PROJECT_NAME=zookeeper_cluster docker-compose -f docker-compose.yml up -d。

我们在 docker-compose up 前添加 COMPOSE_PROJECT_NAME=zookeeper_cluster 环境变量是为我们的 compose 工程起一个名字。

看到如下信息表示容器启动成功:

wy:zookeeper wy$ COMPOSE_PROJECT_NAME=zookeeper_cluster docker-compose up -dCreating network "zookeeper_cluster_default" with the default driverCreating zookeeper_cluster_zoo1_1 ... doneCreating zookeeper_cluster_zoo3_1 ... doneCreating zookeeper_cluster_zoo2_1 ... done

通过如下命令查看运行中的 Zookeeper 集群容器:

docker ps

3c88882f3dd89cf7cbf9436e79a10dcf.png

3.2 进入容器

通过如下命令进入 zookeeper_cluster_zoo1_1 容器内:

wy:zookeeper wy$ docker exec -it zookeeper_cluster_zoo1_1 /bin/bashroot@zoo1:/apache-zookeeper-3.5.8-bin#root@zoo1:/apache-zookeeper-3.5.8-bin#root@zoo1:/apache-zookeeper-3.5.8-bin#root@zoo1:/apache-zookeeper-3.5.8-bin#

我们可以使用 zkServer.sh status 命令来查看 Zookeeper 的启动状态:

root@zoo1:/apache-zookeeper-3.5.8-bin# zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgClient port found: 2181. Client address: localhost.Mode: follower

可以看到该节点是 Follower 节点,以此类推,查看 zookeeper_cluster_zoo2_1、zookeeper_cluster_zoo3_1 容器的启动状态:

wy:zookeeper wy$ docker exec -it zookeeper_cluster_zoo2_1 /bin/bashroot@zoo2:/apache-zookeeper-3.5.8-bin# zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgClient port found: 2181. Client address: localhost.Mode: followerwy:zookeeper wy$ docker exec -it zookeeper_cluster_zoo3_1 /bin/bashroot@zoo3:/apache-zookeeper-3.5.8-bin# zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /conf/zoo.cfgClient port found: 2181. Client address: localhost.Mode: leader

从上面可以看到我们创建了一个主节点Leader,2个从节点Follower。

从配置文件中可以看到该 Zookeeper 节点的配置信息位于 /conf/zoo.cfg 文件中:

root@zoo1:/apache-zookeeper-3.5.8-bin# cat /conf/zoo.cfgdataDir=/datadataLogDir=/datalogtickTime=2000initLimit=5syncLimit=2autopurge.snapRetainCount=3autopurge.purgeInterval=0maxClientCnxns=60standaloneEnabled=trueadmin.enableServer=trueserver.1=0.0.0.0:2888:3888;2181server.2=zoo2:2888:3888;2181server.3=zoo3:2888:3888;2181

以 zookeeper_cluster_zoo1_1 容器为例

3.3 连接Zookeeper服务

使用如下命令在容器内连接该节点的 ZooKeeper 服务:

zkCli.sh -server localhost:2181

如果看到如下信息,表示我们连接成功:

44b44e00e7f38486a88f870b734d3779.png

我们也可以通过本地主机连接 Zookeeper 集群,因为我们将 zoo1, zoo2, zoo3 的 2181 端口分别映射到了本地主机的 2181, 2182, 2183 端口上, 因此我们使用如下命令连接 Zookeeper 集群:

zkCli.sh -server localhost:2181,localhost:2182,localhost:2183

如果看到如下信息,表示我们通过本地宿主机连接集群成功:

2fca2dd261d80274db737cae458dac28.png

欢迎关注我的公众号和博客:

1c7a4f81e6f54805e222939ff91db5d9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值