win环境基于docker搭建zookeeper伪集群

创建路径:D:\Docker\zk-cluster

在此路径下创建配置文件:docker-compose.yml

version: '2'
networks:
  zk-net:
    name: zk-net
services:
    zoo1:
        image: zookeeper
        restart: always
        container_name: zoo1
        ports:
            - "2181:2181"
        environment:
            ZOO_MY_ID: 1
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183 
        networks:
          - zk-net
    zoo2:
        image: zookeeper
        restart: always
        container_name: zoo2
        ports:
            - "2182:2181"
        environment:
            ZOO_MY_ID: 2
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183 
        networks:
          - zk-net
    zoo3:
        image: zookeeper
        restart: always
        container_name: zoo3
        ports:
            - "2183:2181"
        environment:
            ZOO_MY_ID: 3
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183 
        networks:
          - zk-net

看一下各个参数的含义:

    zoo1: #配置1号zk
        image: zookeeper:latest #zk版本
        restart: always
        container_name: zoo1 #容器的名字
        ports:
            - "2181:2181" #将该容器的2181端口开放给物理机2181端口
        environment:
            ZOO_MY_ID: 1 #表示zk服务的id,它是1-255之间的整数,必须在集群中唯一
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183  #zk集群的主机列表

其中 ZOO_SERVERS 一项配置较为复杂,所以我问了一下chatGPT:

这是 ZooKeeper 集群的配置信息,其中 server.1 表示该节点的 ID 号为 1。zoo1:2888:3888 表示该节点所在的服务器名称和端口号,其中 2888 是用于 follower 和 leader 连接的端口号,3888 是用于选举 leader 时的端口号。2181 是客户端连接的端口号,也就是 ZooKeeper 服务监听的端口号。因此,这个配置信息表示该节点的 ID 号为 1,它的地址为 zoo1:2888:3888,同时监听的端口号为 2181。

注意这里根据zookeeper版本不同,配置也有区别,3.4.x及以下版本并没有 ;2181 这个参数。

在该路径下打开终端

PS D:\Docker> cd .\zk-cluster\

使用该命令启动:

PS D:\Docker\zk-cluster> docker-compose -f .\docker-compose.yml up -d

然而报错了:

Top-level object must be a mapping

顺便看一下这个报错,错误原因是没保存···

保存这个文档,然后重新启动

PS D:\Docker\zk-cluster> docker-compose -f .\docker-compose.yml up -d

[+] Running 4/4

✔Network zk-cluster_default Created 0.8s

✔ Container zoo1        Started  3.3s

✔ Container zoo3        Started  3.3s

✔ Container zoo2        Started  3.3s

启动成功。

查看docker客户端的容器面板:

进入该容器:

PS D:\Docker\zk-cluster> docker exec -it zoo1 /bin/bash

root@9c3f8f26101c:/apache-zookeeper-3.8.1-bin# cd bin

root@9c3f8f26101c:/apache-zookeeper-3.8.1-bin/bin# ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /conf/zoo.cfg

Client port found: 2181. Client address: localhost. Client SSL: false.

Mode: follower

root@9c3f8f26101c:/apache-zookeeper-3.8.1-bin/bin# exit

exit

PS D:\Docker\zk-cluster> docker exec -it zoo2 /bin/bash

root@204ef646b371:/apache-zookeeper-3.8.1-bin# cd bin

root@204ef646b371:/apache-zookeeper-3.8.1-bin/bin# ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /conf/zoo.cfg

Client port found: 2182. Client address: localhost. Client SSL: false.

Mode: leader

可以看到zoo1是follower,zoo2是leader

简单的3节点zookeeper集群就搭建完毕。

 

在查找资料过程中,我发现不少的博客都另外配置了zoo.cfg这个文件,这当然不失为一种办法。但是就在本地部署伪集群来说,我无法认同在docker中使用这样的配置方法,这使得配置的过程复杂化了。当然在真正的zookeeper集群中,这并不是一个问题···

posted @ 2023-04-25 12:26  Muzphy  阅读(325)  评论(0)    收藏  举报