ストレージのライフサイクルとZFS
zfs on linuxのversion 0.8.0が5月末にリリースされました。新しいFeatureはReleaseページにあるのですが、今回は新しい機能であるzfs Device Removal(#6900) の挙動を確認しつながら、ロングスパンでのzfsの拡張可能性について考えてみたいと思います。
zfsは、ストレージプールに新たなボリュームをコマンド一発(
$ zpool add [pool] [device]
)で追加することができます。お客様の中にもこのようにしてストレージを拡張されている方は多いのですが、何度も拡張を繰り返していくと最初のボリュームを構成しているハードウェア、ディスクは当然古くなっていくわけで、10年も20年も拡張し続けることはできません。
また、どこかのタイミングでこれを一気にリプレースするとなると、既存のストレージより大きなサイズのストレージが必要になり、多くの予算が必要になります。また、既存のストレージの中には1,2年前に増設したばかりのものもあるかもしれません。
例として以下の図のようなケースで考えてみます。初年度に40TBを導入し、翌年に80TB増設、4年目に50TBを増設して、約170TBのzfsのストレージプールを持っているようなケースです。
この後、仮に何らかの理由で最初に導入した40TBを継続して利用するのが難しいという状況になったとしても、データは3つのストレージにまたがって保存されているので、ファイルシステムのレベルで40TBのディスクに書き込まれたデータだけを取り出すことはできません。
そうすると、冒頭で書いたように全体をリプレースするしか選択肢は無いのでしょうか。
そのような問題意識から今回のテーマであるzfsのDevice Removalの機能を使う方法を試してみました。
具体的には、以下の図のように100TBのストレージを増設した上で、40TBの領域をストレージプールから削除する、というコマンドを実行します。これが実行されると、バックグラウンドで40TBの領域にあるデータが残りのデバイスにRe-Allocateされ、完了すると40TBのディスクがプールから削除されます。そしてディスクの容量も170TBから230TBになります。(実際には、増やしてから減らすので170TB -> 270TB -> 230TBという推移です。)
この機能を使うと、何年かおきにデバイスを一つずつ置き換えながら徐々に増やしていくということが可能になりそうです。
zpool removeの挙動
では実際に、Device Removalの挙動を見てみたいと思います。準備
- まず, zfsのプールを作成します。
- 次にzfsのファイルシステムを作成します。
- remove時の挙動を確認するためにも100GBちょっとのデータをコピーしておきます。
- さらにプールを2つ追加し、データをコピーして以下の状態を作ります。
zpool removeの実行
上の状態から、10.9TBのsddを追加し、7.27TBのsdeを削除します。- デバイス毎のデータのアロケーションを見ると追加したばかりのsddには当然何のデータもありません。
- この状態で、zpool remove を実行します。
Re-Allocation中の挙動
- zpool iostatで各デバイスのDisk IOを見てみると、sdeからREAD、sdf,sdg,sddにWriteのIOが発生しています。
- zpool status -vでも状態が確認でき、Evacuationが進んでいることがわかります。
完了後の状態
- zpool statusからもsdeの表示が無くなりました。また、zpool removeの実行時のサマリーも表示されています。
- zpool list では以下のようにsdeにあったデータが他のデバイスにコピーされトータルの容量が同じになっていることがわかります。