我有一个我管理的集群,不时我会收到来自每个节点(和头节点)的电子邮件,请求在自动升级后重新启动。
目前,迄今为止我最好的解决方案是如下的 shell 脚本:
$> cat cluster_reboot.sh
ssh [email protected] reboot
ssh [email protected] reboot
ssh [email protected] reboot
ssh [email protected] reboot
ssh [email protected] reboot
ssh [email protected] reboot
我最终只需输入六次 root 密码,但我想这有效。有没有更好的方法?我可以强制头节点重新启动计算机吗?
更新:我不想让用户使用无密钥登录root
......但这是一种肯定有效的方法。
更新 2:密钥对可能还是有用的。那么,先用密钥登录到头节点,再用无密钥从头节点登录到所有计算节点,效果如何呢?然后类似以下内容:
$> ssh root@headnode
Enter password for 'root':
[<headnode>]$: cat cluster_reboot.sh
ssh [email protected] reboot
ssh [email protected] reboot
ssh [email protected] reboot
ssh [email protected] reboot
ssh [email protected] reboot
echo "Nodes rebooted. Rebooting this computer now."
reboot
[<headnode>]$: sh cluster_reboot.sh
"Nodes rebooted. Rebooting this computer now."
我认为这可能是安全+简单的解决方案。
答案1
也许,采取一种检查和观察的系统可能对你也有效?
假设您在头节点上运行某种 HTTP 服务器,您可以编写一个小型 php/perl/whatever 脚本来标记哪些计算机可以重新启动。
然后,在每个节点上,放置一个 cron 作业来轮询该脚本,以查看是否可以重新启动。如果头节点发回 ok,则应该重新启动。一旦头节点发送了 ok-to-reboot 命令,它就可以清除该标志。
我会使用包含一些文本文件的目录进行设置,如果脚本看到名称,则发回 ok 以重新启动,然后删除文件。管理起来很容易,因为您只需触摸它们即可标记 ok。安全,因为您永远不必将任何信息直接传递给文件系统。
子节点上的每个脚本只需通过主机名或其他内容进行检查;
每 5 分钟左右检查一次应该不会太费力。
答案2
配置 SSH 以使用基于证书的身份验证。然后使用如下命令:
$ for h in node1 node2 node3 node4 node5 headnode; do
> ssh root@$h reboot
> done
答案3
我建议为集群设置带外管理。这样,即使盒子脱离网络,您也可以访问控制台,远程重启机器也很容易。您需要花钱购买带有额外串行端口的专用盒子并自行安装,或者购买专门构建的串行端口集中器。这显然不是最便宜的解决方案,但它会使远程管理变得容易得多。
答案4
这不是解决这个问题的方法,但是岩石是一个基于 CentOS 构建的集群“发行版”,它具有 ssh 密钥并跟踪您拥有的节点数。您只需运行rocks run host reboot
即可重新启动所有节点。Rocks 拥有您构建一个功能齐全的 HPC 集群所需的一切,我亲自在一个拥有超过 1200 个节点的集群上尝试过它。