线上环境中并不能一台一台机器的部署,因此简单的写了一版zookeeper的自动化部署脚本,在实验室的各个项目中都运行良好,为实验室带来了诸多方便。
功能简介
1. 初始化ip数组,
2. 在第一台ip服务器上运行main.sh
3. 运行过程输入ssh连接其它ip的密码
4. 即可以完成整个zookeeper部署
文件说明
1) Main.sh为主执行文件
2) Need.sh和gz为复制到第一台服务器上的附属文件
具体步骤
(一)在main.sh 第34行 ip_array数组是所有需要搭建zookeeper的ip,请填入初始化,第一个ip是你将执行第二步,请先确定,然后初始化
(二)复制文件Need.sh和压缩包gz到第一个ip服务器上的root目录下
(三)在任意目录,执行main.sh 文件
备注
为了防止端口冲突,
l 修改了zk服务器进程的端口(见main.sh 第50行,)因此当调用API,连接zookeeper的时候,注意修改端口,如:./zkCli.sh -server 10.0.6.201:56557
l 修改了follow和leader通信的端口,选取leader的端口(见main.sh 第57行)
这个对API无影响
l Netstat -anlp | grep java
l //根据对应的端口找到对应的进程号
l Kill -9 进程号
l Killall java
l Jps
l //找到zookeeper对应的服务的进程号(16807 QuorumPeerMain),然后kill,免得有进程的端口冲突。
附录
main.sh
#!/bin/bash
#判断jdk是否安装,默认安装,1.6以上版本
java -version
#在本机上建立必要的文件夹,如果存在相同的文件夹,将删除
zk_root=/home/duizhun/zookeeper
if [ -d $zk_root ];then
echo "$zk_root is exist!";rm -r $zk_root
fi
mkdir -p $zk_root
chmod -R 755 $zk_root
zk_data_path=/tmp/zookeeper
if [ -d $zk_data_path ];then
echo "$zk_data_path is exist!";rm -r $zk_data_path
fi
mkdir -p $zk_data_path
chmod -R 755 $zk_data_path
echo 1 > $zk_data_path/myid
zk_log_path=/tmp/zookeeper/log
if [ -d $zk_log_path ];then
echo "$zk_log_path is exist!";rm -r $zk_log_path
fi
mkdir -p $zk_log_path
chmod -R 755 $zk_log_path
#变量定义,第一个为本机ip,后面为集群其它ip
ip_array=("10.0.6.80" "10.0.6.81" "10.0.6.83")
ip_num=${#ip_array[@]}
# zookeeper-3.3.6.tar.gz need.sh上传到root目录下
zk_new_root=$zk_root/zookeeper-3.3.6
echo $zk_new_root
conf_file=$zk_new_root/conf/zoo.cfg
echo $conf_file
cd /home/duizhun/
#解压zookeeper-3.3.6包,如果有,覆盖
tar -xvf /home/duizhun/zookeeper-3.3.6.tar.gz -C $zk_root
#写配置文件信息
echo "tickTime=2000" > $conf_file
echo "dataDir=$zk_data_path" >> $conf_file
echo "dataLogDir=$zk_log_path" >> $conf_file
echo "clientPort=56557" >> $conf_file
echo "initLimit=5" >> $conf_file
echo "syncLimit=2" >> $conf_file
for((index=0;index<$ip_num;index++))
{
tmp=$[$index+1]
echo "server.$tmp=${ip_array[index]}:37423:54423" >> "$conf_file"
}
#创建ssh无密码登陆的文件
user="root"
id_res_pub=~/.ssh/id_rsa.pub
if [ ! -f "$id_res_pub" ];then
ssh-keygen -t rsa
else
echo "id_rsa.pub is exist!"
fi
#本地通过ssh远程命令,在远程服务器上执行脚本,以及命令(need.sh 先上传到其它服务器)
remote_cmd_run_need="chmod a+x /home/duizhun/need.sh;cd /home/duizhun/;./need.sh;service iptables stop"
for((index=1;index<$ip_num;index++))
{
cat ~/.ssh/id_rsa.pub | ssh $user@${ip_array[index]} 'cat >> .ssh/authorized_keys'
#rsync -avz --progress /root/need.sh $user@${ip_array[index]}:/root
#-progress 查看复制进程 -avzu 增量备份
echo "copy zookeeper file for remote zookeeper ,please wait"
scp -r /home/duizhun/need.sh $user@${ip_array[index]}:/home/duizhun/
#-r 覆盖
tmp=$[$index+1]
remote_cmd_add_myid="echo $tmp > $zk_data_path/myid"
#远程执行多条命令时,一定要加“” 不然不会执行 例如 "$remote_cmd_run_need"
ssh $user@${ip_array[index]} "$remote_cmd_run_need"
ssh $user@${ip_array[index]} $remote_cmd_add_myid
echo "copy shell for remote running ,please wait"
scp -r $zk_new_root $user@${ip_array[index]}:$zk_root
}
#启动zookeeper
remote_cmd_run_zk="cd $zk_new_root/bin;./zkServer.sh;./zkServer.sh start"
remote_cmd_status="cd $zk_new_root/bin;./zkServer.sh restart;./zkServer.sh status"
for((index=0;index<$ip_num;index++))
{
echo "*********************************************************"
echo "${ip_array[index]} test to run zookeeper";
if [ $index -eq 0 ];then
cd $zk_new_root/bin;./zkServer.sh;./zkServer.sh start
#$remote_cmd_run_zk #error,不会执行
else
ssh $user@${ip_array[index]} "$remote_cmd_run_zk"
echo "*********************************************************"
fi
}
#测试zookeeper安装是否成功,成功则返回状态(leader或者follower),不成功则报错
for((index=0;index<$ip_num;index++))
{
echo "*******************************************************"
echo "${ip_array[index]} test zookeeper status";
if [ $index -eq 0 ];then
cd $zk_new_root/bin;./zkServer.sh restart;./zkServer.sh status
else
ssh $user@${ip_array[index]} "$remote_cmd_status"
fi
echo "******************************************************"
}
need.sh
#!/bin/bash
#java -version
zk_root=/home/duizhun/zookeeper
# no space
if [ -d $zk_root ];then
echo "$zk_root is exist!";rm -r $zk_root
fi
mkdir -p $zk_root
chmod -R 755 $zk_root
zk_data_path=/tmp/zookeeper
if [ -d $zk_data_path ];then
echo "$zk_data_path is exist!";rm -r $zk_data_path
fi
mkdir -p $zk_data_path
chmod -R 755 $zk_data_path
zk_log_path=/tmp/zookeeper/log
if [ -d $zk_log_path ];then
echo "$zk_log_path is exist!";rm -r $zk_log_path
fi
mkdir -p $zk_log_path
chmod -R 755 $zk_log_path