同一服务器上多个相同部署脚本并行执行引发错误

引言

最近一直遇到部署游戏业务代码时,部署包文件解压后文件不完整的情况,起初认为是批量部署机器数量太多,导致下载的部署包不完整, 于是在部署脚本上添加检查部署包是否完整,确实有部分部署错误是这种情况,但之后还是有提示成功,但实际部署包文件解压后文件还是不完整。 之前并没有遇到这种情况,经之前遇到过此情况的同事反映,原因在于同一个服务器上多个部署脚本并行执行的原因。下面详细说明下。

同一服务器上多个相同部署脚本并行执行引发错误

我们批量部署游戏服,在量大的时候,会在同一个服务器上部署多个区服,也就是有多个程序目录,部署脚本通过 Salt Master 传递到要部署的服务器上。 部署脚本中有下载部署包和解压部署包的过程。
在同一个服务器上有 2 个部署脚本并行执行,会出现这种情况:
2 个部署脚本分别执行到下载部署包,但时间上有先后,都没有下载完, 当第 1 个部署脚本执行完下载部署包后执行解压的过程中,此时第 2 个部署脚本并没有下载完成部署包, 这会覆盖掉刚才第一个部署脚本下载完的部署包,
覆盖掉的包是不完整的,此时第 1 个部署脚本解压使用的是这个不完整的包。于是就出现了最前面提到的问题。

解决方案

  1. 我首先想到的是对解压命令执行成功与否进行判断,解压是用 tar 命令,如果要解压的包是不完整的,应该会返回非零值的。
  2. 把部署包不要放在同一个目录下,这样就不会出现覆盖的情况了,上面的情况是放在同一个目录下了。
  3. 公司的同事使用了一个脚本正在执行中的标记方法,一个部署脚本如果执行了,就不让另外一个部署脚本继续执行下去,直到第一个部署脚本执行完成。

关键代码如下:

while true
do
    if [ -f $MARK_INSTALL ]
    then
        sleep 20s
    else
        echo "install $PID-$SID" > $MARK_INSTALL
        break
    fi
done