分布式项目一键发布脚本

1代码管理

目前我这边接触的是使用svn进行管理的项目,对于git管理的目前只接触了两个项目,经验不是很丰富,就不多说了。主要记录基于svn管理的代码发布。

cd 脚本目录
case $1 in
	条件1)
	svn co --username svn用户名--password svn密码 svn地址 ../svn/aiesb
        ;;
	条件2)
	ssvn co --username svn用户名--password svn密码 svn地址 ../svn/aopopr
	;;
	*)
	echo "请输入 条件1/条件2"
	;;
esac

2编译打包

目前使用的是ant进行编译打包,代码和配置分离的打包方式。需要基于ant
用xml进行配置。

<?xml version="1.0" encoding="UTF-8"?>

<project name="project" default="process">
	<property file="build.properties" />

	<target name="init">
		<delete dir="${build.tmp.dir}" />
		<delete dir="${build.dist.dir}" />
		<mkdir dir="${build.dist.dir}" />
		<mkdir dir="${build.tmp.dir}/${project.esb.name}" />
		<mkdir dir="${build.tmp.dir}/${project.esb.name}/classes" />
		<mkdir dir="${build.tmp.dir}/${project.esb.name}/config" />
		<mkdir dir="${build.tmp.dir}/${project.esb.name}/lib" />
	</target>

	<target name="compile_esb" depends="init">
		<echo message="Start Compile java - esb" />
		<javac fork="true" srcdir="${build.svn.dir}/aiesb/src;" destdir="${build.tmp.dir}/${project.esb.name}/classes" debug="true" debuglevel="lines,vars,source" nowarn="true" includeAntRuntime="no" failonerror="true" >
			<!--<compilerarg line="-encoding UTF-8 -J-Xms1024m -J-Xmx1024m"/>-->
			<classpath>		
                <fileset dir="${build.svn.dir}/aiesb/lib" includes="*.jar" /> 
				<fileset dir="${build.lib.dir}" includes="*.jar" />
			</classpath>
			<include name="**/*.*" />
			<!--<exclude name="test/**/*.*" />-->
			<!--<exclude name="**/test/*.*" />-->
			<exclude name="example/**/*.*" />
		</javac>
		
		<echo message="Compile Success" />

		<echo message="Generate compiled Class to jar" />
		<jar destfile="${build.dist.dir}/${project.esb.name}.jar">
			<fileset dir="${build.tmp.dir}/${project.esb.name}/classes">
				<include name="**/*.class" />
			</fileset>
		</jar>
		<echo message="Generate Jar Success" />
	</target>
		
	<target name="process" depends="compile_esb">
		<echo message="Copy File" />
		<copy todir="${build.tmp.dir}/${project.esb.name}/config">
			<fileset dir="${build.svn.dir}/aiesb/config" includes="**/*"/>
		</copy>

		<copy todir="${build.tmp.dir}/${project.esb.name}/config" overwrite="true">
			<fileset dir="${build.config.dir}/${project.esb.name}/config" includes="**/*"/>
		</copy>
		<echo message="config overwrite finished" />
		<!--<delete file="${build.tmp.dir}/${project.esb.name}/config/system/service/defaults.xml" />-->
		<delete file="${build.tmp.dir}/${project.esb.name}/config/system/isb/deployment.xml" />
		<!--<delete file="${build.tmp.dir}/${project.esb.name}/config/socketLog.properties" />--> 		
        <delete file="${build.tmp.dir}/${project.esb.name}/config/log4j.properties" />	
	
		<copy todir="${build.tmp.dir}/${project.esb.name}/lib">  
			<fileset file="${build.dist.dir}/${project.esb.name}.jar" />
			<fileset dir="${build.svn.dir}/aiesb/lib" includes="*.jar" /> 
			<!--<fileset dir="${build.lib.dir}" includes="tools.jar" />-->
		</copy>
		<jar destfile="${build.dist.dir}/${project.esb.name}_config.jar" basedir="${build.tmp.dir}/${project.esb.name}/config"/>
		<jar destfile="${build.dist.dir}/${project.esb.name}_lib.jar" basedir="${build.tmp.dir}/${project.esb.name}/lib"/>
	</target>
	
</project>

3可执行代码同步应用主机

使用rsync进行此操作。rsync的基本命令可以参考rsync同步介绍
rsync是基于ssh端口的,如果ssh不是默认端口会报错

#!/bin/bash

source ./ip.config

version=版本源地址/
todir=版本目标地址

user=${appuser}

case $1 in
        all)
        echo "all-- ${ips[@]} --"        
		for ip in ${ips[@]}; do
			echo "${ip} 开始同步版本"
			rsync -avz $version $user@$ip:$todir
		done        
        ;;
        BST)
        echo "BST-- ${BSTips[@]} --"
        for ip in ${BSTips[@]}; do
			echo "${ip} 开始同步版本"
			rsync -avz $version $user@$ip:$todir
		done
        ;;
        LC)
        echo "LC-- ${LCips[@]} --"
        for ip in ${LCips[@]}; do
			echo "${ip} 开始同步版本"
			rsync -avz $version $user@$ip:$todir
		done
        ;;
        JRY)
        echo "JRY-- ${JRYips[@]} --"
        for ip in ${JRYips[@]}; do
			echo "${ip} 开始同步版本"
			rsync -avz $version $user@$ip:$todir
		done
        ;;
        DMZ)
        echo "DMZ-- ${DMZips[@]} --"
        for ip in ${DMZips[@]}; do
			echo "${ip} 开始同步版本"
			rsync -avz $version $user@$ip:$todir
		done
        ;;
        test)
        echo "test-- ${testips[@]} --"
        for ip in ${testips[@]}; do
            echo "${ip} 开始同步版本"
            rsync -avz $version $user@$ip:$todir
            done
        ;;
        *)
        echo "请输入 all/BST/LC/JRY/DMZ"
        ;;
esac

echo '==aiesb version sync over=='

4rsync配合主机间的shh免密登录更容易移植

主机间的免密登录可以参考linux主机间的免密登录

5生成可运行的节点

可以在应用主机上预先写好生成节点的脚本genOpcfesb.sh,在发布机上通过免密登录,登录到应用主机上执行此脚本,根据同步过来的基础版本生成可以运行的节点。这一步需要根据实际需要编写个性化的脚本genOpcfesb.sh

#!/bin/bash

source ./ip.config

user=${appuser}

cmd="sh ${apphome}/sbin/genOpcfesb.sh"

case $1 in
        all)
        echo "all-- ${ips[@]} --"        
		for ip in ${ips[@]}; do
			echo "start generate opcfesb for ${ip} "
			ssh $user@$ip $cmd
		done        
        ;;
        BST)
        echo "BST-- ${BSTips[@]} --"
        for ip in ${BSTips[@]}; do
			echo "start generate opcfesb for ${ip} "
			ssh $user@$ip $cmd
		done
        ;;
        LC)
        echo "LC-- ${LCips[@]} --"
        for ip in ${LCips[@]}; do
			echo "start generate opcfesb for ${ip} "
			ssh $user@$ip $cmd
		done
        ;;
        JRY)
        echo "JRY-- ${JRYips[@]} --"
        for ip in ${JRYips[@]}; do
			echo "start generate opcfesb for ${ip} "
			ssh $user@$ip $cmd
		done
        ;;
        DMZ)
        echo "DMZ-- ${DMZips[@]} --"
        for ip in ${DMZips[@]}; do
			echo "start generate opcfesb for ${ip} "
			ssh $user@$ip $cmd
		done
        ;;
        test)
        echo "test-- ${testips[@]} --"
        for ip in ${testips[@]}; do
            echo "start generate opcfesb for ${ip} "
            ssh $user@$ip $cmd
        done
        ;;
        *)
        echo "请输入 all/BST/LC/JRY/DMZ"
        ;;
esac
echo "==genOpcfesb over=="

6启停脚本

根据ip列表和每台应用主机上预留的单主机全量启停脚本,通过ssh免密登录到ip列表中的每台主机进行此步操作。

start-opcfesb.sh
#!/bin/bash

source ./ip.config

user=${appuser}
cmd="sh ${apphome}/sbin/start_all.sh"

case $1 in
        all)
        echo "all-- ${ips[@]} --"        
		for ip in ${ips[@]}; do
			echo "开始启动 ${ip}"
			ssh $user@$ip $cmd
		done        
        ;;
        BST)
        echo "BST-- ${BSTips[@]} --"
        for ip in ${BSTips[@]}; do
			echo "开始启动 ${ip}"
			ssh $user@$ip $cmd
		done
        ;;
        LC)
        echo "LC-- ${LCips[@]} --"
        for ip in ${LCips[@]}; do
			echo "开始启动 ${ip}"
			ssh $user@$ip $cmd
		done
        ;;
        JRY)
        echo "JRY-- ${JRYips[@]} --"
        for ip in ${JRYips[@]}; do
			echo "开始启动 ${ip}"
			ssh $user@$ip $cmd
		done
        ;;
        DMZ)
        echo "DMZ-- ${DMZips[@]} --"
        for ip in ${DMZips[@]}; do
			echo "开始启动 ${ip}"
			ssh $user@$ip $cmd
		done
        ;;
        test)
        echo "test ${testips[@]} "
        for ip in ${testips[@]}; do
             echo "开始启动 ${ip}"
             ssh $user@$ip $cmd
        done
        ;;
        *)
        echo "请输入 all/BST/LC/JRY/DMZ"
        ;;
esac

echo '==start over=='
stop-opcfesb.sh
#!/bin/bash

source ./ip.config

user=${appuser}
cmd="sh ${apphome}/sbin/stop_all.sh"

case $1 in
        all)
        echo "all-- ${ips[@]} --"        
		for ip in ${ips[@]}; do
			echo "开始停 ${ip}"
			ssh $user@$ip $cmd
		done        
        ;;
        BST)
        echo "BST-- ${BSTips[@]} --"
        for ip in ${BSTips[@]}; do
			echo "开始停 ${ip}"
			ssh $user@$ip $cmd
		done
        ;;
        LC)
        echo "LC-- ${LCips[@]} --"
        for ip in ${LCips[@]}; do
			echo "开始停 ${ip}"
			ssh $user@$ip $cmd
		done
        ;;
        JRY)
        echo "JRY-- ${JRYips[@]} --"
        for ip in ${JRYips[@]}; do
			echo "开始停 ${ip}"
			ssh $user@$ip $cmd
		done
        ;;
        DMZ)
        echo "DMZ-- ${DMZips[@]} --"
        for ip in ${DMZips[@]}; do
			echo "开始停 ${ip}"
			ssh $user@$ip $cmd
		done
        ;;
        test)
        echo "test ${testips[@]} "
        for ip in ${testips[@]}; do
             echo "开始停 ${ip}" 
             ssh $user@$ip $cmd
        done
        ;;
        *)
        echo "请输入 all/BST/LC/JRY/DMZ"
        ;;
esac

echo "==stop over=="
ip.config
#!/bin/bash

#应用主机用户
appuser=应用主机用户
apphome=应用主机HOME目录全路径

testips=(ip1 ip2 ip3)

refreships=(ip1 ip2 ip3)

#所有应用主机
ips=(ip1 ip2 ip3 ip4 ip5 ip6 ip11 ip12 ip13 ip14 ip15 ip16)
#按照中心分
BSTips=(ip1 ip2 ip3 ip4 ip5 ip6)
LCips=(ip11 ip12 ip13 ip14 ip15 ip16)
#按照归属域分
JRYips=(ip4 ip5 ip6)
DMZips=(ip14 ip15 ip16)

7将涉及到的每个步骤合并形成一键发布脚本

#!/bin/bash

input=$1
if [ ! -n "$1" ]; then
    echo "请输入 all/BST/LC/JRY/DMZ"
    exit -1
fi

echo "inputParam is ${input}"
# 代码拉取
sh check_svn.sh 条件1
# 编译
sh create-esb.sh
# 将编译后的jar整理成基础版本
sh preAiesb.sh

sh rsync-aiesb.sh $input

sh stop-opcfesb.sh $input

sh gen-opcfesb.sh $input
# 睡眠足够长时间,让连接释放,单位秒s
sleep 120

sh start-opcfesb.sh $input

8节点健康状态检查

按端口进行检测,根据实际情况修改

#!/bin/bash

source ./ip.config

user=${appuser}
cmd="netstat -na|grep 700 | grep 'LISTEN' | wc -l"

for ip in ${ips[@]}; do
    echo "${ip} LISTEN PORT Nums:"
    ssh $user@$ip $cmd
done 

9一键缓存刷新

根据实际情况编写,我的思路是在同一个域中只互相连通的主机中取一台作为刷新机,在该台主机上预留刷新整个域的刷新脚本,刷新整个域,所以有几个域就配置几个刷新机就可以了,不用每台都登录上去执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop是一个开源的分布式计算框架,用于处理大规模数据集的存储和处理。它提供了一个可靠的、可扩展的分布式系统,能够在大量普通计算机的集群上运行。为了方便用户启动Hadoop集群,开发者编写了一键启动脚本。 Hadoop一键启动脚本的作用是简化Hadoop集群的启动过程。用户只需要运行这个脚本,就能够自动完成所有必要的设置和启动步骤,而不需要手动逐一执行命令和配置文件。一键启动脚本通常会检查系统环境和配置文件,确保一切准备就绪,然后根据用户的需求启动特定的Hadoop服务和组件。 一键启动脚本通常括以下几个主要步骤: 1. 检查系统依赖:脚本会检查系统环境,括操作系统、Java版本等,确保满足Hadoop运行的最低要求。 2. 配置文件检查:脚本会检查Hadoop配置文件,如core-site.xml、hdfs-site.xml等,确保配置正确且完整。 3. 启动服务:根据用户输入的命令,脚本会启动相应的Hadoop服务,如启动HDFS、启动YARN等。在启动过程中,脚本会在终端显示详细的启动日志,方便用户查看和调试。 4. 验证启动:脚本会检查Hadoop集群的启动状态,确认所有服务均已成功启动。如果有错误或异常,脚本会显示相关错误信息,并提供解决方案。 总之,Hadoop一键启动脚本能够极大地简化Hadoop集群的部署和启动过程,提高用户的使用效率和便利性。用户只需准备好必要的配置文件和环境,然后运行一键启动脚本,即可轻松启动Hadoop集群。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值