1. 前言¶
该文档基于 Slurm 23.11.1@Ubuntu 22.04.3 LTS ,除非特殊说明,所有命令均采用 root 用户(可以运行 sudo -s 切换到)在命令行终端下执行。
前续Slurm设置基于 https://hmli.ustc.edu.cn/doc/linux/slurm-install 。
2. 高可用性HA说明¶
为了实现Slurm系统的高可用性(High Availability,HA),在任何一个Slurmctld管理节点和SlurmDBD失效时不影响系统的正常运行,需要分别设置Slurmctld管理节点和SlurmDBD数据库节点的备份节点。
主要有以下组合:
- 多个Slurmctld管理节点,共用一个SlurmDBD数据库节点
如SlurmDBD数据库节点失效,整套系统失效
但正常情况下SlurmDBD数据库节点负载不高,稳定性很高
- 每个Slurmctld管理节点,各用自己SlurmDBD数据库节点
如Slurmctld与SlurmDBD共用同一个节点,SlurmDBD采用MarianDB(MySQL)时,MarianDB是高可用的
3. 规划准备¶
- 管理节点:提供Slurmctld及SlurmDBD服务
admin1 IP:191.168.1.251
admin2 IP:191.168.1.252
- 管理服务的常用命令(以slurmctld为例):
设置开机自启动服务:
systemctl enable slurmctld启动服务:
systemctl start slurmctld重新启动服务:
systemctl restart slurmctld停止服务:
systemctl stop slurmctld查看服务状态及出错信息:
systemctl status slurmctld查看服务日志:
journalctl -xe
4. 设置时间同步¶
两个MariaDB主节点之间的时间必须同步,在各节点分别执行。
安装Chrony NTP网络时间协议软件包:
apt -y install chrony
启动并启用chronyd服务:
systemctl enable --now chronyd
设置本地时区并设置Chrony NTP:
timedatectl set-timezone Asia/Shanghai --adjust-system-clock
timedatectl set-ntp yes
验证时间是否已同步:
timedatectl
输出应类似:
Local time: Sat 2024-01-13 07:32:11 UTC
Universal time: Sat 2024-01-13 07:32:11 UTC
RTC time: Sat 2024-01-13 07:32:11
Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
5. Mariadb(MySQL)主主双主设置¶
备注
MariaDB(MySQL)复制是一个过程,存储在给定Mariadb数据库服务器(称为源)中的单个数据集将实时复制到另一台Mariadb数据库服务器。默认情况下,复制是异步,但也支持其他同步方法,例如:单向异步复制、半同步复制、延迟复制等,根据您的设置,可以复制所有数据库和数据库中的表。
MariaDB中的复制具有以下优点:
提供数据安全性:可以在副本上运行备份而不会损坏相应的源数据
长距离数据分发:可以在远程服务器/站点上创建数据的本地副本
分析:实时数据可以存储在源上,分析信息可以从副本数据库中获取
提供横向扩展解决方案:负载分布在多个副本之间,这反过来又提高了性能
有多种类型的复制设置:
主从复制:存储在主服务器中的数据将实时复制到从服务器
主主复制:数据可以从任一服务器复制到另一服务器,这种设置增加了冗余并提高了效率,尤其是在处理数据访问时
多源复制
星形复制
备注
本文仅涉及主主复制
5.1. 在admin1节点上¶
在主SlurmDBD节点上启用复制,修改设置文件 /etc/mysql/mariadb.conf.d/50-server.cnf ,修改下面对应配置参数:
[mysqld]
#
# * Basic Settings
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 192.168.1.251 #设定IP地址
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
server-id = 1 #设定服务节点ID为1,ID不可与其他服务节点相同
log_bin = /var/log/mysql/mysql-admin1.log #设定日志名mysql-admin1.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = slurm_acct_db #设定需要复制的数据库,每个数据库一行
binlog_do_db = slurm_jobcomp_db #设定需要复制的数据库,每个数据库一行
#binlog_ignore_db = exclude_database_name
备注
MariaDB自身的数据库,比如存储自身用户的,会自动复制,不要再设置!
重启MariaDB服务:
systemctl restart mariadb
登录MariaDB服务:
mysql
创建复制用户 replacator 和所需的授权( ReplacatorPassword 为 replacator 的密码):
CREATE USER 'replacator'@'%' IDENTIFIED BY 'ReplacatorPassword';
GRANT REPLICATION SLAVE ON *.* TO 'replacator'@'%';
FLUSH PRIVILEGES;
请记住将 replacator 和 ReplacatorPassword 替换为您首选的复制用户的用户名和密码。
检查状态以显示当前二进制日志以及主服务器应开始复制的确切位置:
SHOW MASTER STATUS;
输出类似:
+---------------------+----------+--------------------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------------------------+------------------+
| mysql-admin1.000004 | 782 | slurm_acct_db,slurm_jobcomp_db | |
+---------------------+----------+--------------------------------+------------------+
1 row in set (0.000 sec)
上面显示进行复制的库名为 slurm_acct_db 和 slurm_jobcomp_db 。
备注
文件的位置Position很重要,请记下,稍后在admin2节点设置中将需要。
5.2. 在admin2节点上¶
备注
该节点数据库会复制admin1节点针对slurm的设置,因此无需执行 https://hmli.ustc.edu.cn/doc/linux/slurm-install/slurm-install.html#mariadb-mysql 中的”create user ‘slurm’@’localhost’ identified by ‘SomePassWD’;”等操作。
在admin2节点上,进行与admin1节点类似的设置。
修改设置文件
/etc/mysql/mariadb.conf.d/50-server.cnf,修改下面对应配置参数:
[mysqld]
#
# * Basic Settings
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 192.168.1.252 #设定IP地址
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
server-id = 2 #设定服务节点ID为2,ID不可与其他节点一样
log_bin = /var/log/mysql/mysql-admin2.log #设定日志名mysql-admin2.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = slurm_acct_db #设定需要复制的数据库,每个数据库一行
binlog_do_db = slurm_jobcomp_db #设定需要复制的数据库,每个数据库一行
#binlog_ignore_db = exclude_database_name
备注
MariaDB自身的数据库,比如存储自身用户的,会自动复制,不要再设置!
重启mariadb服务:
systemctl restart mariadb
登录MariaDB服务:
mysql
备注
以下在MariaDB shell中执行。
创建复制用户 replacator 和所需的授权( ReplacatorPassword 为 replacator 的密码),为了方便,与前面设置的用于复制的用户名和密码一样,也可设置为不一样:
CREATE USER 'replacator'@'%' IDENTIFIED BY 'ReplacatorPassword';
GRANT REPLICATION SLAVE ON *.* TO 'replacator'@'%';
FLUSH PRIVILEGES;
请将 replacator 和 ReplacatorPassword 替换为您首选的复制用户的用户名和密码。
停止从服务:
STOP SLAVE;
添加主节点admin1信息:
CHANGE MASTER TO MASTER_HOST = "admin1", MASTER_USER = "replacator", MASTER_PASSWORD = "ReplacatorPassword", MASTER_PORT=3306, MASTER_LOG_FILE = "mysql-admin1.000004", MASTER_LOG_POS = 782, MASTER_CONNECT_RETRY=10;
mysql-admin1.000004 和 782 与文件在主节点admin1上的一致(在admin1节点执行 SHOW MASTER STATUS; 时获取的)。
启动从服务:
START SLAVE;
显示主状态并记下文件的路径和位置:
SHOW MASTER STATUS;
输出类似:
+---------------------+----------+--------------------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------------------------+------------------+
| mysql-admin2.000004 | 779 | slurm_acct_db,slurm_jobcomp_db | |
+---------------------+----------+--------------------------------+------------------+
1 row in set (0.000 sec)
备注
文件的位置Position很重要,请记下,稍后在admin2的设置中将需要。
5.3. 在admin1节点上¶
将主节点admin2的信息添加到主节点admin1,在MariaDB shell中执行。
停止从服务:
STOP SLAVE;
添加主节点admin2信息:
CHANGE MASTER TO MASTER_HOST = "admin2", MASTER_USER = "replacator", MASTER_PASSWORD = "ReplacatorPassword", MASTER_PORT=3306, MASTER_LOG_FILE = "mysql-admin2.000004", MASTER_LOG_POS = 779, MASTER_CONNECT_RETRY=10;
mysql-admin2.000004 和 779 与文件在主节点admin2上的一致(在admin2节点执行 SHOW MASTER STATUS; 时获取的)。
启动从服务:
START SLAVE;
5.4. 验证节点上的从属状态¶
在节点admin1和admin2上分别执行:
show slave status\G
输出类似:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: admin2
Master_User: replicator
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-admin2.000004
Read_Master_Log_Pos: 779
Relay_Log_File: mysqld-relay-bin.000004
Relay_Log_Pos: 862
Relay_Master_Log_File: mysql-admin2.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 36589
Relay_Log_Space: 37497
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Slave_DDL_Groups: 44
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 33
1 row in set (0.000 sec)
重点是以下几行:
Slave_IO_State: Waiting for master to send event
Master_Host: admin2
Master_User: replicator
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-admin2.000004
Read_Master_Log_Pos: 779
Relay_Log_File: mysqld-relay-bin.000004
Relay_Log_Pos: 862
Relay_Master_Log_File: mysql-admin2.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error:
Master_Server_Id: 2
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
在admin1和admin2两个节点上,服务应该等待对方发送事件,如上所示。
5.5. 测试主主复制¶
在admin2上运行:
show databases;
输出应该类似:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| slurm_acct_db |
| slurm_jobcomp_db |
+--------------------+
5 rows in set (0.000 sec)
因为admin2上之前未执行 create database slurm_acct_db; 、 create database slurm_jobcomp_db; 等操作,此时看到上述数据库,则说明从admin1上复制成功了,为了验证在admin2的操作可以复制到admin1上,可以执行
CREATE TABLE slurm_acct_db.test (`name` varchar(18));
在admin1上运行:
SHOW TABLES IN slurm_acct_db;
应有类似输出:
| test |
| tres_table |
| txn_table |
| user_table |
+-----------------------------------+
可以看到在admin2上生成的test表已经在admin1上了。
6. Slurmdbd管理节点高可用设置¶
以下设置在各SlurmDBD节点执行。
设置各SlurmDBD节点的
slurmdbd.conf文件:
DbdAddr=127.0.0.1 #设定使用本机,也可设置使用其他远程主机
DbdHost=localhost
重启服务:
systemctl restart slurmdbd
7. Slurmctld管理节点高可用设置¶
可以在 slurm.conf 设置文件里面设置多个 SlurmctldHost 参数(entry,条目)指定slurmctld管理节点,在第一个参数后的各个参数都被认为是备份管理节点。每个备份管理节点名必须与主管理节点名不同。必须注意,由 StateSaveLocationd 指定的用于存储slurmctld服务状态文件的目录必须是共享的,即所有管理节点都能对该目录进行读写。
如果声明了超过一个管理节点,当主管理节点失效时,设置中的第二个 SlurmctldHost 指定的管理节点将接管服务。当主管理节点恢复服务时,主管理节点会通知备份管理节点。备份管理节点将存储slurmctld服务状态并返回备份模式。主管理节点读取之前存储的slurmctld服务状态并进入常规操作。类似,如果设置中的最开始两个管理节点失效,那么第三个SlurmctldHost指定的备份节点将接管服务直到主管理节点恢复服务。除了短暂的不响应,来回的转换应该不会被发现,不影响系统使用。
在18.08版之前,Slurm使用 BackupAddr 和 BackupController 参数实现高可用,这些参数已被废弃,现在应使用 SlurmctldHost 参数代替。请参见 SlurmctldPrimaryOnProg 和 SlurmctldPrimaryOffProg 参数说明,这些参数可调整成为主管理者时的行为。
任何时候,当 slurmctld 守护进程或硬件失效时,如果slurmctld服务状态信息没有在此之前存储到存储上,那么可能会导致部分slurmctld服务状态丢失。 Slurmctld 定时存储slurmctld服务状态(默认为每5秒),但当有大量数目作业时,格式化和存储记录会需要好几秒,最近的改变也会没有写入存储中。另一个例子,当节点失效时,如果slurmctld服务状态信息是被写入文件的,但这些信息还被缓存在内存中而不是真正写入存储,也会存在类似问题。存储slurmctld服务状态信息的频率,可以通过在编译slurm安装包时利用将 SAVE_MAX_WAIT 参数设置为不为5的数值进行设置。
备注
SAVE_MAX_WAIT 参数无法通过修改 slurm.conf 等设置文件中设置参数然后重启服务进行修改,必须在编译slurm生成安装包前利用 SAVE_MAX_WAIT 参数设置。
利用外部可靠性很高的存储的某个共享目录(如NFS或块方式)为slurmctld管理节点提供由StateSaveLocation指定的存储slurmctld服务状态的存储服务,避免存储在某slurmctld管理节点上时存在由于该slurmctld管理节点失效导致的其余slurmctld管理节点服务访问的缺陷。如不具备外部可靠性很高的存储条件,利用rsync定时并且及时同步多个slurmctld管理节点上述文件,估计也可以,但本人未测试。
SlurmctldHost=admin1(192.168.1.251) #依次设定slurmctld节点,第一个为主,后面的为备份,() 内为IP地址
SlurmctldHost=admin2(192.168.1.252)
StateSaveLocation=/var/spool/slurm/ctld #该目录所有者为slurm,比如ctld为指向/storage/slurm/ctld的软连接,/storage/slurm/ctld是多个slurmctld控制节点共享的外部可靠性很高的存储的某个共享目录
SlurmctldTimeout=30 #设定slurmctld管理节点失效后多久其他管理节点进行接管
AccountingStorageHost=localhost #使用本机提供的slurmdbd服务
#AccountingStorageHost=slurmdbdhost #或指定其它slurmhost节点提供的slurmdbd服务
#AccountingStorageExternalHost
JobCompHost=localhost
#JobCompHost=slurmdbdhost #或指定其它slurmhost节点提供的slurmdbd服务
默认下,只有管理节点发现提供当前slurmctld服务的节点超过 SlurmctldTimeout 参数设定时间后才接管slurmctld管理服务,在此之前可以在所需的slurmctld管理节点上手动运行 scontrol takeover 命令,使得该管理节点立即接管服务。
8. 验证Slurmctld服务高可用性¶
可以在任意Slurmctld管理节点执行:
systemctl restart slurmctld
然后运行 sinfo 等命令看是否过会儿(上述设置应该在30秒内)会恢复。
- 可以运行
scontrol ping查看输出: 全正常时:
Slurmctld(primary) at admin1 is UP Slurmctld(backup) at admin2 is UP
有异常时:
Slurmctld(primary) at admin1 is DOWN Slurmctld(backup) at admin2 is UP ***************************************** ** RESTORE SLURMCTLD DAEMON TO SERVICE ** *****************************************
- 可以运行
9. 计算节点、用户登录节点等设置¶
- 针对configless模式:
在
slurmd.service服务配置文件中设置:
ExecStart=/usr/sbin/slurmd --conf-server admin1:6817,admin2:6817 -D -s $SLURMD_OPTIONS
刷新服务配置:
systemctl daemon-reload
- 针对非configless模式:
在
slurm.conf配置文件中设置:
SlurmctldHost=admin1(192.168.1.251) #依次设定slurmctld节点,第一个为主,后面的为备份,() 内为IP地址 SlurmctldHost=admin2(192.168.1.252)
重启服务:
systemctl restart slurmd