ZFSの構成
ZFSでは,RAIDを使い複数のディスクをまとめて利用するボリュームマネージャの機能と, ファイルシステムの機能を両方持っている.
ボリュームマネージャに相当するコマンドを zpool
,ファイルシステムに相当するコマンドを zfs
が担当する.
zpool
ZFSを利用するには、まず zpool
コマンドで,単一,あるいは複数のディスクからストレージプール (以下プールと表記) を作成しることが必要である.
ZFSでは以下のRAID機能を組み合わせて利用することができる.
- 単なるストライピング (RAID0相当)
- ミラーリング mirror (RAID1相当)
- シングルパリティ raidz (RAID5相当)
- ダブルパリティ raidz2 (RAID6相当)
- トリプルパリティ raidz3
- ホットスペア
RAIDZとRAID5の違い
RAIDZも,RAID5もN本のディスクから,N-1本分のサイズが利用でき,1台の故障まで耐えられるという基本的な機能は変わらない.
しかし,RAID5には書き込み中に電源断等が発生し,中途半端に書き換えが行われると,検出自体が不可能なデータ破壊が発生する,書き込みホール問題と呼ばれる問題がある. 高級なRAIDシステムでは、NVRAMとバッテリーを搭載するなどの方法で停電時における書き込みホール問題に対処しているものもある.
一方,RAID-Zでは,全てのブロックに対して256ビットのチェックサムを読み込み時に確認することになっている.これにより不整合が発生している場合に,検出することが可能となった.また,コピーオンライトを採用しているため,不整合を検出した場合には変更前の状態に戻すこともできる.
不整合がファイルに起きた場合にはまだいいが,ディレクトリ構造等の変更中に発生した場合には,最悪の場合多くのファイルに影響する可能性がある. ZFSであれば,書き込み中であった変更は失ってしまうかもしれないが,問題が起きる状態の直前まで戻るため,ファイルシステム全体の破壊は避けることができるのである.
zfs
zpool
で作成されたプールを,さらにデータセットという単位に区切って利用する.データセットはファイルシステムとしてそのままマウントすることもでき,必要であればブロックデバイス (zvol) として作成することもできる.
いわゆる一般的なパーティションとの違いはサイズを指定しないところにある.ファイルが操作される度に,必要な量だけがプールから動的に確保される.そのため,事前に必要なサイズを想定する必要がない.
ZFSの以下の機能はこのデータセット単位で利用することができる.
- 圧縮
- 重複排除 (dedup, 個人的に非推奨)
- 暗号化 (Solarisのみ)
- スナップショット
- スナップショットの転送
dedupは非推奨?
重複排除機能は、同じブロックを含む場合には共通のブロックを利用することができる機能で,場合によっては大きくディスク容量を節約することができる魔法の機能である.
しかし,この機能,ディスクは節約されるが,メモリをたくさん使うのだ.なぜかというと,メモリ上に DeDuplicationTable (DDT) と呼ばれるテーブルを準備することによって,重複を見つけているのである. 計算手順は省略するが,1TBを利用している場合に最大で約32GBのメモリを必要とし.メモリから溢れた分はディスク上のキャッシュに退避され,検索パフォーマンスが劇的に低下する.
著者が試したときにはあまりのメモリ不足のために,データセットの削除ができない程の状態となった.(1週間程度経っても完了せず,あきらめてプールごと破壊することにした)
このようにメモリ食いで,危険な機能なので安易に利用しないことをお勧めする.