見積依頼

株式会社HPCソリューションズ
2013年04月02日

Lustre(ラスター)ファイルシステムは代表的なクラスターファイルシステムの一つです。 そのパフォーマンスの高さと、オープンソースという公共性もあり、クラスタファイルシステムのなかでは最もユーザ数が多いと思われます。 Lustreの生い立ちはあまり幸運なものではなく、色々な企業の手を経てきました。 今回ご紹介するのは2012年にインテルに買収されたWamcloudが公開しているLustre-2.1.4のrpmを元にしています。 Lustreの主な特徴、簡単なケースでの構築手順、利用方法をご紹介します。

1. Lustreの特徴

Lustreファイルシステムの主な特徴は以下の通りです。

メタデータとストレージの分離

LustreのサーバはMDS(メタ・データ・サーバ)とOSS(オブジェクト・ストレージ・サーバ)の二種類に分かれます。 MDSはMDT(メタ・データ・ターゲット)を管理するサーバです。 MDTはファイル実体がどのサーバのどのストレージのどの番地に存在するかや、作成された日時、更新された日時などの情報(メタデータ)を格納しています。 OSSはOST(オブジェクト・ストレージ・ターゲット)というデータ領域を管理し、OSTにファイルの実体が格納されます。 Lustreでは一つのファイルシステムを一つのMDTと複数のOSTで構成します。 (Lustre-2.4ではMultiple MDTに対応する予定)

ボリューム構成方式

Lustreは一つのファイルをストライプサイズという単位で分割し、ストライプカウントで設定した数のOSTに対し分散します。 この数はディレクトリ・ファイル単位で設定することが出来、ユーザが変更可能です。 Lustreの利用方法で詳しく紹介します。

インフィニバンド対応

Lustreはインフィニバンド接続に対応しています。 イーサネット(TCP)接続にも対応していますが、Lustreは大規模なシステムでの採用が多いこともあり、インフィニバンドとの組合せで利用されることがほとんどです。

冗長性

LustreファイルシステムはMDT、OSTで構成されます。 これらのストレージ・ターゲットのミラーやコピーの様な冗長化機能は、現在のLustreにはありません。 基本的にはMDTやOSTとなるストレージをRAID-1やRAID-6、RAID-10などで構成することで冗長性を確保します。
サーバは冗長化が可能です。 MDSは2台でActive-Stanby構成にすることが出来ます。 OSSを冗長化する場合はOSTをSANなどを利用して複数台のOSSに接続する必要があります。 DataDirectNetworkのSFAシリーズはペタバイトクラスタのストレージ容量があり、8~16のインターフェースを持っています。 そのためSANスイッチが必要なく、1台のSFAに複数のOSSを接続し、冗長性のあるLustreファイルシステムを構築することが出来ます。

一般的なLustreの構成図

MDT、OSTの容量

今回ご紹介しているLustre-2.1.4のrpmでは、OSTはext4フォーマットを使用しているため、一つのOSTの容量の上限は16TBです。 MDTにはinodeが格納されています。 inode自体はせいぜい20KB程度ですが、ファイルの数に応じて増えていきます。 全てのOSTの合計容量が100TBの時、平均のファイルサイズが5MBであればMDTに必要な容量は80GBです。 実際のところ、この数値は大きめの見積なのですが、最近のハードディスク1本で十分まかなえる容量です。 詳細な算定方法についてはLustreのOperations Manualなどを参照して下さい。

2. Lustreの構築手順

Wamcloudが公開しているLustre-2.1.4を使用して、インフィニバンド接続のLustreファイルシステムの構築手順を紹介します。 サーバOSとしてCentOS6.3を使用しています。 冗長化などの込み入った設定は行っていません。 Lustreの構築は内蔵ディスクを使っても出来ますが、システムディスクの一部などをOSTに割り当てるとパフォーマンスが出ない場合もあるのでご注意ください。

LustreサーバとクライアントのOSインストール

以下の様なシステム構成の場合を仮定します。

サーバ 台数 ストレージ ホスト名 ib0のIPアドレス
MDS 1台 MDT:/dev/sdb mds 192.168.2.1
OSS 2台 OST:/dev/sdb oss1~2 192.168.2.2~3
クライアント 複数台 なし node01~ 192.168.2.10以降

各サーバにCentOS6.3をインストールして下さい。 OSインストール時に「Infinibadサポート」のRPMもインストールして下さい。 OSインストール手順の詳細は省きます。 インストール後、上述の表の様にib0のIPアドレスを設定して下さい。

※インフィニバンドドライバパッケージは必ずOS付属のものを使用して下さい。 OpenFabricが公開しているOFEDやMellanoxが提供しているものがありますが、それらを使用する場合はLustreをビルドし直す必要があります。

Lustrをインストールする際に必要になるCetOS6.3付属のRPMがいくつかあります。 各サーバに以下をインストールして下さい。

サーバ(MDS、OSS)及びクライアントの追加rpm

  • lm_sensors-libs-3.1.1-10.el6.x86_64.rpm
  • net-snmp-libs-5.5-41.el6.x86_64.rpm

クライアントはこの他にkernelを以下のバージョンにアップデートして下さい。 Lustre-2.1.4のRHEL6用クライアントモジュールはこのkernel用にビルドされています。 手近なCentOSのミラーサイトのupdatesからダウンロードして下さい。

  • kernel-2.6.32-279.14.1.el6.x86_64.rpm
  • kernel-firmware-2.6.32-279.14.1.el6.noarch.rpm

この他、ユーザ認証にNISやOepnLDAPなどを使用する場合はMDSにも認証クライアントの設定をしてください。 これはLustreでファイル書換えの際にMDSでオーナー確認するためです。

RPMのダウンロード

LustreのRPMはWamcloudのホームページからダウンロードできます。

“latest-maintenance-release”のページまで進んでください。 LustreのRPMはRHLE5、6及びSLES11のものが提供されています。 RHEL用はCentOSでも利用できます。
今回は以下のものをダウンロードして下さい。

サーバ用RPM

http://downloads.whamcloud.com/public/lustre/lustre-2.1.4/el6/server/RPMS/x86_64/

  • kernel-2.6.32-279.14.1.el6_lustre.x86_64.rpm
  • kernel-firmware-2.6.32-279.14.1.el6_lustre.x86_64.rpm
  • lustre-2.1.4-2.6.32_279.14.1.el6_lustre.x86_64.x86_64.rpm
  • lustre-modules-2.1.4-2.6.32_279.14.1.el6_lustre.x86_64.x86_64.rpm
  • lustre-ldiskfs-3.3.0-2.6.32_279.14.1.el6_lustre.x86_64.x86_64.rpm

クライアント用RPM

http://downloads.whamcloud.com/public/lustre/lustre-2.1.4/el6/client/RPMS/x86_64/

  • lustre-client-2.1.4-2.6.32_279.14.1.el6.x86_64.x86_64.rpm
  • lustre-client-modules-2.1.4-2.6.32_279.14.1.el6.x86_64.x86_64.rpm

この他、Lustreに対応したe2fsprogsが必要です。以下をダウンロードして下さい。

http://downloads.whamcloud.com/public/e2fsprogs/latest/el6/RPMS/x86_64/

  • e2fsprogs-1.42.6.wc2-7.el6.x86_64.rpm
  • e2fsprogs-libs-1.42.6.wc2-7.el6.x86_64.rpm
  • libcom_err-1.42.6.wc2-7.el6.x86_64.rpm
  • libss-1.42.6.wc2-7.el6.x86_64.rpm

サーバのインストール

rpmのインストール手順はMDS、OSS共に同じです。上述したrpmを各サーバにコピーしてから以下の様にインストールして下さい。

[root@mds ~]# rpm -ivh rpm -Uvh e2fsprogs-1.42.6.wc2-7.el6.x86_64.rpm \
e2fsprogs-libs-1.42.6.wc2-7.el6.x86_64.rpm


[root@mds ~]# rpm -ivh kernel-2.6.32-279.14.1.el6_lustre.x86_64.rpm \
kernel-firmware-2.6.32-279.14.1.el6_lustre.x86_64.rpm \
lustre-modules-2.1.4-2.6.32_279.14.1.el6_lustre.x86_64.x86_64.rpm \
lustre-ldiskfs-3.3.0-2.6.32_279.14.1.el6_lustre.x86_64.x86_64.rpm \
lustre-2.1.4-2.6.32_279.14.1.el6_lustre.x86_64.x86_64.rpm

Lustreのインフィニバンドモジュールを有効にするため、/etc/modprobe.d/lustre.confを作成し、以下の一行を書き加えて下さい。

[root@mds ~]# cat /etc/modprobe.d/lustre.conf
options lnet networks=o2ib(ib0)

各サーバを再起動して下さい。 再起動後、uname -aなどで新しいkernelで起動していることを確認して下さい。

[root@mds ~]# uname -a
Linux mds 2.6.32-279.14.1.el6_lustre.x86_64 #1 SMP Fri Dec 14 23:22:17 PST 2012 x86_64 x86_64 x86_64 GNU/Linux

Lustreのフォーマット

まず、MDTを作成します。 すでに/dev/sdb1がfdiskまたはpartedなどで作成済みとします。 ファイルシステム名はLustreの一つのファイルシステム毎に割り当てる名前です。 ここでは「lfs」としていますが、好きな名前を使うことが出来ます。

以下の様に/dev/sdb1をMDTとしてフォーマットします。

[root@mds ~]# mkfs.lustre –fsname=lfs –mgs –mdt /dev/sdb1

Permanent disk data:
Target: lfs-MDTffff
Index: unassigned
Lustre FS: lfs
Mount type: ldiskfs
Flags: 0x75
(MDT MGS needs_index first_time update )
Persistent mount opts: user_xattr,errors=remount-ro
Parameters:

device size = XXXXXMB
formatting backing filesystem ldiskfs on /dev/sdb1
target name lfs-MDTffff
4k blocks XXXXXXX
options -J size=400 -I 512 -i 2048 -q -O dirdata,uninit_bg,^extents,dir_nlink
,huge_file,flex_bg -E lazy_journal_init -F
mkfs_cmd = mke2fs -j -b 4096 -L lfs-MDTffff -J size=400 -I 512 -i 2048 -q -O dirdata,
uninit_bg,^extents,dir_nlink,huge_file,flex_bg -E lazy_journal_init -F /dev/sdb1 XXXXXXX Writing CONFIGS/mountdata

フォーマットが出来たらマウントします。 ここでは/lustre/mdtにマウントします。

[root@mds ~]# mkdir -p /lustre/mdt
[root@mds ~]# mount -t lustre /dev/sdb1 /lustre/mdt

Lustreはマウントした時にドライバがロードされます。 Lustreのインフィニバンドドライバがロードされているか確認して下さい。

[root@mds ~]# lsmod | egrep ^lnet
lnet 354290 4 lustre,ko2iblnd,ptlrpc,obdclass

続けてOSTもフォーマットします。 OSTをフォーマットする際はMGS(マネージメントサーバ)をオプションで指定します。 ここではMDSがMGSを兼ねているので、以下の様に指定します。 また、インフィニバンドで接続するので、MDSのib0のIPアドレスを指定し、後ろに「@o2ib」を追加します。 各OSSにログインし、フォーマット、マウントして下さい。 OSTもマウントするとLustreのインフィニバンドドライバがロードされます。

[root@oss1 ~]# mkfs.lustre –fsname=lfs –ost –mgsnode=192.168.2.1@o2ib /dev/sdb1

Permanent disk data:
Target: lfs-OSTffff
Index: unassigned
Lustre FS: lfs
Mount type: ldiskfs
Flags: 0x72
(OST needs_index first_time update )
Persistent mount opts: errors=remount-ro,extents,mballoc
Parameters: mgsnode=192.168.2.1@o2ib

checking for existing Lustre data: not found
device size = XXXXXXXXXMB
formatting backing filesystem ldiskfs on /dev/sdb1
target name lfs-OSTffff
4k blocks XXXXXXXXX
options -J size=400 -I 256 -i 69905 -q -O extents,uninit_bg,dir_nlink
,huge_file,flex_bg -G 256 -E resize=4290772992,lazy_journal_init -F
mkfs_cmd = mke2fs -j -b 4096 -L lfs-OSTffff -J size=400 -I 256 -i 69905 -q -O extents
,uninit_bg,dir_nlink,huge_file,flex_bg -G 256 -E resize=4290772992,lazy_journal_init
-F /dev/sdb1 XXXXXXXXX
Writing CONFIGS/mountdata
[root@oss1 ~]# mkdir -p /lustre/oss1
[root@oss1 ~]# mount -t lustre /dev/sdb1 /lustre/oss1
[root@oss1 ~]# lsmod | egrep ^lnet
lnet 354290 4 lustre,ko2iblnd,ptlrpc,obdclass

クライアントのインストール

クライアントのkernelは上述したバージョンににアップデートしてあることを確認して下さい。

[root@node01 ~]# uname -a
Linux node01 2.6.32-279.14.1.el6.x86_64 #1 SMP Tue Nov 6 23:43:09 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Lustreのクライアントモジュールをインストールして下さい。

[root@node01 ~]# rpm -ivh lustre-client-2.1.4-2.6.32_279.14.1.el6.x86_64.x86_64.rpm \
lustre-client-modules-2.1.4-2.6.32_279.14.1.el6.x86_64.x86_64.rpm

クライアントの場合もLustreのインフィニバンドモジュールを使用します。 有効にするため、/etc/modprobe.d/lustre.confを作成し、以下の一行を書き加えて下さい。

[root@node01 ~]# cat /etc/modprobe.d/lustre.conf
options lnet networks=o2ib(ib0)

再起動して下さい。

クライアントへマウント

Lustreファイルシステムをクライアントにマウントします。

[root@node01 ~]# mount -t lustre 192.168.2.1@o2ib:/lfs /lfs

オプションで「-t lustre」を指定するのはMDT、OSTなどと同じです。 マウント元は「192.168.2.1@o2ib:/lfs」としています。 このIPアドレス192.168.2.1@o2ibはOSTのフォーマットの時と同じMDSのib0のIPアドレスとプロバイダを意味する「o2ib」です。 コロンの後ろの「/lfs」がMDTをフォーマットした時に指定したファイルシステム名です。 先頭にスラッシュ「/」がついているので気を付けて下さい。 マウント先は「/lfs」を指定していますが、これは好きなように変更することが出来ます。

LustreファイルシステムはPOSIX準拠のファイルシステムです。 クライアントからであればディレクトリの作成やファイルの作成はごく普通に行うことが出来ます。 複数のユーザで利用されるのであれば、どれかのクライアントからユーザ用のディレクトリを作成して、オーナーを変更して下さい。 例えば、ユーザhpcsの場合は以下の様になります。

[root@node01 ~]# mkdir /lfs/hpcs
[root@node01 ~]# chown -R hpcs: /lfs/hpcs

3. Lustreの利用方法

ユーザがLustreファイルシステムを使う場合、特別な操作はいりません。 しかしながら、Lustreファイルシステムの仕組みを利用することで、用途によってパフォーマンスに差が出てきます。 ここでLustreファイルシステムへファイルを書き込んだ時の振る舞いについて説明します。

Lustreのボリュームの中では各ファイルやディレクトリに対してストライプカウント、ストライプサイズ、オフセットが設定されています。 ファイル書込みがあった場合、そのファイルをストライプサイズに分割し、ストライプカウントの数のOSTに分散します。 オフセットは分散させる時の最初のOSTの番号を指定します。 Lustreはこの様にしてファイルを分散させることで、ファイルの書込み/読込みを並列処理しています。

Lustreのファイルの分散処理

これらの設定がどの様になっているのかは、例えば以下の様に調べることが出来ます。

[hpcs@node01 hpcs]$ lfs getstripe /lfs/hpcs
/lfs/hpcs
stripe_count: 1 stripe_size: 1048576 stripe_offset: -1

デフォルトではストライプカウント:1、ストライプサイズ:1MB、オフセット:-1になっています。 オフセットが「-1」の時はファイルが作成された時に先頭のOSTをランダムに決定します。 ディレクトリを指定するとその中にあるファイルやサブディレクトリの情報も表示されます。

ストライプ設定を変更する場合、例えば、ディレクトリworkをストライプカウント:2、ストライプサイズ:4MBに変更してみます。

[hpcs@node01 hpcs]$ mkdir work
[hpcs@node01 hpcs]$ lfs setstripe -c 2 -s 4m work
[hpcs@node01 hpcs]$ lfs getstripe work
work
stripe_count: 2 stripe_size: 4194304 stripe_offset: -1

ディレクトリに対してストライプ設定をすると、そのディレクトリに新規に作成するファイルやサブディレクトリに対しても同じ設定が適用されます。 例えば、ddコマンドを使ってディレクトリworkの中にファイルを書いてみます。 このファイルのストライプ設定はディレクトリworkの設定を踏襲しています。

[hpcs@node01 hpcs]$ dd if=/dev/zero of=./work/test2.dat bs=1024k count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, XX.XXXX s, XX.X MB/s
[hpcs@node01 hpcs]$ lfs getstripe work/test2.dat
work/test2.dat
lmm_stripe_count: 2
lmm_stripe_size: 4194304
lmm_stripe_offset: 0
obdidx objid objid group
0 7 0x7 0
1 6 0x6 0

既にLustre上に作成されたファイルに対してsetstripeを実行することは出来ません。 もし、どうしても変更したい場合は、別途、希望するストライプ設定をしたディレクトリを用意し、そこへファイルをコピーすればディレクトリと同じストライプ設定になります。(※mvコマンドではなくcpコマンドを使わないと変わりません。)

ストライプカウントはOSTの数だけ増やすことが出来ます。 一般的には大きいほど並列性が上がるのでパフォーマンスも上がりますが、ファイルサイズやOSSの数にも寄ります。 1MB以下の様な小さいファイルをたくさん扱う場合や、ランダムアクセスが頻繁にある場合はストライプカウントを1にしておいた方がパフォーマンスが良いでしょう。 ファイルサイズが大きい場合はストライプサイズもある程度大きい方がパフォーマンスが良くなるようですが、これも場合によりけりです。

次に、どちらかというと管理者向けのコマンドですが、各MDT、OSTの使用量を表示するコマンドを紹介します。 例えば、今回のテスト環境で実行すると以下の様になります。

[hpcs@node01 hpcs]$ lfs df
UUID 1K-blocks Used Available Use% Mounted on
lfs-MDT0000_UUID 7862588 455272 6883764 6% /lfs[MDT:0]
lfs-OST0000_UUID 111318360 1005296 104726248 1% /lfs[OST:0]
lfs-OST0001_UUID 111318360 995056 104736488 1% /lfs[OST:1]

filesystem summary: 222636720 2000352 209462736 1% /lfs

Linux標準のdfと同じ様なコマンドですが、MDT、OST毎の情報を見ることが出来ます。 Lustreはファイルを分散して格納するので、OSTの使用量に偏りが出ます。 このため、Linux標準のdfで見ると90%ぐらいしか使用していないのに、OSTのどれかは100%近くまで消費していて異常動作することがしばしばあります。 Lustreファイルシステムを管理する場合、特にこのコマンドで定期的に検査することをお勧めします。

lfsコマンドにはこの他にもオプションがあります。 詳しくはhelpやmanを参照して下さい。

[hpcs@node01 hpcs]$ lfs help
Available commands are:
setstripe
getstripe
pool_list
find
check
join
osts
df
getname
quotachown
quotacheck
quotaon
quotaoff
setquota
quota
quotainv
flushctx
lsetfacl
lgetfacl
rsetfacl
rgetfacl
cp
ls
changelog
changelog_clear
fid2path
path2fid
help
exit
quit
For more help type: help command-name