这里有一点奇怪的问题!简要说明:
但是,为了能够以任何顺序或者同时提供这些框,我想尝试实现某种网络锁存信号量选择类型的东西,这个想法是:
同样,在步骤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进程。我只是想知道是否有人之前做过类似的事情。
答案 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>
...在所有节点上都可以是相同的。这主要实现了我想要的,尽管仍有一些情况可能会出错!