AIGFSは、ZFSをベースとしたストレージ基盤上で高いI/O性能を実現する高速分散ファイルシステムです。
本ホワイトペーパーでは、ZFSレイヤー上にAIGFSを構築するための設計方針、システム構成、構築手順について解説します。
本書は、ZFSをローカルストレージ基盤として利用し、その上位レイヤーに AIGFSを構築するための設計方針、構成例、構築手順、運用上の注意点を整理することを目的とする。
ZFSは、ローカルノード単位で高いデータ整合性、柔軟なプール設計、ARCによるキャッシュ、Snapshot、圧縮、special vdevなどの機能を提供する。一方、AIGFSは、複数ノードに分散したストレージを単一の並列ファイルシステムとして利用できる。
本構成では、各ストレージノードの物理ディスクを ZFSで管理し、その上に AIGFSの storage targetを配置することで、ローカルディスク管理の信頼性と、並列ファイルシステムのスケールアウト性能を両立する。
本書で想定する基本構成は以下の通りである。
| 役割 | ノード例 | 主な機能 |
|---|---|---|
| 管理ノード | manage | BeeGFS/AIGFS Management(mgmtd)サービスを実行 |
| メタデータノード | meta1, meta2 | メタデータ管理 |
| ストレージノード | storage1 ~ storageN | ZFS Pool + AIGFS Storage Target |
| クライアントノード | client1 ~ clientN | BeeGFS Clientをマウントし、ファイルシステムへアクセス |
| ネットワーク | 25 / 40 / 100 GbE | データ通信、管理通信 |
| アプリケーション / AI / HPC / 解析処理 |
| AIGFS クライアント |
| AIGFS メタデータ・ストレージサービス |
| ZFS Dataset / Zpool |
| HDD / SSD / NVMe / RAID HBA / JBOD |
| 物理サーバ / ネットワーク |
| レイヤー | 主な役割 |
| ZFS | ローカルディスク管理、冗長化、Checksum、ARC、Snapshot、Dataset管理 |
| AIGFS | 複数ノード間の分散I/O、単一名前空間、クライアント共有 |
| ネットワーク | クライアント、Metadata、Storage間の高速通信 |
| アプリケーション | AI学習、HPC、解析処理、大容量ファイル処理 |
ZFSを利用することで、各ストレージノード単位で以下の機能を利用できる。
| 項目 | 目的 |
| データ保護 | Checksumによるデータ破損の検出 |
| ディスク冗長化 | Mirror / RAIDZ / Special VDEV / Log VDEVの利用 |
| キャッシュ | ARC / L2ARCによる読み取り性能の向上 |
| 高速化 | Special VDEVによる小容量ファイルおよびメタデータの高速化 |
| 運用性 | Snapshot、Quota、Dataset単位での管理 |
| 柔軟性 | HDD、SSD、NVMeを組み合わせた階層型ストレージ構成 |
AIGFSを上位レイヤーとして利用する目的は以下である。
| 項目 | 目的 |
| 並列I/O | 複数のStorage Targetへの分散I/O |
| スケールアウト | Storage Nodeの追加による容量・性能の拡張 |
| クライアント共有 | 複数サーバから単一名前空間で利用 |
| AI/HPC用途 | 大量ファイルおよび大容量データセットの処理 |
| 分散配置 | Dataset単位、ディレクトリ単位での分散制御 |
1台のストレージノード内で、HDDを ZFS poolとして構成し、NVMe SSDを special vdevや SLOGとして利用する。
storage node
├─ HDD pool
│ └─ ZFS dataset
│ └─ AIGFS storage target
├─ NVMe special vdev
├─ NVMe SLOG
└─ optional L2ARC
AIGFS storage target用 datasetでは、以下の設定を基本とする。
# zfs set atime=off gfs_pool/aigfs-target01
# zfs set xattr=sa gfs_pool/aigfs-target01
# zfs set compression=off gfs_pool/aigfs-target01
# zfs set dedup=off gfs_pool/aigfs-target01
# zfs set recordsize=128K gfs_pool/aigfs-target01
AIGFSの storage targetは、ZFS dataset単位で分離する。
# gfs_pool/aigfs-target01
# gfs_pool/aigfs-target02
# gfs_pool/aigfs-target03
マウント例:
/data/aigfs/storage/target01
/data/aigfs/storage/target02
/data/aigfs/storage/target03
AIGFS storage targetには、基本的に zvolではなく ZFS datasetを使用する。
理由は以下である。
| 項目 | Dataset | Zvol |
| ファイル配置 | 直接配置可能 | ブロックデバイス化が必要 |
| 管理性 | 高い | やや複雑 |
| 性能 | BeeGFS Target用途に適する | オーバーヘッドが増える場合がある |
| Snapshot | Dataset単位で容易 | 可能だが構成が複雑 |
| 推奨 | ◎ | △ |
管理ノードでは mgmtdサービスを稼働させる。 主な役割 :
メタデータノードでは、ファイル名、ディレクトリ構造、inode相当の情報を管理する。
推奨配置 :
meta1: /data/aigfs-meta
meta2: /data/aigfs-meta
メタデータ領域には高速 SSDまたは NVMeを推奨する。
ストレージノードでは、ZFS datasetを AIGFS storage targetとして利用する。
例 :
/mnt/aigfs
例 :
# zpool create -o ashift=12 gfs_pool raidz1 /dev/sdb /dev/sdc /dev/sdd /dev/sde /
dev/sdf raidz1 /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk
special vdevを追加する場合 :
# zpool add gfs_pool special mirror /dev/nvme0n1 /dev/nvme1n1
SLOGを追加する場合 :
# zpool add gfs_pool log mirror /dev/nvme2n1 /dev/nvme3n1
# zfs create gfs_pool/aigfs-target01
# zfs create gfs_pool/aigfs-target02
# zfs set atime=off gfs_pool/aigfs-target01
# zfs set xattr=sa gfs_pool/aigfs-target01
# zfs set compression=off gfs_pool/aigfs-target01
# zfs set dedup=off gfs_pool/aigfs-target01
# zfs set recordsize=128K gfs_pool/aigfs-target01
# zfs set mountpoint=/data/aigfs/storage/target01 gfs_pool/aigfs-target01
# zfs set mountpoint=/data/aigfs/storage/target02 gfs_pool/aigfs-target02
storage serviceの設定ファイルで、ZFS dataset上のパスを storage targetとして指定する。
例 :
storeStorageDirectory = /data/aigfs/storage/target01
sysMgmtdHost = manage
connMgmtdPort = 8008
# systemctl enable --now aigfs-storage.service
# systemctl status aigfs-storage.service
# aigfs target list --mgmtd-addr manage:8010
BeeGFS/AIGFSでは、ディレクトリ単位で使用する storage target数を指定できる。
例 :
# aigfs entry set /mnt/aigfs/dataset01 --num-targets=8
確認:
# aigfs entry info /mnt/aigfs/dataset01
| 用途 | Num Targets(目安) |
| 小規模・検証環境 | 2 ~ 4 |
| 通常利用 | 4 ~ 8 |
| 大容量シーケンシャルI/O | 8 ~ 16 |
| 多数クライアントによる並列I/O | Storage Target数に応じて調整 |
| レイヤー | 影響要素 |
| 物理ディスク | HDD / SSD / NVMeの性能 |
| ZFS | VDEV構成、Recordsize、ARC、Special VDEV |
| AIGFS | Storage Target数、Metadata性能、Client数 |
| ネットワーク | 25 / 40 / 100 GbE、LACP、MTU |
| クライアント | 並列ジョブ数、I/Oサイズ、キャッシュ |
HDD主体の ZFS poolでは、ランダム I/O性能は HDD本数と vdev構成に大きく依存する。
AIGFSで複数 targetへ分散しても、各 targetの下位 ZFS poolが HDD主体である場合、ランダム小容量 I/Oは大きく伸びにくい。
special vdevを利用することで、以下の領域を NVMe側に配置できる。
# zpool status
# zpool list
# zfs list
# zfs get all gfs_pool/aigfs-target01
# aigfs node list --mgmtd-addr manage:8010
# aigfs target list --mgmtd-addr manage:8010
# aigfs health net --mgmtd-addr manage:8010
| 事象 | 確認項目 |
| Client Mount失敗 | mgmtd、Meta Service、Storage Serviceの稼働状況 |
| Storage Target Offline | Storage Service、ZFSのマウント状態、ネットワーク |
| 性能低下 | zpool iostat、BeeGFS Targetの分散状況、ネットワーク |
| 容量不足 | zfs list、zpool list、Quota設定 |
| メタデータ遅延 | Meta Nodeの負荷、SSD性能、ディレクトリ構造 |
ZFS dataset単位で snapshotを取得する。
# zfs snapshot gfs_pool/aigfs-target01@snap_YYYYMMDD
AIGFS上位レイヤーの整合性を考慮するため、snapshot取得時は以下を検討する。
| 項目 | 推奨構成 |
| 管理ノード | 1台 |
| メタデータノード | 2台 |
| ストレージノード | 4〜8台 |
| クライアント | 4台以上 |
| ネットワーク | 25 / 100 GbE |
| ZFS構成 | RAIDZ1 / RAIDZ2 + Special VDEV |
| 項目 | 推奨構成 |
| 管理ノード | 1台以上 |
| メタデータノード | 2〜4台 |
| ストレージノード | 8台以上 |
| クライアント / GPUノード | 複数台 |
| ネットワーク | 100 GbE以上 |
| ZFS構成 | 大容量HDD + NVMe Special VDEV + SLOG |
| AIGFS設定 | Directory Striping、Num Targetsの調整 |
ZFSはローカルノード内のディスク管理を担当し、AIGFSは複数ノード間の分散ファイルシステムを担当する。
| レイヤー | 主な役割 |
| ZFS | ローカルディスクの保護、データ整合性の維持、キャッシュ、Dataset管理 |
| AIGFS | クラスタ全体の単一名前空間、分散I/O、クライアントアクセス |
ZFS RAIDZはローカルノード内のディスク障害に対応する。
AIGFSのノード障害対策とは別のレイヤーである。
そのため、本番環境では以下を検討する。
special vdevに障害が発生すると、pool全体に影響する可能性がある。そのため、special vdevは必ず mirror以上で構成する。
ZFS上に AIGFSを構築する構成は、ローカルストレージの信頼性と、分散ファイルシステムのスケールアウト性能を組み合わせる有効なアーキテクチャである。
特に、HDD大容量ストレージに NVMe special vdevを組み合わせることで、大容量データとメタデータ性能の両立が可能となる。
一方で、ZFSと AIGFSは異なるレイヤーで動作するため、障害設計、snapshot整合性、target配置、directory striping、metadata性能を十分に考慮する必要がある。
本構成を適切に設計することで、AI学習データ、HPC、研究データ、解析基盤、大容量ファイル共有などに適した高性能・大容量ストレージ基盤を実現できる。