如何编写等待群集中其他节点的bash脚本?

时间:2014-07-10 12:51:34

标签: bash unix concurrency cluster-computing

这里有一点奇怪的问题!简要说明:

  • 我正在尝试编写一个安装脚本来在多个节点上自动安装mysql集群
  • 我有一个运行的脚本,如果所有mcm守护进程尚未启动,则退出(代码0)。这很好。
  • 最终节点上的运行执行群集设置。

但是,为了能够以任何顺序或者同时提供这些框,我想尝试实现某种网络锁存信号量选择类型的东西,这个想法是:

  1. 节点A出现,检测到B和C上缺少守护进程,然后等待。
  2. 节点B出现,检测到C上缺少守护进程,然后等待。
  3. 节点C出现,找到所有守护进程,然后(通过一些启发式)告诉其他人退出并继续进行配置。
  4. 同样,在步骤3中,任何其他节点都可以被选为“领导者”并配置群集,告诉其他人退出。

    我需要的是某种机制(可能是一个监听netcat套接字?),它阻止脚本直到其他人准备就绪,然后可以杀死其他脚本继续自己运行。

    这在bash中是否可行,或者我应该将我的脚本转换为Python?

    <小时/> 编辑:

    目前,我的基本节点间通信就像这样简单:

    for node in ${nodelist[@]}
    do
        nc -z -w 1 $node 1862 || failure=1
        [ ! -z $failure ] && echo "mcmd on $node not listening!" && exit 0
    done
    
    ## Begin cluster configuration process...
    

    但是,这需要我在其他一切都启动后启动最终节点。 正如我所说,这很好,但我想(更像是一个学术练习)是否有某种方式我可以做一个简单的“选举”类型过程来进行配置。

    此刻,我倾向于一个等待特定命令的侦听netcat进程。我只是想知道是否有人之前做过类似的事情。

1 个答案:

答案 0 :(得分:1)

我最终实现这个的方式仍然没有完全解决竞争条件,但允许我在所有节点上运行相同的命令(而不是决定在哪个节点上运行安装后脚本)。 / p>

我现在有:

failure=""
for node in ${nodelist[@]}
do
    # check for mcmd service
    nc -z -w 1 $node 1862 || failure=1
done
if [ ! -z $failure ]
then
    echo "Waiting for nodes..."
    nc -l 6688 >/dev/null
    echo "Told to quit."
    exit 0
fi
## This block runs IFF all hosts listening on 1862.
for node in ${nodelist[@]}
do
    echo "quit" | nc -w 1 $node 6688 || echo "No process waiting on $node."
done

## Begin cluster configuration process...

如果节点没有在服务套接字上侦听(1862),那么(总的来说)是打开套接字。这会阻止执行直到套接字关闭,这只会在所有节点都启动后才会发生。

这意味着我可以将我的安装过程运行为:

rpm -Uvh my-custom-package.rpm && sudo /path/to/config_cluster.sh <args>

...在所有节点上都可以是相同的。这主要实现了我想要的,尽管仍有一些情况可能会出错!