天天看点

启动zookeeper_Shell应用:Zookeeper集群一站式安装脚本背景手动部署流程编写脚本脚本重点运行脚本集群部署

背景

Kafka 作为一个比较流行的消息中间件,它的集群部署是依赖于 Zookeeper 的,所以集群部署的第一步就是部署 Zookeeper 集群,并记录 Zookeeper 集群信息,将其作为 server.properties 配置中 zookeeper.connect 的值。

本文就来实现一个 Zookeeper 集群自动部署脚本。Apache 旗下有很多应用都是这类需要解压、配置、启动的,如果能统一提供一个脚本那就太好了,因为这些看似简单的部署操作,弄多了也很折磨人呐!既然没有,就自己动手吧!

手动部署流程

Zookeeper 部署流程,还是比较简单的:

  1. 上传 Zookeeper 部署包
  2. 解压
  3. 修改操作系统配置文件,添加 ZK_HOME 环境变量
  4. 创建 Zookeeper 启动配置文件 zoo.cfg
  5. 修改 zoo.cfg 配置
  6. 创建 myid 文件,其值与 5 配置的 server.id 一致
  7. 执行启动脚本 zkServer.sh

这是手动部署的基本流程,虽然并不复杂,但是这一堆操作在部署多个节点的时候,还是挺繁琐的。所以需要一个一站式的部署脚本,脚本参数如下:

  1. baseDir 部署包目录
  2. dataDir 数据文件目录
  3. myid 值
  4. server 集群通信配置,用逗号分隔

编写脚本

根据部署流程,编写 zk 安装脚本如下:

#接收参数

basePath=$1

dataDir=$2

myId=$3

serverInfos=$4

#解压 zk

cd $basePath

tar -zxvf apache-zookeeper-3.5.5-bin.tar.gz

mv apache-zookeeper-3.5.5-bin zookeeper

#修改系统配置文件

echo "export ZK_HOME=$basePath/zookeeper">>/etc/profile

echo 'export PATH=$ZK_HOME/bin:$PATH'>>/etc/profile

. /etc/profile

#配置 zoo.cfg,dataDir 需要转义 / 后使用 sed 替换

dataDir=$basePath/zookeeper/$dataDir

translate=${dataDir/}

echo 'dataDir is'$dataDir

cd $basePath/zookeeper/conf

cp zoo_sample.cfg zoo.cfg

sed -i -c "s/dataDir=.*/dataDir=${translate}/i" zoo.cfg

#解析 serverInfo 成每个配置,添加到 zoo.cfg

serverArray=(${serverInfos//,/ })

for var in ${serverArray[@]}

do

echo "server."$var >> zoo.cfg

done

#创建集群的 myid 文件,并将本机的 myid 值写入

mkdir $dataDir

cd $dataDir

touch myid

echo $myId >> myid

#进入 bin 目录,启动 zk

cd $basePath/zookeeper/bin

sh zkServer.sh stop

sh zkServer.sh start

sh zkServer.sh status

脚本重点

脚本本身并不复杂,但是测试了十几遍才成功,复盘自动化脚本实现的要点如下:

  1. 根据 sample 配置文件,修改实际的配置信息时,使用 sed 命令直接替换文件内容
  2. 防火墙必须为机器通信端口放行,否则集群模式下启动不会成功
  3. myid 的内容必须与本机 IP 对应的 server.id 值一致
  4. 启动 zkServer.sh 之前先 stop 一下,防止端口被占用
  5. 修改 dataDir 配置时,使用 sed 替换目录需要转义 / 字符 ${dataDir/}

运行脚本

参数列表:

1./home/myzk 部署包所在目录

2. data zk 数据文件相对 zookeeper 目录的相对路径

3. 0 当前 zk 节点的编号

4. 0=100.10.126.140:2888:3888,1=100.10.126.141:2888:3888,2=100.10.126.142:2888:3888 server.id=IP 等集群节点配置信息,用逗号分隔

启动命令:

sh installzk.sh

/home/myzk

data

0=100.10.126.140:2888:3888,1=100.10.126.141:2888:3888,2=100.10.126.142:2888:3888

执行结果:

启动zookeeper_Shell应用:Zookeeper集群一站式安装脚本背景手动部署流程编写脚本脚本重点运行脚本集群部署

集群部署

批量部署三台集群时,只需要顺次执行安装脚本即可。但是 ZooKeeper 部署集群时会有一个选举动作,但是首次部署时由于节点是依次启动的,第一个、第二个节点启动的时候,是无法跟另外未启动的节点进行选举通信的,因此会在启动日志中看到如下异常信息:

[email protected]] - Cannot open channel to 0 at election address

此外 zk.Server.sh status 提示 zookeeper 可能未启动,实际上 zookeeper 进程是存在的,不需要关注这个集群选举异常。当所有节点都启动、且等待一段时间通信稳定后, status 命令就能正常使用了。