1. 概要
Google Cloud Platform で Lustre 並列ファイル システム クラスタを実行する Google Codelab へようこそ。
データはハイ パフォーマンス コンピューティングの実践の中核であり、非常に高速で低レイテンシで大量のデータにアクセスすることは、HPC ワークロードの実行において常に重要な課題でした。高性能ストレージに対するこの要件はクラウドでも変わっていません。実際、膨大なストレージを迅速かつ簡単に利用できる能力が重要になっています。
HPC センターでは、Lustre 並列ファイル システムなどのテクノロジーを使用して、このニーズをオンプレミスで長い間満たしてきました。Lustre は、現在最も人気のあるオープンソースの高パフォーマンス ストレージ ソリューションの一つであり、2005 年 6 月以降、世界で最も高速なスーパーコンピュータのトップ 10 の少なくとも半分、トップ 100 の 60 台以上で継続的に使用されています。Lustre は、数百 PB の容量にスケールアップし、HPC ジョブに最大限のパフォーマンスを提供できます。システムは、単一の名前空間で TB/秒のスループットを提供します。
ストレージの需要に対応するため、Google Cloud は 2 つのアプローチを採用しています。まず、GCP は DDN と提携して、サポートされているエンタープライズ クラスの DDN EXAScaler Lustre ソフトウェアを GCP Marketplace に提供しました。2 つ目は、Google Cloud のエンジニアが、Google Cloud Deployment Manager を使用して Google Compute Engine に Lustre ストレージ クラスタを簡単に構成してデプロイするためのスクリプト セットを開発してオープンソース化したことです。
Google Cloud Platform 上の Lustre は、実行されているインフラストラクチャの最大パフォーマンスを同様に提供できます。GCP でのパフォーマンスは非常に優れており、2019 年にパートナーである DDN とともに IO-500 ストレージ システム ベンチマークで 8 位を獲得し、IO-500 で最も高い評価を受けたクラウドベースのファイル システムとなりました。ここでは、Lustre 用のオープンソース Deployment Manager スクリプトをデプロイする手順について説明します。エンタープライズ向けの堅牢な Lustre 環境を構築し、Lustre クラスタの Lustre エキスパートによるサポートや、管理とモニタリングの GUI、Lustre チューニングなどの機能を利用したい場合は、DDN EXAScaler Marketplace サービスを検討することをおすすめします。
学習内容
- GCP Deployment Manager サービスの使用方法
- GCP で Lustre ファイル システムを構成してデプロイする方法。
- ストライプを構成し、Lustre ファイル システムへの単純な I/O をテストする方法。
前提条件
- Google Cloud Platform アカウントと課金対象のプロジェクト
- 基本的な Linux の経験
2. セットアップ
セルフペース型の環境設定
プロジェクトを作成
Google アカウント(Gmail または G Suite)をお持ちでない場合は、アカウントを作成する必要があります。Google Cloud Platform コンソール(console.cloud.google.com)にログインし、[リソースの管理] ページを開きます。
[Create Project](プロジェクトを作成)をクリックします。
プロジェクト名を入力します。プロジェクト ID(上のスクリーンショットで赤色でハイライト表示されている ID)をメモしておきます。プロジェクト ID は、すべての Google Cloud プロジェクトで一意の名前にする必要があります。プロジェクト名が一意でない場合、Google Cloud はプロジェクト名に基づいてランダムなプロジェクト ID を生成します。
次に、Google Cloud リソースを使用するために、Developers Console で課金を有効にする必要があります。
この Codelab の操作をすべて行って、費用が生じたとしても、少額です。Google Cloud Platform の料金計算ツールは、こちらからご利用いただけます。
Google Cloud Platform の新規ユーザーは、300 ドル分の無料トライアルをご利用いただけます。
Google Cloud Shell
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Google Cloud Shell を起動する
GCP Console で右上のツールバーにある Cloud Shell アイコンをクリックします。
次に、[Cloud Shell の起動] をクリックします。
プロビジョニングと環境への接続にはそれほど時間はかかりません。
この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスが大幅に向上し、認証が簡素化されます。このラボでの作業のほとんどは、ウェブブラウザまたは Google Chromebook から実行できます。
Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自の PROJECT_ID が設定されていることがわかります。
$ gcloud auth list
コマンド出力:
Credentialed accounts:
- <myaccount>@<mydomain>.com (active)
$ gcloud config list project
コマンド出力:
[core]
project = <PROJECT_ID>
プロジェクト ID が正しく設定されていない場合は、次のコマンドを使用して設定できます。
$ gcloud config set project <PROJECT_ID>
コマンド出力:
Updated property [core/project].
3. Lustre デプロイ構成を準備して確認する
Lustre Deployment Manager のスクリプトをダウンロードする
Cloud Shell セッションで次のコマンドを実行して、Lustre for Google Cloud Platform のデプロイ マネージャー ファイルを含む Git リポジトリのクローンを作成(ダウンロード)します。
git clone https://github.com/GoogleCloudPlatform/deploymentmanager-samples.git
次のコマンドを実行して、Lustre デプロイ構成ディレクトリに切り替えます。
cd deploymentmanager-samples/community/lustre/
Lustre Deployment YAML を構成する
Deployment Manager は YAML ファイルを使用してデプロイ構成を提供します。この YAML ファイルには、デプロイする Lustre バージョンやデプロイするマシン インスタンスタイプなど、デプロイの構成が詳細に記載されています。このファイルは、割り当てを増やさずに新しいプロジェクトにデプロイするようにデフォルトで構成されていますが、この Codelab で必要に応じてマシンタイプまたは容量を変更できます。この Codelab はこれらのデフォルトを使用するように作成されているため、変更を加えた場合は、エラーを回避するために、この Codelab 全体で変更を適用する必要があります。本番環境では、MDS ノードに少なくとも 32 個の vCPU インスタンスを使用し、OSS ノードにはストレージの容量とタイプに応じて 8 個または 16 個の vCPU インスタンスを使用することをおすすめします。
Cloud Shell セッションで YAML ファイルを確認または編集するには、デプロイ構成 YAML ファイル Lustre-cluster.yaml
を開く。任意のコマンドライン エディタ(vi、nano、emacs など)を使用するか、Cloud コンソール コードエディタを使用してファイルの内容を確認します。
ファイルの内容は次のようになります。
# [START cluster_yaml]
imports:
- path: lustre.jinja
resources:
- name: lustre
type: lustre.jinja
properties:
## Cluster Configuration
cluster_name : lustre
zone : us-central1-f
cidr : 10.20.0.0/16
external_ips : True
### Use these fields to deploy Lustre in an existing VPC, Subnet, and/or Shared VPC
#vpc_net : < VPC Network Name >
#vpc_subnet : < VPC Subnet Name >
#shared_vpc_host_proj : < Shared VPC Host Project name >
## Filesystem Configuration
fs_name : lustre
### Review https://downloads.whamcloud.com/public/ to determine version naming
lustre_version : latest-release
e2fs_version : latest
## Lustre MDS/MGS Node Configuration
#mds_node_count : 1
mds_ip_address : 10.20.0.2
mds_machine_type : n1-standard-8
### MDS/MGS Boot disk
mds_boot_disk_type : pd-standard
mds_boot_disk_size_gb : 10
### Lustre MetaData Target disk
mdt_disk_type : pd-ssd
mdt_disk_size_gb : 1000
## Lustre OSS Configuration
oss_node_count : 4
oss_ip_range_start : 10.20.0.5
oss_machine_type : n1-standard-4
### OSS Boot disk
oss_boot_disk_type : pd-standard
oss_boot_disk_size_gb : 10
### Lustre Object Storage Target disk
ost_disk_type : pd-standard
ost_disk_size_gb : 5000
# [END cluster_yaml]
この YAML ファイルには複数のフィールドがあります。アスタリスク(*)が付いているフィールドは必須です。次のようなフィールドがあります。
クラスタ構成
- cluster_name* - Lustre クラスタの名前。デプロイされたすべてのリソースに接頭辞として追加されます。
- zone* - クラスタをデプロイするゾーン
- cidr* - CIDR 形式の IP 範囲
- external_ips* - 真偽値。Lustre ノードに外部 IP アドレスがあるかどうか。false の場合、Cloud NAT は NAT ゲートウェイとして設定されます。
- vpc_net - このフィールドと vpc_subnet フィールドを定義して、Lustre クラスタを既存の VPC にデプロイします。
- vpc_subnet - Lustre クラスタをデプロイする既存の VPC サブネット
- shared_vpc_host_proj - このフィールドと vpc_net フィールドと vpc_subnet フィールドを定義して、クラスタを共有 VPC にデプロイします。
ファイル システムの構成
- fs_name - Lustre ファイル システム名
- lustre_version - デプロイする Lustre バージョン。https://downloads.whamcloud.com/public/lustre/ から最新のブランチをデプロイするには「latest-release」を使用し、他のバージョンをデプロイするには lustre-X.X.X を使用します。
- e2fs_version - デプロイする E2fsprogs のバージョン。最新のブランチをデプロイするには「latest」を使用し、他のバージョンをデプロイするには X.XX.X.wcX を使用します。https://downloads.whamcloud.com/public/e2fsprogs/
MDS/MGS の構成
- mds_ip_address - MDS/MGS ノードに指定する内部 IP アドレス
- mds_machine_type - MDS/MGS ノードに使用するマシンタイプ(https://cloud.google.com/compute/docs/machine-types をご覧ください)。
- mds_boot_disk_type - MDS/MGS ブートディスクに使用するディスクタイプ(pd-standard、pd-ssd)
- mds_boot_disk_size_gb - MDS ブートディスクのサイズ(GB)
- mdt_disk_type* - Metadata Target(MDT)ディスクに使用するディスクタイプ(pd-standard、pd-ssd、local-ssd)
- mdt_disk_size_gb* - MDT ディスクのサイズ(GB)
OSS の構成
- oss_node_count* - 作成する Object Storage Server(OSS)ノードの数
- oss_ip_range_start - OSS ノードの IP 範囲の開始点。指定しない場合、自動 IP 割り当てを使用
- oss_machine_type - OSS ノードに使用するマシンタイプ
- oss_boot_disk_type - OSS ブートディスクに使用するディスクタイプ(pd-standard、pd-ssd)
- oss_boot_disk_size_gb - MDS ブートディスクのサイズ(GB)
- ost_disk_type* - Object Storage Target(OST)ディスクに使用するディスクタイプ(pd-standard、pd-ssd、local-ssd)
- ost_disk_size_gb* - OST ディスクのサイズ(GB)
4. 構成のデプロイと確認
構成をデプロイする
Cloud Shell セッションで、Lustre-gcp
フォルダから次のコマンドを実行します。
gcloud deployment-manager deployments create lustre --config lustre.yaml
このコマンドを実行すると、Lustre という名前のデプロイメントが作成されます。このオペレーションが完了するまでに 10 ~ 20 分ほどかかることがあります。しばらくお待ちください。
デプロイが完了すると、次のような出力が表示されます。
Create operation operation-1572410719018-5961966591cad-e25384f6-d4c905f8 completed successfully.
NAME TYPE STATE ERRORS INTENT
lustre-all-internal-firewall-rule compute.v1.firewall COMPLETED []
lustre-lustre-network compute.v1.network COMPLETED []
lustre-lustre-subnet compute.v1.subnetwork COMPLETED []
lustre-mds1 compute.v1.instance COMPLETED []
lustre-oss1 compute.v1.instance COMPLETED []
lustre-oss2 compute.v1.instance COMPLETED []
lustre-oss3 compute.v1.instance COMPLETED []
lustre-oss4 compute.v1.instance COMPLETED []
lustre-ssh-firewall-rule compute.v1.firewall COMPLETED []
デプロイを確認する
Google Cloud Platform Console でデプロイメントを表示する手順は次のとおりです。
- Cloud Platform コンソールで、コンソールの左上にある [プロダクトとサービス] メニュー(3 本の横線)を開きます。
- [Deployment Manager] をクリックします。
- [Lustre] をクリックして、デプロイの詳細を表示します。
- [概要 - Lustre] をクリックします。[Deployment properties] ペインには、デプロイの全体的な構成が表示されます。
- [Config] プロパティで [表示] をクリックします。[Config] ペインに、前に変更したデプロイ構成 YAML ファイルの内容が表示されます。続行する前に、内容が正しいことを確認します。デプロイ構成を変更する必要がある場合は、「デプロイのクリーンアップ」の手順に沿ってデプロイを削除し、「Lustre デプロイの YAML を構成する」の手順に沿ってデプロイを再起動します。
- (省略可)[Lustre-cluster] セクションで、Lustre.jinja テンプレートによって作成された各リソースをクリックして、詳細を確認します。
Deployment の構成を確認したら、クラスタのインスタンスが起動していることを確認します。Cloud Platform コンソールの [プロダクトとサービス] メニューで、[Compute Engine] > [VM インスタンス] の順にクリックします。
[VM インスタンス] ページで、デプロイ マネージャーによって作成された 5 つの仮想マシン インスタンスを確認します。これには、lustre-mds1、lustre-oss1、lustre-oss2、lustre-oss3、lustre-oss4 が含まれます。
5. Lustre クラスタにアクセスする
インストールをモニタリングする
[VM インスタンス] ページで、[lustre-mds1] をクリックして、[インスタンスの詳細] ページを開きます。
[シリアルポート 1(コンソール)] をクリックして、シリアル コンソール出力ページを開きます。このシリアル出力を使用して MDS インスタンスのインストール プロセスをモニタリングし、起動スクリプトが完了するまで待ちます。ページ上部の [更新] ボタンをクリックして、シリアル出力を更新します。ノードが 1 回再起動して Lustre カーネルを起動すると、次のようなメッセージが表示されます。
Startup finished in 838ms (kernel) + 6.964s (initrd) + 49.302s (userspace) = 57.105s.
Lustre: lustre-MDT0000: Connection restored to 374e2d80-0b31-0cd7-b2bf-de35b8119534 (at 0@lo)
つまり、Lustre が Lustre クラスタにインストールされ、ファイル システムの使用準備が整いました。
Lustre クラスタにアクセスする
Cloud Shell セッションで、Google Cloud コンソールの lustre-mds1 インスタンスの横にある [SSH] ボタンをクリックします。または、Cloud Shell で次のコマンドを実行します。lustre-mds1 ノードのゾーンに <ZONE> を置き換えます。
gcloud compute ssh lustre-mds1 --zone=<ZONE>
このコマンドは、lustre-mds1 仮想マシンにログインします。これは Lustre メタデータ サーバー(MDS)インスタンスで、Lustre 管理サーバー(MGS)インスタンスとしても機能します。このインスタンスは、ファイル システムのすべての認証リクエストとメタデータ リクエストを処理します。
後でテストできるように、lustre-mds1 インスタンスにファイル システムをマウントします。次のコマンドを実行します。
sudo mkdir /mnt/lustre sudo mount -t lustre lustre-mds1:/lustre /mnt/lustre cd /mnt/lustre
これらの 3 つのコマンドは、次の 3 つのことを行います。最初のコマンドは、マウント ポイントとして使用するローカル ディレクトリを「/mnt/lustre」に作成します。2 番目のコマンドは、「mount」コマンドを実行して、「lustre」タイプのファイル システムをマウントします。このファイル システムは lustre-mds1 サーバーに存在し、ファイル システム名は「lustre」で、「/lustre」と表示されます。mount コマンドは、Lustre ファイル システムをローカルの「/mnt/lustre」ディレクトリにマウントします。最後に、3 つ目のコマンドで、Lustre がマウントされている /mnt/lustre ディレクトリにディレクトリを変更します。
これで、Lustre ファイル システムが /mnt/lustre にマウントされました。このファイル システムでできることを見てみましょう。
6. Lustre CLI ツールの概要
Lustre とそのツールに精通していない場合は、ここでいくつかの重要なコマンドについて説明します。
Lustre のローレベルのクラスタ管理ツールは「lctl」です。lctl を使用して、Lustre クラスタを構成して管理し、Lustre クラスタのサービスを表示できます。新しい Lustre クラスタ内のサービスとインスタンスを表示するには、次のコマンドを実行します。
sudo lctl dl
Lustre YAML 構成ファイルに加えた変更に応じて、次のような出力が表示されます。
0 UP osd-ldiskfs lustre-MDT0000-osd lustre-MDT0000-osd_UUID 11
1 UP mgs MGS MGS 12
2 UP mgc MGC10.128.15.2@tcp 374e2d80-0b31-0cd7-b2bf-de35b8119534 4
3 UP mds MDS MDS_uuid 2
4 UP lod lustre-MDT0000-mdtlov lustre-MDT0000-mdtlov_UUID 3
5 UP mdt lustre-MDT0000 lustre-MDT0000_UUID 12
6 UP mdd lustre-MDD0000 lustre-MDD0000_UUID 3
7 UP qmt lustre-QMT0000 lustre-QMT0000_UUID 3
8 UP lwp lustre-MDT0000-lwp-MDT0000 lustre-MDT0000-lwp-MDT0000_UUID 4
9 UP osp lustre-OST0000-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
10 UP osp lustre-OST0002-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
11 UP osp lustre-OST0001-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
12 UP osp lustre-OST0003-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
Lustre 管理サーバー(MGS)は項目 1、Lustre メタデータ サーバー(MDS)は項目 3、Lustre メタデータ ターゲット(MDT)は項目 5、4 つの Lustre オブジェクト ストレージ サーバー(OSS)は項目 8 ~ 12 です。その他のサービスについては、Lustre マニュアルをご覧ください。
Lustre のファイル システム構成ツールは「lfs」です。lfs を使用すると、Lustre オブジェクト ストレージ サーバー(OSS)とそれぞれのオブジェクト ストレージ ターゲット(OST)間でのファイルのストライプ化を管理できます。また、find、df、割り当て管理などの一般的なファイル システム オペレーションを実行することもできます。
ストライプ化を使用すると、Lustre クラスタにファイルを分散する方法を構成して、可能な限り最高のパフォーマンスを実現できます。大きなファイルをできるだけ多くの OSS にストライプすると、IO が並列化されて最適なパフォーマンスが得られることが多いですが、小さなファイルをストライプすると、そのファイルを 1 つのインスタンスにのみ書き込んだ場合よりもパフォーマンスが低下する可能性があります。
これをテストするには、2 つのディレクトリを設定します。1 つはストライプ数が 1 つの OSS で、もう 1 つはストライプ数が「-1」です。これは、そのディレクトリに書き込まれるファイルが、できるだけ多くの OSS にストライプ化されることを示します。ディレクトリには、そのディレクトリ内に作成されたファイルに継承されるストライプ構成を保持できますが、必要に応じて、そのディレクトリ内のサブディレクトリと個々のファイルを異なるストライプに構成できます。これらの 2 つのディレクトリを作成するには、「/mnt/lustre」ディレクトリで次のコマンドを実行します。
sudo mkdir stripe_one sudo mkdir stripe_all sudo lfs setstripe -c 1 stripe_one/ sudo lfs setstripe -c -1 stripe_all/
ファイルまたはディレクトリのストライプ設定を表示するには、lfs getstripe を使用します。
sudo lfs getstripe stripe_all/
ストライプ数が -1 に設定されていることを示す出力が表示されます。
stripe_all/
stripe_count: -1 stripe_size: 1048576 pattern: raid0 stripe_offset: -1
これで、複数の OSS にストライプされた大きなファイルを書き込むことで達成できるパフォーマンスの向上をテストする準備が整いました。
7. Lustre I/O をテストする
Lustre IO の 2 つの簡単なテストを実行して、Lustre ファイル システムのパフォーマンス上の利点とスケーリング機能を示します。まず、「dd」ユーティリティを使用して簡単なテストを実行し、5 GB のファイルを「stripe_one」ディレクトリに書き込みます。次のコマンドを実行します。
sudo dd if=/dev/zero of=stripe_one/test bs=1M count=5000
5 GB のデータをファイル システムに書き込むプロセスは、単一の Object Storage サーバー(OSS)上の単一の Persistent Disk(PD)に書き込む場合、平均で約 27 秒かかります。
複数の OSS(つまり複数の PD)にまたがるストライプをテストするには、書き込み先の出力ディレクトリを変更するだけです。次のコマンドを実行します。
sudo dd if=/dev/zero of=stripe_all/test bs=1M count=5000
「of=stripe_one/test」が「of=stripe_all/test」に変更されています。これにより、単一ストリーム書き込みはすべての Object Storage サーバーに書き込みを分散し、平均 5.5 秒で書き込みを完了できます。これは、4 つの OSS を使用する場合の約 4 倍の速さです。
このパフォーマンスは、オブジェクト ストレージ サーバーを追加するにつれて向上します。ファイル システムがオンラインの状態で OSS を追加し、データのストライプ化を開始して、オンラインで容量とパフォーマンスを増やすことができます。Google Cloud Platform で Lustre を使用すると、無限の可能性を実現できます。お客様が何を構築し、どのような問題を解決できるか、楽しみにしています。
8. まとめ
これで、Google Cloud Platform に Lustre クラスタが作成されました。これらのスクリプトを開始点として使用して、独自の Lustre クラスタを構築し、クラウドベースのコンピューティング クラスタと統合できます。
Deployment をクリーンアップする
Lustre ノードからログアウトします。
exit
デプロイが完了したら、Lustre クラスタからログアウトした後、Google Cloud Shell から次のコマンドを実行して、デプロイを簡単にクリーンアップできます。
gcloud deployment-manager deployments delete lustre
プロンプトが表示されたら、「Y」と入力して続行します。この処理には時間がかかることがありますので、しばらくお待ちください。
プロジェクトを削除する
クリーンアップするには、プロジェクトを削除します。
- ナビゲーション メニューで [IAM と管理] を選択します。
- サブメニューで [設定] をクリックします。
- 「プロジェクトを削除」と書かれたゴミ箱アイコンをクリックします。
- 画面上の手順に沿って操作します。
学習した内容
- GCP Deployment Manager サービスの使用方法。
- GCP で Lustre ファイル システムを構成してデプロイする方法。
- ストライプを構成し、Lustre ファイル システムへの単純な I/O をテストする方法。
サポートを探す
Lustre Deployment Manager スクリプトを使用して、何かクールなものを構築していますか?ご不明な点がございましたら、Google Cloud Lustre ディスカッション グループでチャットしてください。機能のリクエスト、フィードバックの提供、バグの報告を行うには、こちらのフォームをご利用ください。また、コードを変更してプル リクエストを送信することもできます。Google Cloud のエキスパートに相談したいですか?Google Cloud のハイ パフォーマンス コンピューティングのウェブサイトから Google Cloud チームにお問い合わせください。
詳細
フィードバック
この Codelab に関するフィードバックは、こちらのリンクからお送りください。フィードバックは 5 分以内で完了します。ありがとうございました