分布式系统方案中,集群主机数量到达一定程度后,如果还是单独的一个一个远程登陆配置会变得十分棘手。推荐两种方案:1.使用clusterShell软件配置分组,只需要在一台主机上统一的发送指令,其他主机都会执行,十分便捷。2.有时候启动的命令行一大堆,可以自己写shell去管理所有集群机子上。
自定义shell脚本
1.首先创建自定义的脚本script.sh文件
vim /home/script.sh
2.编写脚本内容
#!/bin/bash
echo "hello shell!"
wq!保存后,赋予可执行权限:输入 chmod +x /home/script.sh
再次查看script.sh 就会变成深色,代表这是可执行的
示例编写zookeeper启动shell
#!/bin/bash
#在 /etc/hosts加入对于集群的host IP,shell中小挂号包裹代表数组,数组元素之间用空格分开
host=(storm1 storm2 storm3 storm4 storm5)
#echo 输出执行的信息
echo "start zookeeper"
#for 循环遍历执行所有的集群主机
for i in ${!host[@]}
do
#需要配置ssh免密登录
ssh ${host[$i]} "source /etc/profile;cd /tmp/zookeeper/datalog/&&nohup zkServer.sh start >/dev/null 2>&1 &"
#如果某一台需要单独启动点东西,可以通过if then 去处理
if (($i==0));then
echo "第一个与众不同"
fi
#if的end标准为 fi
#echo "i=$i host[$i]=${host[$i]}"
#for循环的结束标志为done
done
解释:
- 如果需要用到环境变量(/etc/profile)中配置的$PATH的路径,比如jdk和这里的zkServer.sh脚本,需要在使用前执行
source /etc/profile
以让环境变量可用,否则会报路径找不到的错误。 - 由于zk默认配置下启动会在当前路径下生成一个zk.out的文件,所以进入专门存放zk日志的目录下。
- nohup启动可以保证即使关闭shell命令窗口,也能在后台执行,但无法ctrl +c会中止运行。而末尾的& 也是在后台执行,并且是立即在后台开启一个专门的线程启动,不会受到ctrl+c的影响,但是关闭shell命令窗口,也就是当前登录用户推出后,后台线程会中止。因此需要将两者配合启动即:
nohup +指令 +>/输出日志路径 2>&1 +&
,值得注意的是nohup指令必须要指定输出日志,这个日志是启动shell脚本本身会打印输出的内容。比如jar启动的话,就是控制台输出的那些日志。如果日志本身不值得关注,使用 路径/dev/null,把日志丢到不可回收的黑洞中。
示例编写kafka启动shell
#!/bin/bash
host=(storm1 storm2 storm3 storm4 storm5)#在 /etc/hosts加入对于集群的host IP
echo "start kafka"
for i in ${!host[@]}
do
#这里没有用到环境变量,应为kafka默认配置下需要指定server.properties的路径path=/home/storm$[$i+1]/distribute/kafka
echo "nohup $path/bin/kafka-server-start.sh -daemon $path/config/server.properties >/dev/null 2>&1 &"
ssh ${host[$i]} "nohup $path/bin/kafka-server-start.sh -daemon $path/config/server.properties >/dev/null 2>&1 &"
#echo "i=$i host[$i]=${host[$i]}"
done
示例编写storm启动shell
#!/bin/bash
host=(storm1 storm2 storm3 storm4 storm5)
echo "start storm"
for i in ${!host[@]}
do
ssh ${host[$i]} "source /etc/profile;nohup storm supervisor >/tmp/storm/storm.log 2>&1 &"
ssh ${host[$i]} "source /etc/profile;nohup storm logviewer >/tmp/storm/storm.log 2>&1 &"
if (($i==0));then
echo "start nimbus……"
ssh ${host[$i]} "source /etc/profile;nohup storm nimbus >/tmp/storm/storm.log 2>&1 &"
echo "start storm UI"
ssh ${host[$i]} "source /etc/profile;nohup storm ui >/tmp/storm/storm.log 2>&1 &"
fi
#echo "i=$i host[$i]=${host[$i]}"
done
这里需要第一个主机为nimbus并且启动UI则只需要加个判断即可。