技術情報

Lustreファイルシステムの概要と導入手順について


株式会社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などを参照して下さい。


go top



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のホームページからダウンロードできます。


http://www.whamcloud.com/


“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


go top



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


go top