重新启动远程集群中所有计算机的好方法是什么?

重新启动远程集群中所有计算机的好方法是什么?

我有一个我管理的集群,不时我会收到来自每个节点(和头节点)的电子邮件,请求在自动升级后重新启动。

目前,迄今为止我最好的解决方案是如下的 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。安全,因为您永远不必将任何信息直接传递给文件系统。

子节点上的每个脚本只需通过主机名或其他内容进行检查;

http://头节点/reboot?name=子节点1

每 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 个节点的集群上尝试过它。

相关内容