This article was translated from English by ChatGPT 5.
ZFS入門#
私のコミュニティに詳しい方ならご存じかもしれませんが、以前のブログサイトが消えてしまったのは、サーバーをZFSへ移行したためでした。
旧ブログではZFSが何であるかを説明していなかったと記憶しています。そこで今回は、ZFSとは何か、そしてなぜ私がメインサーバーにZFSを選んだのかを丁寧に解説します。
構造#
ZFSはもともとSun MicrosystemsによってSolaris向けにファイルシステム兼ボリュームマネージャーとして開発されました。現在はOpenZFSプロジェクトとして維持され、Linuxなどのプラットフォーム上で進化を続けています。
従来、ファイルシステムは「本がどの棚にあるかを知っている司書」のような存在と考えられますが、その本の内容や棚の構造については何も知らない存在でした。
ページがくっついてしまったり(データ破損)、棚自体が崩壊してしまったり(ハード障害)すると、この司書は無力です。
しかし、ZFS(Zettabyte File System)はこのモデルを完全に変革しました。建築家、司書、製本職人を兼ね備えたオールインワンの専門家のような存在です。
ZFSはデータの場所を知っているだけでなく、物理ストレージ(ディスク)の構造を理解し、すべてのデータブロックを継続的に検証します。
従来のようにRAID・ボリューム管理・ファイルシステムが別レイヤーで積み重なるのではなく、ZFSはRAIDコントローラ、ボリュームマネージャ、ファイルシステムを一体化し、統一されたストレージプールを提供します。
この統合により、OSは直接ZFSストレージプールとやり取りし、従来のレイヤー間の情報断絶による非効率やリスクを避けられます。
ZFSのストレージ構造は三層のピラミッドとして理解できます:
- 物理ディスク: 最下層。HDDやSSDなど実際のハードウェア。
- vdev(仮想デバイス): ZFSの基本構成単位。1つ以上の物理ディスクから構成され、データと冗長性の方式を決めます。単一ディスク、ミラー、RAID-Zアレイなどがあります。
- zpool(ストレージプール): 最上位のコンテナ。1つ以上のvdevから構成されます。zpoolが作成されると、その全容量をZFSのすべてのファイルシステム(データセット)で柔軟に利用でき、事前にパーティションを切る必要がありません。
安全性#
冗長性と耐障害性はすべてvdevレベルで実装されます。vdevの種類がプールの性能・容量・安全性を直接決定します。
- ストライプ/単一ディスク: 冗長性なし。性能と容量は最大化されるが、1台でも故障すればvdev全体が失敗する。
- ミラー: RAID 1に類似。各ディスクに同じデータを保持。2台ミラーなら1台故障しても無事。ZFSは3重以上のミラーも可能で柔軟。読み込み性能はディスク数に比例し、書き込みは単一ディスク相当。高IOPS向き。
- RAID-Z: ZFS独自のパリティ方式。従来のRAID 5/6の「ライトホール問題」をCoW(Copy-on-Write)で回避。
- RAID-Z1: 1台分のパリティ、1台故障に耐える。
- RAID-Z2: 2台分のパリティ、2台故障に耐える。
- RAID-Z3: 3台分のパリティ、3台故障に耐える。冗長性が非常に高い。
Copy-on-Write (CoW)#
従来のファイルシステムはデータを上書きするため、書き込み中に電源断が起きれば破損します。
ZFSは決して既存データを上書きしません。変更時の手順は:
- 新しいデータを未使用領域に書く。
- 親メタデータのポインタを新ブロックに更新。
- ポインタ更新はアトミックに行われ、成功か不発かのどちらか。
これにより常に一貫性が保たれ、電源断が起きても旧データは安全です。fsckが不要になります。
スナップショット#
CoWの応用がスナップショットです。指定時点の読み取り専用コピーで、即時作成可能。容量は変更・削除されたブロック分のみ消費。
信頼しない哲学#
ZFSの思想は「ハードウェアを決して信頼しない」。メモリ・ケーブル・コントローラ・ディスクは常に故障し得ると仮定し、エンドツーエンドの多層保護を実装します。
エンドツーエンド検証#
各ブロックにチェックサムを保持し、読み出し時に検証。親ポインタに格納されるため、Merkle木(ハッシュ木)を形成。これにより隠蔽できない完全な信頼連鎖を実現します。
自己修復#
冗長性がある場合、破損を検出すれば正常コピーから復元し、破損データを修復します。さらに定期的なスクラビングで潜在的エラーも洗い出します。
性能#
ZFSはキャッシュとログを駆使して最適化しています。
読み取り#
ARC(適応置換キャッシュ)をRAM上に保持。利用頻度に基づいて効率的にヒット率を高めます。メモリ増設が最も効果的な性能改善。
L2ARCはSSDを使った二次キャッシュですが、インデックス用にRAMを消費するため、むやみに大きくすると逆効果。まずRAM増設を優先すべきです。
書き込み#
非同期書き込みは即完了応答し、高速。同期書き込みはZIL(ZFS Intent Log)に記録されます。SLOG(専用ログデバイス)をNVMeなどに配置すると大幅に性能改善。ただし恩恵があるのは同期書き込みのみ。
代替技術#
ZFS以外にもBtrfsやLVM+ext4/XFSなどが存在。機能比較表は以下の通り。
(省略:表は原文のとおり)
商用の類似技術にはStorage Spaces、Veritas VxVM、Oracle ASM、NetApp ONTAP、Dell PowerScaleなどがあります。
結論#
私のメインサーバーにはECC RAM 96GBがあるため、最終的にProxmox VEに含まれるZFSを選びました。
スナップショットで削除ファイルを復元できた経験から、ZFSは私のお気に入りとなりました。大容量メモリをお持ちなら強くおすすめします。
普段は小説を書くので文の切れ方が少し不自然かもしれませんが、ご容赦ください。これで初心者にも分かりやすいZFS入門を締めくくります。それでは、次回の記事でお会いしましょう 👋