使用docker或者docker-compose部署Zookeeper集群
之前有介绍过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集群的更多相关文章
- Docker部署zookeeper集群和kafka集群,实现互联
本文介绍在单机上通过docker部署zookeeper集群和kafka集群的可操作方案. 0.准备工作 创建zk目录,在该目录下创建生成zookeeper集群和kafka集群的yml文件,以及用于在该 ...
- Docker 一步搞定 ZooKeeper 集群的搭建
Docker 一步搞定 ZooKeeper 集群的搭建 背景 原来学习 ZK 时, 我是在本地搭建的伪集群, 虽然说使用起来没有什么问题, 但是总感觉部署起来有点麻烦. 刚好我发现了 ZK 已经有了 ...
- Docker swarm结合Openresty部署rabbitmq集群
Docker swarm结合Openresty部署rabbitmq集群 大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的 ...
- 第十五章 部署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 ...
- Linux环境快速部署Zookeeper集群
一.部署前准备: 1.下载ZooKeeper的安装包: http://zookeeper.apache.org/releases.html 我下载的版本是zookeeper-3.4.9. 2.将下载的 ...
- 在CentOS7部署zookeeper集群以及简单API使用
一.部署zookeeper集群 zookeeper是一个针对大型分布式系统的协调系统,提供的功能有统一名称服务.分布式同步等. 1.上传zk安装包 2.解压 tar -xzvf zookeep ...
- ZooKeeper 01 - 什么是ZooKeeper + 部署ZooKeeper集群
目录 1 什么是ZooKeeper 2 ZooKeeper的功能 2.1 配置管理 2.2 命名服务 2.3 分布式锁 2.4 集群管理 3 部署ZooKeeper集群 3.1 下载并解压安装包 3. ...
- k8s 上使用 StatefulSet 部署 zookeeper 集群
目录 StatefulSet 部署 zookeeper 集群 创建pv StatefulSet 测试 StatefulSet 部署 zookeeper 集群 参考 k8s官网zookeeper集群的部 ...
- 使用 Docker 一步搞定 ZooKeeper 集群的搭建
背景 原来学习 ZK 时, 我是在本地搭建的伪集群, 虽然说使用起来没有什么问题, 但是总感觉部署起来有点麻烦. 刚好我发现了 ZK 已经有了 Docker 的镜像了, 于是就尝试了一下, 发现真是爽 ...
随机推荐
- Oracle SQL中join方式总结
在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图.物化视图等联结).SQL JOIN其实是一个逻辑概念,像NEST LOOP JOIN. HASH JOIN等 ...
- [MySQL实战-Mysql基础篇]-mysql架构
1.基本组成 下面是mysql的基本架构示意图 图一 图二 我们可以从图上看出,mysql大体分为两个部分,一个是server层,另一个是引擎层. server层中包含了连接器.查询缓存.分析器.优 ...
- IOS开发入门教程-总结篇-写给狂热的编程爱好者们
程序发轻狂,代码阑珊,苹果开发安卓狂!--写给狂热的编程爱好者们 写在前面的话 学习iOS应用程序开发已有一段时间,最近稍微闲下来了,正好也想记录一下前阶段的整个学习过程.索性就从最基础的开始,一步一 ...
- 关于某 App 请求参数 sign 字段加密分析
受害者: 6ZqG5LyX5pWw5o2u 通过 Charles 抓包发现关键信息请求均携带 sign 参数,且每次请求的值都不一样: 使用 jadx 将对应的 apk 反编译并分析,全局搜素 &qu ...
- 虚拟机+OS系统安装+Xshell
安装虚拟机 1.先下载好VMware Workstation.exe的安装包(最好直接下载破解版(非最新版) 在此私人网址不公布 可直接百度 资源很多) 2.直接下一步 直到安装完成(注意最好不要装在 ...
- Linux驱动实践:一起来梳理中断的前世今生(附代码)
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- 拆分行(Power Query 之 M 语言)
数据源: 略 目标: 将指定列拆分为行 操作过程: 选取指定列>[主页](或[转换])>[拆分列]>[按分隔符]/[按字符数]/[按位置]>高级选项>拆分为[行] M公式 ...
- Java8 函数式接口 @FunctionalInterface以及常用Consumer<T>、Supplier<T>、Function<T, R>、Predicate<T>总结
首先看看什么是Lambda 表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样传递):最简单的Lambda表达式可由逗号分隔的参数列表.-> ...
- LuoguP5690 [CSP-S2019 江西] 日期 题解
Content Alice 在纸上写下了一个日期,形式为 \(\text{MM-DD}\),其中 \(\text{MM}\) 与 \(\text{DD}\) 都是两位数字,分别表示月和天,然而这个日期 ...
- 选课系统V1.0
tree . . ├── bin │ ├── __init__.py │ └── start.py #启动文件 ├── conf │ ├── __init__.py │ └── set ...