文章目录

  • 背景
  • 手动部署流程
  • 编写脚本
  • 脚本重点
  • 运行脚本
  • 集群部署


背景

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

本文就来实现一个 Zookeeper 集群自动部署脚本。

手动部署流程

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 0=100.10.126.140:2888:3888,1=100.10.126.141:2888:3888,2=100.10.126.142:2888:3888

执行结果:

zookeeper集群开机自动启动 zookeeper集群启动脚本_zookeeper

集群部署

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

umCnxManager@677] - Cannot open channel to 0 at election address

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