slurm federationを使ってaws parallel clusterと連携する（準備①）

### はじめに

今回のslurm federation機能に関する記事、世の中に全然無かったので、ちょっと挑戦してみようと思いました。

slurm federation機能を使うことで、slurmマスターが複数あっても、JOBIDを統一的に発行し、別クラスターからでもジョブを投入出来るようにする構成です。

これを行う事で、普段オンプレでslurmジョブを投入するのとあまり変わらずaws parallel clusterでジョブを投入出来るのでは？っと思い、今回はまずはオンプレにあるslurmマスターでfederationが出来るか構成してみます。
次回はaws parallel clusterに拡張します。(まだ出来るかは不明）

![network_federation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3856269/fc43405a-d9d4-b2c5-66b1-56dc88c4548e.gif)

https://slurm.schedmd.com/network.html#federation

### 構成情報

 sms01,master01は既にslurmマスターが設定されている事を
 前提に作業を進めます。

 これからインストールする方はこちらを参考にしてください。
https://oracle-japan.github.io/ocitutorials/hpc/tech-knowhow/setup-slurm-cluster/


| ホスト名 | 用途  | IPアドレス | クラスタ名 | 
| --- | --- | --- | --- | 
| sms01 | slurmctld | 10.100.100.161 | clustera | 
| sms01 | slurmdbd  | 10.100.100.161 | -----    | 
| master01 | slurmctld | 10.100.100.166 | clusterb | 

### sms01:slurmdbdの変更(mariadb)

federationを使う場合はDBを一つに統一します。
そのためリモートホストから接続可能にする設定に変更します。

（私は検証環境なので制限してませんが本番は必ずセグメント単位などで制限してください）

```bash
myql -u slurm -p 

update mysql.user set host='%' where user='slurm' and host='localhost';

FLUSH PRIVILEGES;

#以下で確認してください。
select user,host from mysql.user where user='slurm';

```

###　sms01:cluster nameの変更（必要あれば）

通常デフォルトでは```ClusterName=cluster```となっています。
そのためもう一台のクラスタ名とバッティングしないようにclusteraなどに変更します。

```text:/etc/slurm/slurm.conf
ClusterName=clustera

```

### sms01: slurm.confの修正（必要あれば）

私のテスト環境ではmariadbがあるホストはsms01です。
もし```AccountingStorageHost=localhost```であった場合は正規のホスト名かIPに書き換えしてください。

```text:/etc/slurm/slurm.conf
# LOGGING AND ACCOUNTING
AccountingStorageHost=sms01
AccountingStoragePort=7004
AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageUser=slurm
```

### サービスの再起動を行います。

念のため全てを停止し、起動します。
起動時はエラーがないか/var/log/slurmディレクトリにあるログを確認してください。

```bash
systemctl stop slurmctld
systemctl stop slurmdbd
systemctl stop munge

systemctl start munge
systemctl start slurmdbd
systemctl start slurmctld

systemctl status munge
systemctl status slurmdbd
systemctl status slurmctld

```

### Federation の作成

今回は名前を「myfed」としてclusteraを追加します。

コマンドは下記公式サイトを参考に実行しました。
https://slurm.schedmd.com/federation.html


```bash
sacctmgr add federation myfed clusters=clustera

# 問題無く追加出来たか確認
scontrol show federation

#以下の結果が出てきたらOK
Federation: myfed
Self:       clustera:10.100.100.161:6817 ID:1 FedState:ACTIVE Features:
```

これでまずclusteraをフェデレーション出来る状態になりました。
次はclusterbを行います。

### UID,GIDをそろえる

私がつまずいたのは、slurmマスターで使用しているslurmとmungeアカウントのUID,GIDが別のslurmマスターでは違っているためmungeサービスでエラーになることでした。

federationを行うときはここがハードルになると思います。
（どっちのUID,GIDにそろえるのかは結構大きな問題）

もしかしたらmungeもしくはslurmのどちらかでも良いかもしれませんが、私は2つともそろえました。お時間のある方は検証してみてください。

### master01:slurmdbdを停止

clusterbとして設定するmaster01側のslurmdbdは不要になるので停止します。

```bash
systemctl stop slurmdbd
systemctl disable slurmdbd
```
###　sms01:cluster nameの変更（必要あれば）

sms01側ではclusteraとしたので、ホストmaster01のslurmctldはclusterbとします。

```text:master01:/etc/slurm/slurm.conf
ClusterName=clusterb

```

### master01: slurm.confの修正（必要あれば）

私のテスト環境ではmariadbがあるホストはsms01です。
もし```AccountingStorageHost=localhost```であった場合は正規のホスト名かIPに書き換えしてください。
ここの設定はsms01と同じですね。

```text:master01:/etc/slurm/slurm.conf
# LOGGING AND ACCOUNTING
AccountingStorageHost=sms01
AccountingStoragePort=7004
AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageUser=slurm
```


### sms01:/etc/munge/munge.keyをコピーして配布

ここはかなり省略しますが、munge.keyはclusteraとclusterbのマスターとノードは
全て同じmunge.keyに変更します。
munge.keyは400になるようにしてください。
```bash
-r--------    1 munge munge  1024  8月 13 20:04 munge.key
```



### サービスの再起動を行います。
clusterb側はマスターとノード全て再起動します。

起動時はエラーがないか/var/log/slurmディレクトリにあるログを確認してください。

#### マスター側の再起動
```bash:clusterb:master01
systemctl stop slurmctld
systemctl stop munge

systemctl start munge
systemctl start slurmctld

systemctl status munge
systemctl status slurmctld

```

#### ノード側の再起動
```bash:clusterb
systemctl stop slurmd
systemctl stop munge

systemctl start munge
systemctl start slurmd

systemctl status munge
systemctl status slurmd

```

### Federation のに追加

先程作成した「myfed」にclusterbを追加します。


```bash
#master01のIPアドレスで登録
sacctmgr add cluster clusterb to federation=myfed
sacctmgr modify cluster name=clusterb set controladdr=10.100.100.166

# 問題無く追加出来たか確認
scontrol show federation

#以下の結果が出てきたらOK
Federation: myfed
Self:       clustera:10.100.100.161:6817 ID:1 FedState:ACTIVE Features:
Sibling:    clusterb:10.100.100.166:6817 ID:2 FedState:ACTIVE Features: PersistConnSend/Recv:Yes/Yes Synced:Yes
```

###フェデレーション状態の確認


```bash
#clsterb(master01)から実行するといつも通りの結果（今回はノードは落としています）
sinfo 
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      1  down* slurm01

#オプションでclusterを指定してclustera側を見ることが出来ます。
#(ノードは落としています）
[root@master01 slurm]# sinfo --cluster=clustera
CLUSTER: clustera
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
normal       up   infinite      2  down* slurm[03-04]
mente*       up   infinite      1  down* slurm02
```

###　終わりに

終わって見れば簡単でしたが、なぜがfederationに関する日本語の情報も英語サイトの情報もほぼない状態だったので、思っていたよりも時間が掛かったのに、まとめると簡単だったのが個人的にはもやもやします。

しかし次回のaws parallel clusterとの連携は結構ハードルがありそう。