LinuxにおけるZFSマスターガイド:高度なストレージ管理の実践

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Ext4やXFSを超えて

多くのLinux管理者はExt4やXFSからキャリアをスタートさせます。これらは信頼性の高いファイルシステムですが、統合されたボリューム管理やデータ破損への対策という点では不十分な場合があります。ZFS(Zettabyte File System)は、ファイルシステムと論理ボリュームマネージャーを統合することで、ストレージ管理を再定義します。単にデータを保存するだけでなく、物理プラッタ上で0が1に反転してしまう「ビットロット(静的なデータ化け)」という稀ながらも致命的な現象から、データを能動的に保護します。

技術的には、ZFSはCopy-on-Write(CoW)という仕組みに基づいています。標準的なシステムではデータをその場で上書きするため、書き込み中に停電が発生するとリスクが伴います。対照的に、ZFSはポインタを更新する前に、新しいデータを空きブロックに書き込みます。書き込み中にサーバーの電源が落ちても、古いデータは手つかずのまま有効な状態で残ります。このアーキテクチャにより、標準的なパーティションでは実現できないレベルのデータ安全性が提供されます。

システムへのZFSの導入

ライセンスの違い(CDDLとGPL)により、ZFSはLinuxカーネルのメインツリーには含まれていませんが、OpenZFSプロジェクトのおかげで、最新のディストリビューションへのインストールは非常に簡単です。UbuntuやDebianであれば、数秒で準備が整います。

まず、ローカルリポジトリを更新し、ユーティリティパッケージを取得します。

sudo apt update
sudo apt install zfsutils-linux

AlmaLinux 9やRocky LinuxなどのRHELベースのシステムでは、まず公式のOpenZFSリポジトリを追加する必要があります。

sudo dnf install https://zfsonlinux.org/epel/zfs-release-el9.noarch.rpm
sudo dnf install kernel-devel zfs

パッケージのインストールが完了したら、カーネルモジュールをロードしてZFSサポートを有効にします。

sudo modprobe zfs

初めてのストレージプールの構築

個別のパーティションや /dev/sda1 といった従来の考え方は一度忘れましょう。ZFSは物理ドライブを zpool という単位でグループ化します。このプールをストレージの巨大なバケツと考えてください。このバケツから、ファイルシステムのように振る舞つつプールの総容量を共有する「データセット」を切り出すことができます。

ミラープールの作成

2台の予備の1TBドライブ(例: /dev/sdb/dev/sdc)がある場合、ミラープールを作成できます。これは実質的にRAID 1と同じです。警告: 以下のコマンドを実行すると、対象ドライブ上のすべてのデータが即座に消去されます。

sudo zpool create mypool mirror /dev/sdb /dev/sdc

ZFSはこの新しいプールを /mypool に自動的にマウントします。ZFSは起動時に独自のマウントロジックを処理するため、 /etc/fstab を編集する必要はありません。

データセットによる整理

すべてをプールのルートに放り込むのではなく、データセットを作成して、データの種類ごとに特定のルールを適用しましょう。例えば、ログには強力な圧縮をかけ、ユーザーデータには厳格なクォータ(容量制限)を設定するといったことが可能です。

sudo zfs create mypool/userdata
sudo zfs create mypool/logs

実践的な効率化:圧縮とスナップショット

ZFSで最初に気づく利点は、透過的な圧縮機能です。データがディスクに書き込まれる前に圧縮されます。これにより物理的なスペースが節約されるだけでなく、ハードウェアへの書き込みブロック数が減るため、多くの場合パフォーマンスも向上します。

メモリわずか4GBのUbuntu本番サーバーで、100GBのログディレクトリに対してLZ4圧縮を有効にしました。 結果は劇的でした。2.15倍の圧縮率を達成し、CPUレイテンシへの影響を全く感じさせることなく、100GBのデータを実質46GBのディスク使用量に抑えることができました。

以下のコマンド1つで、データセットの圧縮を有効にできます。

sudo zfs set compression=lz4 mypool/userdata

インスタント・セーブポイント:スナップショット

スナップショットは、データセットのほぼ瞬時の記録です。Copy-on-Writeの設計により、スナップショット作成直後は追加の容量を消費しません。稼働中のデータセットでデータを変更または削除した分だけ、容量が増えていきます。

大規模なソフトウェアのアップグレードや設定変更の前には、必ずスナップショットを撮っておきましょう。

sudo zfs snapshot mypool/userdata@before-upgrade

万が一アップグレードによってアプリケーションが壊れても、1秒足らずでファイルシステム全体を元の状態に戻すことができます。

sudo zfs rollback mypool/userdata@before-upgrade

ヘルスモニタリングとメンテナンス

ストレージシステムは、健全であってこそ価値があります。ZFSには、データのすべてのビットが正しく保持されているかを検証するためのツールが組み込まれています。

プールのステータス確認

statusコマンドを実行して、ドライブの健全性を確認します。READWRITECKSUM の各列を注意深く見てください。健全なプールでは、これらはすべてゼロであるはずです。

zpool status

プールが ONLINE かどうか、および最後に「スクラブ(scrub)」が実行されたのがいつかの概要が表示されます。スクラブとは、ZFSがすべてのブロックを読み取り、チェックサムと比較してエラーを自動的に修正するディープクリーニングプロセスです。

80%ルールとRAM管理

ZFSは強力ですが、特有の注意点があります。まず、プールの使用率は80%未満に保つようにしてください。このしきい値を超えると、CoWエンジンが連続した空き領域を見つけるのが困難になります。その結果、断片化(フラグメンテーション)が発生し、書き込み速度が極端に低下する可能性があります。

次に、ZFSは読み取りを高速化するためにARC(Adaptive Replacement Cache)を使用しますが、これは多くのRAMを消費することがあります。メモリが4GBしかない制限のあるVPSなどの場合は、他のアプリの動作を軽快に保つために、ARCを1GBに制限すべきです。

/etc/modprobe.d/zfs.conf に設定ファイルを作成します。

options zfs zfs_arc_max=1073741824

保存後、initramfsを更新して再起動し、制限を適用します。

sudo update-initramfs -u

ZFSに切り替えることで、プロフェッショナル級のストレージ基盤を手に入れることができます。従来のパーティショニングから脱却し、プールやスナップショットを活用することで、エンタープライズレベルのデータ保護が可能になります。まずは数台の仮想ディスクで構文を学ぶことから始めてみてください。一度ロールバックの威力を体験すれば、従来のファイルシステムに戻ることは難しくなるでしょう。

Share: