使用Docker搭建Zookeeper集群

使用Docker搭建Zookeeper集群

本文参考:https://blog.csdn.net/wu1226419614/article/details/78075898

  1. 拉取zookeeper镜像

    https://hub.docker.com上面有很多zookeeper镜像,这里采用官方提供的镜像,版本使用3.4

    docker pull zookeeper:3.4

    下载成功后,查看所有镜像,zookeeper:3.4已经存在

    william@zhangshenao  ~  docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    zookeeper           3.4                 cfed220ec48b        2 weeks ago         148MB
    tomcat              7.0.88              6ccc1317fc1d        6 weeks ago         363MB
    mysql               5.7.22              0d16d0a97dd1        2 months ago        372MB
    redis               3.2.11              e97b1f10d81a        2 months ago        99.7MB
  2. zookeeper镜像基本使用

    william@zhangshenao  ~  docker run --name zk01 -d zookeeper:3.4
    00030386911e2735087c1bbc223573d81e3aee5ab0222e1da83a40513d78ce97

    这个命令会在后台运行一个 zookeeper 容器, 名字是 zk01, 并且它默认会导出 2181 端口。

    查看 ZK 的运行情况, 输出类似如下内容时, 表示 ZK 已经成功启动了:

    docker logs -f zk01
    ZooKeeper JMX enabled by default
    Using config: /conf/zoo.cfg
    2018-07-25 03:34:26,055 [myid:] - INFO  [main:QuorumPeerConfig@136] - Reading configuration from: /conf/zoo.cfg
    2018-07-25 03:34:26,062 [myid:] - INFO  [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3
    2018-07-25 03:34:26,062 [myid:] - INFO  [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0
    2018-07-25 03:34:26,062 [myid:] - INFO  [main:DatadirCleanupManager@101] - Purge task is not scheduled.
    2018-07-25 03:34:26,063 [myid:] - WARN  [main:QuorumPeerMain@116] - Either no config or no quorum defined in config, running  in standalone mode
    2018-07-25 03:34:26,078 [myid:] - INFO  [main:QuorumPeerConfig@136] - Reading configuration from: /conf/zoo.cfg
    2018-07-25 03:34:26,078 [myid:] - INFO  [main:ZooKeeperServerMain@98] - Starting server
    2018-07-25 03:34:26,089 [myid:] - INFO  [main:Environment@100] - Server environment:zookeeper.version=3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT
    2018-07-25 03:34:26,089 [myid:] - INFO  [main:Environment@100] - Server environment:host.name=00030386911e
    2018-07-25 03:34:26,091 [myid:] - INFO  [main:Environment@100] - Server environment:java.version=1.8.0_171
    2018-07-25 03:34:26,091 [myid:] - INFO  [main:Environment@100] - Server environment:java.vendor=Oracle Corporation
    2018-07-25 03:34:26,092 [myid:] - INFO  [main:Environment@100] - Server environment:java.home=/usr/lib/jvm/java-1.8-openjdk/jre
    2018-07-25 03:34:26,092 [myid:] - INFO  [main:Environment@100] - Server environment:java.class.path=/zookeeper-3.4.12/bin/../build/classes:/zookeeper-3.4.12/bin/../build/lib/*.jar:/zookeeper-3.4.12/bin/../lib/slf4j-log4j12-1.7.25.jar:/zookeeper-3.4.12/bin/../lib/slf4j-api-1.7.25.jar:/zookeeper-3.4.12/bin/../lib/netty-3.10.6.Final.jar:/zookeeper-3.4.12/bin/../lib/log4j-1.2.17.jar:/zookeeper-3.4.12/bin/../lib/jline-0.9.94.jar:/zookeeper-3.4.12/bin/../lib/audience-annotations-0.5.0.jar:/zookeeper-3.4.12/bin/../zookeeper-3.4.12.jar:/zookeeper-3.4.12/bin/../src/java/lib/*.jar:/conf:
    2018-07-25 03:34:26,092 [myid:] - INFO  [main:Environment@100] - Server environment:java.library.path=/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64:/usr/lib/jvm/java-1.8-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
    2018-07-25 03:34:26,092 [myid:] - INFO  [main:Environment@100] - Server environment:java.io.tmpdir=/tmp
    2018-07-25 03:34:26,092 [myid:] - INFO  [main:Environment@100] - Server environment:java.compiler=<NA>
    2018-07-25 03:34:26,094 [myid:] - INFO  [main:Environment@100] - Server environment:os.name=Linux
    2018-07-25 03:34:26,094 [myid:] - INFO  [main:Environment@100] - Server environment:os.arch=amd64
    2018-07-25 03:34:26,095 [myid:] - INFO  [main:Environment@100] - Server environment:os.version=4.9.87-linuxkit-aufs
    2018-07-25 03:34:26,095 [myid:] - INFO  [main:Environment@100] - Server environment:user.name=zookeeper
    2018-07-25 03:34:26,095 [myid:] - INFO  [main:Environment@100] - Server environment:user.home=/home/zookeeper
    2018-07-25 03:34:26,096 [myid:] - INFO  [main:Environment@100] - Server environment:user.dir=/zookeeper-3.4.12
    2018-07-25 03:34:26,111 [myid:] - INFO  [main:ZooKeeperServer@835] - tickTime set to 2000
    2018-07-25 03:34:26,112 [myid:] - INFO  [main:ZooKeeperServer@844] - minSessionTimeout set to -1
    2018-07-25 03:34:26,112 [myid:] - INFO  [main:ZooKeeperServer@853] - maxSessionTimeout set to -1
    2018-07-25 03:34:26,126 [myid:] - INFO  [main:ServerCnxnFactory@117] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
    2018-07-25 03:34:26,139 [myid:] - INFO  [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181
  3. 使用Docker的zookeeper命令行连接zookeeper

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

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

    如果对 Docker 有过了解的话,那么对上面的命令一定不会陌生了。
    这个命令的含义是:

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

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

  4. zookeeper集群的搭建

    因为一个一个地启动 ZK 太麻烦了, 所以为了方便起见,我直接使用 docker-compose 来启动 ZK 集群。

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

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

    这个配置文件会告诉Docker分别运行三个 zookeeper 镜像,并分别将本地的2181、2182、2183 端口绑定到对应的容器的2181端口上。ZOO_MY_ID 和 ZOO_SERVERS 是搭建 ZK 集群需要设置的两个环境变量,其中 ZOO_MY_ID 表示 ZK 服务的 id,它是1-255 之间的整数,必须在集群中唯一。ZOO_SERVERS 是ZK 集群的主机列表。

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

    COMPOSE_PROJECT_NAME=zk_local docker-compose up

    即可启动 ZK 集群了。

    执行上述命令成功后,接着在另一个终端中运行 docker-compose ps 命令可以查看启动的 ZK 容器:

    COMPOSE_PROJECT_NAME=zk_local docker-compose ps
    Name              Command               State                     Ports
    <hr />
    
    zoo1   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp
    zoo2   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2182->2181/tcp, 2888/tcp, 3888/tcp
    zoo3   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2183->2181/tcp, 2888/tcp, 3888/tcp

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

  5. 使用zookeeper客户端连接zookeeper集群

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

    zkCli.sh -server localhost:2181,localhost:2182,localhost:2183
  6. 查看zookeeper集群状态

    我们可以通过 nc 命令连接到指定的 ZK 服务器, 然后发送 stat 可以查看 ZK 服务的状态, 例如:

    echo stat | nc 127.0.0.1 2181

猜你喜欢

转载自blog.csdn.net/weixin_34452850/article/details/81201110