计算化学公社

标题: 记录一个集群的搭建过程 [打印本页]

作者
Author:
Accelerator    时间: 2021-4-26 17:13
标题: 记录一个集群的搭建过程
本帖最后由 Accelerator 于 2021-4-26 21:19 编辑

最近采购了20台E5-2683v3机器,搭建集群,以下为过程记录。初次搭集群,多有折腾,或许能给后来者带来一定帮助。这个过程中参考了坛友coolrainbow的pdf版集群搭建指南,基本思路一致,不过由于年代久远,书中一些命令已经不能在当前流行的软件版本上使用了。


这个集群叫做sibyl(来自psychopass里由众多大脑构成的系统),各运算节点依次叫做sibyl1到20。每个机柜放10台机器,分2台机柜,sibyl1-10和11-20各自接到一台交换机上,通过uplink连到一台总的交换机并接外网。另外有一台控制节点叫做sibyl。每台机器只使用一个网卡接口。全部节点使用CentOS 7系统。


1. 将所有机器拆包装,搬运到机柜上,然后打扫卫生,扔掉垃圾。事实证明这是整个过程中最费力的一步,如有条件务必多叫些人来帮忙。各机器连接好电源线和网线,这里注意机柜里的PDU插座的允许功率可能非常小,需要多买几个大功率插排,合理规划如何走线。如果很多机器都接到PDU插座上,可能分分钟跳闸。


2. 由于CentOS默认不联网,每个节点要挨个接上显示器和键盘鼠标,手动联网,并且修改/etc/sysconfig/network-scripts/ifcfg-eno1使得开机能够自动联网,并且记录每个节点的ip。(注意点:IP分配,见后文)
最后得到这样一张hosts表,把XX适当修改后写到每个节点中去:
  1. <blockquote>127.0.0.1   sibylXX localhost localhost.localdomain localhost4 localhost4.localdomain4
复制代码
这个过程并不需要挨个ssh到每个节点,只要在控制节点写好/etc/hosts,结合for循环很容易自动修改sibyl1-20的相应文件。


3. 在我的操作过程中,为了方便管理,首先安装了puppet,结果发现对于计算化学的常见应用场合,并不需要复杂的版本控制、集中运维等,使用puppet是杀鸡用牛刀,不如手写scp、ssh等用着舒适,因此略过。比如可以准备这样一个run.sh:
  1. for i in {1..20}; do ssh sibyl$i $1; done
复制代码
想要给所有节点统一执行什么命令,就sh run.sh "XXX"就好了,运行时看着一条一条的输出也赏心悦目。


4. 无密码登录
在管理节点:
  1. ssh-keygen
  2. for i in {1..20}; do ssh-copy-id -i sibyl$i; done
复制代码
在这里要输入(复制粘贴)20次密码,是比较令人劳累的重复性劳动。


5. 配置NFS,让所有计算节点都能访问控制节点的/home, /opt, /usr/local. (不知道为什么之前发帖时这段命令缺了一大段,现更新)
  1. systemctl stop firewalld.service; setenforce 0
复制代码
接下来进入客户端。可以先ssh sibyl1去试试,一旦搞明白之后就可以用for循环推广到全部节点。
showmount -e sibyl, 此时应当可以看到先前设置共享的三个目录。
这个时候mount sibyl:/home /home,就会使得这个节点的/home被sibyl的相应目录取代。如果想要开机自动挂载,原则上可以写/etc/fstab。但事实发现这样写会带来严重的问题,例如如果在/etc/fstab里加入如下内容:
  1. sibyl:/home /home nfs defaults,noatime,_netdev,nofail 0 0
  2. sibyl:/opt /opt nfs defaults,noatime,_netdev,nofail 0 0
复制代码
就会发现系统会概率性无法启动!有时是直接黑屏,有时是卡在内核输出一堆Succeeded的时候,有时是能进入桌面但要求初始化设置,并且ssh也连不上。网上还有说法是在rc.local中加入相应mount命令也能起到相似效果,结果表明这样做带来的问题比编辑/etc/fstab更加严重,写fstab无法启动还只是概率事件,而在rc.local中写任何与mount有关的命令都会导致100%无法正常启动。猜测是由于网络设备与系统加载存在时间差,导致系统想要挂载时网络还没准备好所致。在这里花了很大力气,最终决定放弃自动挂载的尝试,/etc/fstab里什么也不写,计算节点如果有重启的,就手动去执行mount让它挂载就好了。
我在这里写了个remount.sh:
  1. umount /dev/mapper/centos-home
  2. mount /dev/mapper/centos-home /tmp
  3. mount sibyl:/home /home
  4. mount sibyl:/opt /opt
  5. mount sibyl:/usr/local /usr/local
复制代码
将计算节点原有的/home改成/tmp(记得在控制节点sh run.sh "chmod -R 777 /tmp",否则无法读写),计算节点有重启时就run.sh执行remount.sh就好了,也不费事。


这样之后,每个节点都能共享/home, /opt, /usr/local.


注意点: IP分配
由于过去使用的设备连在交换机上后即使长期关机,重启后IP也不会变,一开始没有留意IP的问题,结果发现这次只要有机器重启,IP就变了,导致整个网络都乱成一锅粥。因此将每个节点都弄成静态IP:
  1. vi /etc/sysconfig/network-scripts/ifcfg-eno1
  2. #  TYPE=Ethernet
  3. #  PROXY_METHOD=none
  4. #  BROWSER_ONLY=no
  5. #  BOOTPROTO=none
  6. #  IPADDR=
  7. #  ONBOOT=yes
  8. #  GATEWAY=
  9. #  DNS1=
  10. #  DNS2=
  11. #  PREFIX=24
复制代码
(只列出需要改动的)
根据实践,bootproto必须是none,不能是static。如果是static,虽然一时也能成功联网,但过几分钟后就会自动断开。网关和DNS必须设置(在设置静态IP之前让它自动联网获取,然后查出来填上去就行),否则也会在几分钟后自动断网。
网络的问题也极为折腾,一开始设置了NFS后重启机器,IP一变所有机器都不能正常挂载,全部无法进入系统也无法ssh连接,只能挨个接显示器重新配置,然后摸索怎么才能既保证静态IP又不会断网,从22点弄到4点才搞好。
设置静态IP之后,新接入的设备(包括笔记本、手机等)可能会与它们有冲突,因此需要登录路由器管理页面,在DHCP设置里把自动分配IP的范围改成不和它们冲突的。


6. 配置NIS共享用户
相比之下NIS的配置非常简单,这里照搬https://blog.csdn.net/weixin_44097910/article/details/91863717的操作。一点区别在于这篇网文里计算节点需要借助图形界面进行配置,这显然十分低效,因此在sibyl1里用图形界面配置好之后,不要再去配置其他节点,而将它的 /etc/nsswitch.conf,/etc/sysconfig/authconfig,/etc/pam.d/system-auth,/etc/yp.conf通过for循环scp直接推送给所有计算节点就行了。


接下来每次增减用户,或者修改用户组等操作,都需要再执行一遍/usr/lib64/yp/ypinit -m。


7. 安装队列系统
这里照搬http://bbs.keinsci.com/thread-20943-1-1.html的操作(当然前两步已经早就做好了)。在执行./torque.setup root一步时可能会报错称找不到hostname,此时执行./torque.setup root sibyl即可解决。接下来安装计算软件等都十分容易,不再赘述。

作者
Author:
abin    时间: 2021-4-26 19:37
粘贴密码那里,
可以使用
sshpass
看一下就晓得如何使用。

IP设定方面,一定需要使用静态的, 否则死的很惨。
使用nmtui设定一下就可了。
或者采用启动后自动执行的方式,使用ifconfig设定。 当然,这仅是我采用的方案,我认为很可靠。
可以for循环一下,给每一个节点写一份到/etc/rc.local。

我还是建议,
master 和所有slave 通过一个交换机,建立一个局域网;
master另一个网卡,单独访问互联网。

不建议所有的slave都可以访问互联网。
如果slave需要互联网, 可以在master运行NAT网关就可以。
NAT设定可以参考 https://gitee.com/hpc4you/linux

仅供参考。


作者
Author:
Accelerator    时间: 2021-4-27 10:03
不知道为什么NFS那里的命令只显示了systemctl stop firewalld.service; setenforce 0这一句,剩下的编辑了很多次还是显示不出来。这部分命令比较标准,网上有很多教程,大致就是在关闭防火墙后在所有节点安装nfs-utils和rpcbind,依次启动服务,再在管理节点编辑/etc/exports设置共享的目录。
作者
Author:
abin    时间: 2021-5-9 14:14
Slurm调度并行计算搭建实录
https://b23.tv/jIF9Kh

虚拟机演示。
真实情形中,需要交换机,还有给每台机器安装系统。

机器启动之后,后续的配置流程都是一样的。
仅供参考。

视频中部分yum install有加速, 部分文字解说打字环节有删减。
我打字慢,还老打错,这种写错字的部分,基本都剪掉了。

大概有60分钟。

实际调试下来,时间更长,
所以不要问我,能否免费调试集群。
作者
Author:
xiaofeng_hpc    时间: 2021-11-26 02:11
批量设置ssh无密码访问可以用expect实现。首先安装expect:
  1. yum install expect -y
复制代码


然后保存下边这个脚本:
  1. #!/usr/bin/expect  
  2. set hostname [lindex $argv 0]
  3. spawn ssh-copy-id $hostname
  4. expect {
  5.             #first connect, no public key in ~/.ssh/known_hosts
  6.             "Are you sure you want to continue connecting (yes/no)?" {
  7.             send "yes\r"
  8.             expect "password:"
  9.                 send "YOUR_PASSWORD\r"
  10.             }
  11.             #already has public key in ~/.ssh/known_hosts
  12.             "password:" {
  13.                 send "YOUR_PASSWORD\r"
  14.             }
  15.             "Now try logging into the machine" {
  16.                 #it has authorized, do nothing!
  17.             }
  18.         }
  19. expect eof
复制代码


把上边的脚本保存为“ssh-single.sh”文件。然后在每个节点都运行下边的脚本:
  1. for i in localhost master node1 node2 node3 node4 ;  
  2. do  
  3. sh ssh-single.sh $i ;
  4. done
复制代码

作者
Author:
独孤天血    时间: 2021-12-23 17:28
这两段脚本是否可以整合到一个shell脚本内,如果这样可以可能更直观
作者
Author:
zhouxj    时间: 2022-1-20 22:24
你好,问个小白问题,您这20台机器系统是一个个装的么?还是有什么自动安装方法?




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3