暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

docker环境,搭建zookeeper集群

binecy 2020-03-03
238

这篇文章分享如何在docker环境下搭建zookeeper集群。

bin/jdk:8u221镜像的构建,请参考 -- docker基础环境搭建

下载apache-zookeeper-3.5.7-bin.tar.gz,并构建bin/zookeeper:3.5.7镜像,Dockerfile如下

  1. FROM bin/jdk:8u221


  2. WORKDIR /usr/lib


  3. COPY apache-zookeeper-3.5.7-bin.tar.gz .

  4. RUN tar -xzf apache-zookeeper-3.5.7-bin.tar.gz \

  5. && rm apache-zookeeper-3.5.7-bin.tar.gz


  6. COPY docker-entrypoint.sh /usr/local/bin

  7. RUN groupadd -r zookeeper && useradd -r -g zookeeper zookeeper \

  8. && mkdir -p /usr/local/zookeeper/data/ \

  9. && chown -R zookeeper:zookeeper /usr/local/zookeeper/data \

  10. && chmod 777 /usr/local/bin/docker-entrypoint.sh


  11. VOLUME /usr/local/zookeeper/data/


  12. WORKDIR /usr/lib/apache-zookeeper-3.5.7-bin

  13. ENTRYPOINT ["docker-entrypoint.sh"]

docker-entrypoint.sh负责编写配置文件,启动zookeeper进程

  1. #!/bin/bash


  2. cat>>conf/zoo.cfg<<EOF

  3. tickTime=2000

  4. initLimit=10

  5. syncLimit=5

  6. clientPort=$PORT

  7. dataDir=/usr/local/zookeeper/data

  8. EOF


  9. if [ -n "$SERVER_ID" ]; then

  10. echo $SERVER_ID >> /usr/local/zookeeper/data/myid

  11. fi


  12. if [ -n "$SERVER_GROUP" ]; then

  13. for server in ${SERVER_GROUP[@]}; do

  14. echo "$server" >>conf/zoo.cfg

  15. done

  16. fi




  17. exec gosu zookeeper bin/zkServer.sh start-foreground

execbin/zkServer.sh start-foreground
使用前台进程运行zookeeper,因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了(或者转为后台运行),Docker容器也就退出了。

zookeeper集群需要在dataDir目录下创建myid,写入SERVER_ID,而且需要在配置文件中写入每个集群成员的通信信息。

docker-entrypoint.sh中将SERVERGROUP变量按空格分隔,将分隔后的结果写入到配置文件中。

编写一个docker-bin.sh,负责启动docker容器

  1. #!/bin/bash


  2. # 用空格连接集群成员通信信息

  3. server_group='';

  4. for i in `seq 1 3`; do

  5. server_group="${server_group}server.${i}=zk-${i}:2281:22281 "

  6. done

  7. # 删除server_group最后一个空格

  8. server_group=${server_group%?}


  9. sudo docker network create zk-net

  10. for i in `seq 1 3`; do

  11. sudo docker run -d --name zk-${i} --network zk-net --network-alias zk-$i -e SERVER_ID=$i -e SERVER_GROUP="$server_group" bin/zookeeper:3.5.7

  12. done

可以看到,写入配置文件的集群成员通信信息格式如下 server.(SERVER_ID)=(IP):(PORT1):(PORT2)
。其中第一个端口用来集群成员之间交换信息以及与Leader 服务器交换信息,第二个端口是在Leader不可用时专门用来选举新Leader的。

通过以下命令查看集群成员的状态

  1. sudo docker exec zk-1 bin/zkServer.sh status


通过zkCli.sh连接到zookeeper

  1. sudo docker exec -it zk-1 bin/zkCli.sh


文章转载自binecy,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论