2018年3月1日

ブロードバンドタワーで Scality RING を担当しているポールです。
2017年に Lustre の HSM 機能と Scality RING の組み合わせを試した記事(その1)の続きです。
前回は Lustre-2.10.1 関連のパッケージを Lustre 側仮想マシン4台に導入したところで終わっています。続きはネットワークの設定から始まります。

・・・本題に入る前に、(その1)にはなかった Lustre 3文字略語のメモを載せておきます。

略語 メモ
MGS Management Service の略。Lustre ファイルシステムの構成情報を管理する。MGS 以外のホスト(MDS,OSS,Client) は構成情報を MGS に接続して入手する。
MDS, MDT Metadata Service, Metadata Target の略。MDS は Lustre ファイルシステムのメタデータ(ディレクトリ構造やファイル名、権限、拡張属性、ファイルレイアウトの情報)を複数の MDT 上に管理する。バックエンドのファイルシステムとして ext4 や ZFS が利用可能。
OSS, OST Object Storage Service, Object Storage Target の略。OSS は Lustre ファイルシステムにおけるファイルの実データを複数の OST 上に管理する。バックエンドのファイルシステムとして ext4 や ZFS が利用可能。Object Storage という言葉を用いているが、OST 上のオブジェクトを直接 REST で操作できるわけではない。

用語について詳しく知りたい方は、こちらを参照ください。

今回構築を進めているテスト環境の全体図を(その1)から引用します。

Lustre HSM を Scality RING と組み合わせたテスト環境の全体図
Lustre HSM を Scality RING と組み合わせたテスト環境の全体図 (赤線が実データの流れ)

Lustre ネットワーク(LNET)の設定

今回は Lustre を使うからと言って特別なネットワークは使いません。ありふれた Ethernet と TCP/IP を使用します。ただし、1点だけ Lustre ならではの設定があります。まず、/etc/hosts にLustre 側仮想マシン4台についてのホスト名とIPアドレスをすべて記述し、4台にそれぞれ配布します(記述したホスト名で相互に ping が疎通することをご確認ください)。 次に、/etc/modprobe.d/lustre.conf を作成し、次の1行を記述した後に4台に配布します。

options lnet networks=tcp

上記は LNET で Ethernet および TCP/IP を使用する、という意味です。Infiniband を使う場合や、通信種類ごとに複数の NICを使い分けておきたい構成ではより複雑な記述が必要ですが、今回のような、とにかく動けばよい Lustre の場合は、ざっくりと上記の1行で大丈夫です。

Lustre ファイルシステムの作成

MGS/MDS 仮想マシン上に MDT を作成

MGS/MDS 仮想マシン上で mkfs.lustre コマンドを使用します。ファイルシステム名を test 、index には 0、MDT には /dev/sdb (予め追加してある16GBの仮想ディスク2)を指定します。index に 0 を指定するのは、 /dev/sdb がこの Lustre 環境で初めての MDT になるためです。

[root@MGS/MDS ~]# mkfs.lustre --fsname=test --index=0 --mgs --mdt /dev/sdb

   Permanent disk data:
Target:     test:MDT0000
Index:      0
Lustre FS:  test
Mount type: ldiskfs
Flags:      0x65
              (MDT MGS first_time update )
Persistent mount opts: user_xattr,errors=remount-ro
Parameters:

checking for existing Lustre data: not found
device size = 16384MB
formatting backing filesystem ldiskfs on /dev/sdb
        target name   test:MDT0000
        4k blocks     4194304
        options        -J size=655 -I 1024 -i 2560 -q -O dirdata,uninit_bg,^extents,dir_nlink,quota,huge_file,flex_bg -E lazy_journal_init -F
mkfs_cmd = mke2fs -j -b 4096 -L test:MDT0000  -J size=655 -I 1024 -i 2560 -q -O dirdata,uninit_bg,^extents,dir_nlink,quota,huge_file,flex_bg -E lazy_journal_init -F /dev/sdb 4194304
Writing CONFIGS/mountdata
[root@MGS/MDS ~]#

次に MDT をマウントします。今回は /mnt/mdt というマウントポイントを用意しました。

[root@MGS/MDS ~]# mkdir -p /mnt/mdt
[root@MGS/MDS ~]# mount -t lustre /dev/sdb /mnt/mdt
mount.lustre: increased /sys/block/sdb/queue/max_sectors_kb from 512 to 4096
[root@MGS/MDS ~]# mount | grep mdt
/dev/sdb on /mnt/mdt type lustre (ro)
[root@MGS/MDS ~]# df -h /mnt/mdt
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sdb         8.9G   47M  8.1G    1% /mnt/mdt
[root@MGS/MDS ~]#

無事 MDT がマウントできたようです。大規模な Lustre を構成するならば各パラメータを慎重に吟味する必要がありますが、今回は超小規模の Lustre なので気にせず先に進めます。

OSS 仮想マシン上に OST を作成

次に、OSS 仮想マシン上で mkfs.lustre コマンドを使用します。ファイルシステム名はMDT作成時と同様に test、mgsnode には Ethernet 経由で MGS/MDS 仮想マシンにつなぐように指定します。index には 0 を指定していますが、これは上記の MDT と同様に最初の OST であるのが理由です。なお、以下の例で [MGS/MDS] となっている箇所は MGS/MDS 仮想マシンのホスト名(もしくは IPアドレス)で置き換えてください。

[root@OSS ~]# mkfs.lustre --ost --fsname=test --mgsnode=[MGS/MDS]@tcp0 --index=0 /dev/sdb

   Permanent disk data:
Target:     test:OST0000
Index:      0
Lustre FS:  test
Mount type: ldiskfs
Flags:      0x62
              (OST first_time update )
Persistent mount opts: ,errors=remount-ro
Parameters: mgsnode=[MGS/MDS]@tcp

checking for existing Lustre data: not found
device size = 16384MB
formatting backing filesystem ldiskfs on /dev/sdb
        target name   test:OST0000
        4k blocks     4194304
        options        -J size=400 -I 512 -i 69905 -q -O extents,uninit_bg,dir_nlink,quota,huge_file,flex_bg -G 256 -E resize="4290772992",lazy_journal_init -F
mkfs_cmd = mke2fs -j -b 4096 -L test:OST0000  -J size=400 -I 512 -i 69905 -q -O extents,uninit_bg,dir_nlink,quota,huge_file,flex_bg -G 256 -E resize="4290772992",lazy_journal_init -F /dev/sdb 4194304
Writing CONFIGS/mountdata
[root@OSS ~]#

OSS 仮想マシン上で OST をマウントします。今回は /mnt/ost1 というマウントポイントを用意しました。

[root@OSS ~]# mkdir -p /mnt/ost1
[root@OSS ~]# mount -t lustre /dev/sdb /mnt/ost1
mount.lustre: increased /sys/block/sdb/queue/max_sectors_kb from 512 to 4096
[root@OSS ~]# mount | grep ost1
/dev/sdb on /mnt/ost1 type lustre (ro)
[root@OSS ~]# df -h /mnt/ost1
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sdb          16G   46M   15G    1% /mnt/ost1
[root@OSS ~]#

クライアント仮想マシン上で Lustre ファイルシステムをマウント

最後に、ようやくですが、クライアント仮想マシン上で Lustre ファイルシステム (ファイルシステム名:test)をマウントします。今回は /mnt/lustre というマウントポイントを用意しました。OSTの場合と同様に[MGS/MDS] となっている箇所は MGS/MDS 仮想マシンのホスト名(もしくは IPアドレス)で置き換えてください。

[root@Client1 ~]# mkdir -p /mnt/lustre
[root@Client1 ~]# mount -t lustre [MGS/MDS]@tcp0:/test /mnt/lustre
[root@Client1 ~]# mount | grep lustre
[MGS/MDS]@tcp:/test on /mnt/lustre type lustre (rw,lazystatfs)
[root@Client1 ~]# df -h /mnt/lustre
ファイルシス        サイズ  使用  残り 使用% マウント位置
[MGS/MDS]@tcp:/test    16G   46M   15G    1% /mnt/lustre
[root@Client1 ~]#

/mnt/lustre 以下に実際にディレクトリやファイルを配置できるか確認してください。なお、ファイルを置いた分だけ OSS 仮想マシン上のディスク使用量(/mnt/ost1)も増えていきますので、合わせて確認してください。

HSM 動作の事前準備

最終的には Robinhood を用いたポリシーベースでの HSM 動作まで確認するのが目的なのですが、その1歩手前の確認事項として、クライアント仮想マシン上で実行するコマンドでの HSM 動作を確認します。以下はそのための事前準備になりますが、ポリシーベースで HSM 動作を行う上でも同様に実施が必要になります。

クライアント仮想マシン上でアーカイブ先になる Scality RING を NFS マウント

HSM でのアーカイブ先となる外部ストレージ領域として Scality RING のボリュームを NFS コネクタ経由でマウントします。マウントポイントとして今回は /mnt/hsm を使用します。RING 側では事前にボリューム内に /lhsm ディレクトリが作成済みで、NFS コネクタ経由でエクスポートされています。なお、[nfs_connector_ip] は NFS コネクタが使用している IP アドレスで置き換えてください。

[root@Client1 ~]# mkdir -p /mnt/hsm
[root@Client1 ~]# mount -t nfs [nfs_connector_ip]:/lhsm /mnt/hsm
[root@Client1 ~]# df -h /mnt/hsm
ファイルシス   サイズ  使用  残り 使用% マウント位置
[nfs_connector_ip]:/lhsm    16G     0   16G    0% /mnt/hsm
[root@Client1 ~]#

/mnt/hsm のサイズが 16GB になっているのは、HSM によってアーカイブされたデータ量を df コマンドで確認するために、16GB の Volume Quota を NFS コネクタ側で設定しているためです。

MGS/MDS 仮想マシン上で Coordinator を有効にする

Coordinator は HSM に必要な情報を MDS 上で制御する機能です。test-MDT0000 は MDT を示していますが、この設定は MDT 単位で実施する必要があります。

[root@MGS/MDS ~]# lctl --device test-MDT0000 changelog_register
test-MDT0000: Registered changelog userid 'cl1'
[root@MGS/MDS ~]# lctl get_param mdd.test-MDT*.changelog_mask
mdd.test-MDT0000.changelog_mask=
MARK CREAT MKDIR HLINK SLINK MKNOD UNLNK RMDIR RENME RNMTO OPEN CLOSE LYOUT TRUNC SATTR XATTR HSM MTIME CTIME MIGRT
[root@MGS/MDS ~]# lctl set_param mdt.test-MDT0000.hsm_control=enabled
[root@MGS/MDS ~]# cat /proc/fs/lustre/mdt/test-MDT0000/hsm_control
enabled
[root@MGS/MDS ~]# 

クライアント仮想マシン上で copytool を設定する

copytool には Lustre クライアントに備わっている lhsmtool_posix を使用します。データのアーカイブ先になる /mnt/hsm に対して番号を付与する必要があり、ここでは1を設定しています。

[root@Client1 ~]# lhsmtool_posix --daemon --hsm-root /mnt/hsm --archive 1 /mnt/lustre
1518659977.584490 lhsmtool_posix[31665]: action=0 src=(null) dst=(null) mount_point=/mnt/lustre
[root@Client1 ~]# 1518659977.633300 lhsmtool_posix[31666]: waiting for message from kernel

[root@Client1 ~]#

コマンドでのHSM動作を確認する

HSM に関する Lustre のコマンドとして、次のものがあります。

  • lfs hsm_archive [file_path] : Lustre 上のファイルをアーカイブする(Lustre 上の元データは削除されません)
  • lfs hsm_release [file_path] : Lustre 上のファイル(= OST 上のオブジェクト)を削除する
  • lfs hsm_remove [file_path] : アーカイブ先のファイルを削除する
  • lfs hsm_restore [file_path] : アーカイブ先のファイルを Lustre 上に復元する
  • lfs hsm_state [file_path] : ファイルのアーカイブ状況を確認する

注意が必要なのは、ファイルを HSM 対象としている間はファイルを rm コマンドで削除してはいけない、ということです。Lustre ファイルシステムの容量を確保するためには lfs hsm_archive した後に lfs hsm_release してください。

Lustre 上のファイルをアーカイブする

[root@Client1 ~]# lfs hsm_state /mnt/lustre/1g.dat
/mnt/lustre/1g.dat: (0x00000000)
[root@Client1 ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
(中略)
[MGS/MDS]@tcp:/test    16G  1.1G   14G    8% /mnt/lustre
[nfs_connector_ip]:/lhsm         16G     0   16G    0% /mnt/hsm   <-- 使用していない
(中略)
[root@Client1 ~]# lfs hsm_archive /mnt/lustre/1g.dat
(大量のメッセージがでるので省略)
[root@Client1 ~]# lfs hsm_state /mnt/lustre/1g.dat
/mnt/lustre/1g.dat: (0x00000009) exists archived, archive_id:1
[root@Client1 ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
(中略)
[MGS/MDS]@tcp:/test    16G  1.1G   14G    8% /mnt/lustre
[nfs_connector_ip]:/lhsm         16G  1.0G   15G    7% /mnt/hsm  <-- 使用している
(中略)
[root@Client1 ~]#

アーカイブ処理は /mnt/hsm 以下に成功しています。archived は、ファイルの完全な複製が外部ストレージ上に存在することを意味します。archive_id:1 の 1 が何だったかといえば、copytool の起動時に設定した値ですね。

Lustre 上のファイル(= OST 上のオブジェクト)を削除する

Lustre ファイルシステム側の空き容量が増えます。ただし、ファイルのメタデータは削除されていないため、ls コマンドでは存在が確認できてしまうことに注意してください。rm コマンドでファイルを削除してしまうと MDT 内のメタデータが消えてしまうため、そのファイルについて HSM 関連の処理が行えなくなります。

[root@Client1 ~]# lfs hsm_release /mnt/lustre/1g.dat
[root@Client1 ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
(中略)
[MGS/MDS]@tcp:/test    16G   46M   15G    1% /mnt/lustre     <-- 使用量が減っています!
[nfs_connector_ip]:/lhsm         16G  1.0G   15G    7% /mnt/hsm
(中略)
[root@Client1 ~]# ls -l /mnt/lustre/1g.dat
-rw-r--r-- 1 root root 1073741824  2月 15 11:52 /mnt/lustre/1g.dat     <-- ファイルが実在するように見える
[root@conn33 ~]# lfs hsm_state /mnt/lustre/1g.dat
/mnt/lustre/1g.dat: (0x0000000d) released exists archived, archive_id:1
[root@Client1 ~]#

アーカイブ先のファイルを Lustre 上に復元する

[root@Client1 ~]# lfs hsm_restore /mnt/lustre/1g.dat
(大量のメッセージがでるので省略)
[root@Client1 ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
(中略)
[MGS/MDS]@tcp:/test    16G  1.1G   14G    8% /mnt/lustre     <-- 使用量が元に戻っています!
[nfs_connector_ip:/lhsm         16G  1.0G   15G    7% /mnt/hsm
(中略)
[root@Client1 ~]# lfs hsm_state /mnt/lustre/1g.dat
/mnt/lustre/1g.dat: (0x00000009) exists archived, archive_id:1
[root@Client1 ~]#

アーカイブ先のファイルを削除する

[root@Client1 ~]# lfs hsm_remove /mnt/lustre/1g.dat
(大量のメッセージがでるので省略)
[root@Client1 ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
(中略)
[MGS/MDS]@tcp:/test    16G  1.1G   14G    8% /mnt/lustre
[nfs_connector_ip]:/lhsm         16G     0   16G    0% /mnt/hsm    <-- 使用量が減っています!
(中略)
[root@Client1 ~]# lfs hsm_state /mnt/lustre/1g.dat
/mnt/lustre/1g.dat: (0x00000000), archive_id:1
[root@Client1 ~]#

本記事は、まだ続きがあります!

(その2)では Lustre ファイルシステムの作成~コマンドでの HSM 動作の確認までをまとめましたが、文字数も多くなってきましたので、(その3)に続けていきたいと思います。(その3)では Robinhood を用いたポリシーベースでの HSM 動作について記述し、本記事を完了させる予定です。乞うご期待ください。

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

投稿者: ポール

ブロードバンドタワーで Scality RING を主に担当。ストレージ業界の知り合いからはポールと呼ばれているが、本人も由来はよくわからない。得意領域はデータベースとストレージ。