之前有介绍过Zookeeper的安装部署(Zookeeper基础教程(二):Zookeeper安装),但是那里我是基于独立的虚拟机来实现部署的,这种部署方式适合线上集群部署。后来有几次想用一下Zookeeper,我就需要一次性启动好几台虚拟机,用完还得关闭虚拟机,否则占用内存,这样做甚是麻烦,而且几乎每次开启几台虚拟机之后,电脑内存瞬间爆满!后来也是突然冒出个想法,用Docker来做一个Zookeeper集群,只需要一台安装了Docker的虚拟机即可,这样安装的虚拟机开发测试使用是足够的。最近花点时间整理了一下这些东西,要求部署尽可能简单,随时可以启动停掉,发送给他人也可以很轻松的运行起一套zookeeper,以备临时只需。  

  首先,我们需要安装docker(参考:docker简单安装),当然,最简单粗暴的部署方式是先使用docker在同一网络下开几个容器,然后获取他们的IP,然后进入容器中,安装之前介绍的方法安装集群,这样部署是可行的,但是很繁琐。现在介绍Zookeeper官方推荐部署方式(参考:https://hub.docker.com/_/zookeeper)。

  首先,获取官方的Zookeeper镜像(先去喝杯茶,下载很慢!):  

    # 查找Zookeeper镜像
sudo docker search zookeeper
# 拉取Zookeeper镜像
sudo docker pull zookeeper

  

  接下来就是部署了。

  如果是单节点部署,只需要执行docker命令启动一个容器即可:  

    # 创建并启动容器
sudo docker run -d -p 2181:2181 -e "ZOO_MY_ID: 1" -e "ZOO_SERVERS: server.1=zoo1:2888:3888;2181" --name zoo zookeeper
# 停止并删除容器
sudo docker stop zoo && sudo docker rm zoo

  其中有两个环境变量:  

    ZOO_MY_ID:Zookeeper节点的Id
ZOO_SERVERS:Zookeeper节点列表,多个节点之间使用空格隔开

  如果是集群部署,我提供两种方式(下载链接: https://pan.baidu.com/s/1L0LinFZVwHL6J67TNDFH3w 提取码: jgah):

  Shell脚本部署集群

  官方推荐使用docker-compse,而我觉得使用命令行比较灵活,所以我写了一个shell脚本:  

  

#!/bin/bash

count=3                        #节点数
network_name="net-zoo" #集群所在网络名
client_port_start=2181 #集群绑定主机初始节点(不包括)
name_prefix="zoo" #集群容器名前缀 #停止
zookeeper_stop(){
for i in $(seq 1 $count); do
zoo_name="$name_prefix$i"
echo 停止容器:`sudo docker stop $zoo_name`
done
}
#启动
zookeeper_start(){
for i in $(seq 1 $count); do
zoo_name="$name_prefix$i"
echo 启动容器:`sudo docker start $zoo_name`
done
#打印集群信息
if [ -z "$client_servers" ];then
if [ -z "$local_ip" ];then
ips=(`/sbin/ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | tr -d "addr:" | tr '\n' ' '`)
index=${#ips[@]}
index=`expr $index - 1`
local_ip=${ips[$index]}
fi
for i in $(seq 1 $count); do
port=`expr $i + $client_port_start` # 客户端服务接口
if [ $i -eq $count ];then
client_servers="${client_servers}${local_ip}:${port}"
else
client_servers="${client_servers}${local_ip}:${port},"
fi
done
fi
echo 集群服务地址:$client_servers
}
#停止并移除
zookeeper_down(){
zookeeper_stop
for i in $(seq 1 $count); do
zoo_name="$name_prefix$i"
echo 删除容器:`sudo docker rm $zoo_name`
done
if [ "$1" != "network" ];then
echo 删除网络:`sudo docker network rm $network_name`
fi
}
#重新启动
zookeeper_restart(){
zookeeper_stop
zookeeper_start
}
#查看容器状态
zookeeper_status(){
sudo docker ps -a | grep "$name_prefix*"
}
#创建
zookeeper_create(){
net_exists=`sudo docker network ls | grep "$network_name"`
if [ -z "$net_exists" ];then
echo 创建网络:` sudo docker network create --driver bridge $network_name`
fi
for i in $(seq 1 $count); do
index=`expr $i + 1`
node="server.$i=$name_prefix$i:2888:3888;2181"
echo 节点:$node
if [ $i -eq 1 ];then
servers=$node
else
servers="$servers $node"
fi
done
for i in $(seq 1 $count); do
zoo_port=`expr $i + $client_port_start`
echo 创建容器:`sudo docker create -i --name $name_prefix$i --hostname $name_prefix$i --restart always -p $zoo_port:2181 -e "ZOO_MY_ID=$i" -e ZOO_SERVERS="$servers" --network $network_name zookeeper`
done
echo 创建完成
}
#创建并启动
zookeeper_up(){
zookeeper_create
zookeeper_start
} if [ ! -z "$1" ];then
zookeeper_$1 $2
exit 0
fi echo "
Usage: $0 COMMAND 可用命令:
start 启动集群
create 创建集群
stop 停止集群服务
up 创建并启动集群
down 停止并删除集群
status 查看集群容器节点信息
restart 重新启动集群"

zookeeper.sh

  您可以将上面的shell脚本复制到一个shell文件中,比如复制到一个名为zookeeper.sh的文件中,脚本内容很容易理解,开头有四个配置:

    count:集群节点数
network_name:集群所在网络名
client_port_start:集群绑定主机初始节点(不包括这个临界值)
name_prefix:集群容器名前缀

  然后赋予可执行权限或者直接以bash执行(不要使用dash或者sh命令执行):  

    # 添加可执行权限,不添加可执行权限则可直接使用 /bin/bash zookeeper.sh 执行,用dash或者sh命令可能会报错
sudo chmod +x zookeeper.sh
# 启动
./zookeeper.sh up
# 停止
./zookeeper.sh down

  比如我虚拟机IP:192.168.209.128,启动后:

  

  然后使用 192.168.209.128:2182,192.168.209.128:2183,192.168.209.128:2184 就可以连接到容器充的zookeeper了。

  docker-compose部署

  官方给出了docker-compose的部署方案,首先创建一个docker-compose.yml文件,内容如下:

# yaml 配置
version: '2'
services:
zoo1:
image: zookeeper
restart: always
ports:
- 2182:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
zoo2:
image: zookeeper
restart: always
ports:
- 2183:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
zoo3:
image: zookeeper
restart: always
ports:
- 2184:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

  这里有两点需要注意:

  1、ports是提供了客户端端口映射,外部要连接到容器中的zookeeper,需要使用主机的这个映射端口

  2、这里没有使用数据卷,而是直接使用的了环境变量作为配置,启动最主要的就是ZOO_MY_ID和ZOO_SERVERS两个(更多环境变量配置参考:https://hub.docker.com/_/zookeeper):  

    ZOO_MY_ID:节点ID
ZOO_SERVERS:集群节点地址,多个节点之间使用空格隔开

  说明一下,上面docker-compose.yml中的ZOO_SERVERS环境变量中的zoo1,zoo2,zoo3等表示的是service_name或者container_name,因为在同一网络下,因此容器可以使用service_name或者container_name互通,而不需要配置link或者hosts等。

  然后启动:  

    # 启动
sudo docker-compose up -d
# 停止
sudo docker-compose down

  比如我虚拟机IP:192.168.209.128,启动后:

  

  上面说道ports配置是端口映射,因此使用 192.168.209.128:2182,192.168.209.128:2183,192.168.209.128:2184 就可以连接到容器充的zookeeper了。

  

  总结

  1、使用shell脚本的好处就是可以更灵活,比如要拓展到5个节点的zookeeper集群,只需修改shell中的count变量值为5

  2、使用docker-compose部署相对来说说稍稳定,但是配置更繁琐

  3、使用docker部署zookeeper的做法只适合自己开发测试使用,生产不建议这么使用,因为如果一台服务宕机,会导致服务器上所有的zookeeper节点挂掉。

使用docker或者docker-compose部署Zookeeper集群的更多相关文章

  1. Docker部署zookeeper集群和kafka集群,实现互联

    本文介绍在单机上通过docker部署zookeeper集群和kafka集群的可操作方案. 0.准备工作 创建zk目录,在该目录下创建生成zookeeper集群和kafka集群的yml文件,以及用于在该 ...

  2. Docker 一步搞定 ZooKeeper 集群的搭建

    Docker 一步搞定 ZooKeeper 集群的搭建 背景 原来学习 ZK 时, 我是在本地搭建的伪集群, 虽然说使用起来没有什么问题, 但是总感觉部署起来有点麻烦. 刚好我发现了 ZK 已经有了 ...

  3. Docker swarm结合Openresty部署rabbitmq集群

    Docker swarm结合Openresty部署rabbitmq集群 大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的 ...

  4. 第十五章 部署zookeeper集群

    1.集群规划 主机名 角色 IP hdss7-11.host.com k8s代理节点1.zk1 10.4.7.11 hdss7-12.host.com k8s代理节点2.zk2 10.4.7.12 h ...

  5. Linux环境快速部署Zookeeper集群

    一.部署前准备: 1.下载ZooKeeper的安装包: http://zookeeper.apache.org/releases.html 我下载的版本是zookeeper-3.4.9. 2.将下载的 ...

  6. 在CentOS7部署zookeeper集群以及简单API使用

    一.部署zookeeper集群 zookeeper是一个针对大型分布式系统的协调系统,提供的功能有统一名称服务.分布式同步等. 1.上传zk安装包 2.解压     tar -xzvf zookeep ...

  7. ZooKeeper 01 - 什么是ZooKeeper + 部署ZooKeeper集群

    目录 1 什么是ZooKeeper 2 ZooKeeper的功能 2.1 配置管理 2.2 命名服务 2.3 分布式锁 2.4 集群管理 3 部署ZooKeeper集群 3.1 下载并解压安装包 3. ...

  8. k8s 上使用 StatefulSet 部署 zookeeper 集群

    目录 StatefulSet 部署 zookeeper 集群 创建pv StatefulSet 测试 StatefulSet 部署 zookeeper 集群 参考 k8s官网zookeeper集群的部 ...

  9. 使用 Docker 一步搞定 ZooKeeper 集群的搭建

    背景 原来学习 ZK 时, 我是在本地搭建的伪集群, 虽然说使用起来没有什么问题, 但是总感觉部署起来有点麻烦. 刚好我发现了 ZK 已经有了 Docker 的镜像了, 于是就尝试了一下, 发现真是爽 ...

随机推荐

  1. echo -e "\033[字背景颜色;字体颜色m字符串\033[0m

    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36m something here \033 ...

  2. linux 6.5 网卡

    启动网卡 ifup eth0 eth0:网卡名称 设置网卡开机启动 vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes

  3. 深入理解java动态代理机制

    动态代理其实就是java.lang.reflect.Proxy类动态的根据您指定的所有接口生成一个class byte,该class会继承Proxy类,并实现所有你指定的接口(您在参数中传入的接口数组 ...

  4. HTML样式 背景

    当浏览器读到一个样式表,就会按照这个格式表来对文档进行格式化.有以下三种方式来插入样式表: 1.外部样式表 当样式需要用到很多页面的时候,外部样式是理想的选择.使用外部样式表,就可以听过更改一个文件来 ...

  5. Linux下查看JDK安装路径

    在安装好Git.JDK和jenkins之后,就需要在jenkins中进行对应的设置,比如在全局工具配置模块,需要写入JDK的安装路径. 这篇博客,介绍几种常见的在Linux中查看JDK路径的方法... ...

  6. Linux:spool命令

    格式调整有以下参数: set echo on/off--是否显示脚本中的需要执行的命令 set feedback on/off--是否显示 select 结果之后返回多少行的提示 set linesi ...

  7. linux-源码软件管理-yum配置

    总结如下:1.源码配置软件管理2.配置yum本地源和网络源及yum 工作原理讲解3.计算机硬盘介绍 1.1 源码管理软件 压缩包管理命令: # 主流的压缩格式包括tar.rar.zip.war.gzi ...

  8. 降低制作门槛,人人都是3D“模”术师

    12月14日,HDD(Huawei Developer Day)深圳站圆满举办.国内3D扫描类开发团队看书击水为大家分享了与HMS Core 3D建模服务的合作之旅,讲述了如何通过3D物体建模能力为其 ...

  9. Decorator 模式转载

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://tianli.blog.51cto.com/190322/35287 摘要:本文深 ...

  10. 在【自定义列】中使用M函数(Power Query 之 M 语言)

    数据源: "品名"一列 目标: 提取品名中的首字符,生成新列:"品名简称" 解决方案: 在[自定义列]中使用M函数Text.Start 步骤: 打开[自定义列] ...