2009年4月28日火曜日

ZFSのミラー状態ストレージプールを、リプレースで拡張する

ZFSは柔軟な拡張も売り、というからには当然このくらいできるだろ?
ということを実験してみた。
 
 

ZFSのストレージプールは、デバイスを適当にAddしていくだけで容量が増えていく。
ではミラーリングで作られたプールはどうなの?
 

ミラーリングのストレージプールを用意する


Solaris10で実験、ZFSのバージョンは 10 ね。
まずは "mkfile" コマンドで 512MB と、1024MB のファイルを それぞれ2つずつ作成。
 

$mkfile 512m /zdev/512M-1
・・・


ファイルがそろった。

$find /zdev -type f | xargs du -h
512M /zdev/512M-1
512M /zdev/512M-2
1.0G /zdev/1024M-1
1.0G /zdev/1024M-2

 

では 512MB のほうを使ってZFSストレージプールを作成しよう。もちろん "mirror" オプションを忘れずに。

$zpool create m512 mirror /zdev/512M-1 /zdev/512M-2

 

$zpool status m512
プール: m512
状態: ONLINE
スクラブ: 何も要求されませんでした
構成:
 
NAME STATE READ WRITE CKSUM
m512 ONLINE 0 0 0
mirror ONLINE 0 0 0
/zdev/512M-1 ONLINE 0 0 0
/zdev/512M-2 ONLINE 0 0 0
 
エラー: 既知のデータエラーはありません
 
$zfs list m512
NAME USED AVAIL REFER MOUNTPOINT
m512 89.5K 472M 1K /m512


m512 という 472MBのプールができました、ちょっと減るのはメタ情報領域がいるから。
ちなみにZpool名の初めの文字には 0-9 が使えない、デバイスの最低サイズは64MBから。
 
 



ミラーリング拡張方法の説明


デバイスとして 512MBのファイルが2つ使われているストレージプールに対して、中身のデバイスを 1024MBのファイル2つに 置き換えてしまうという作戦。
 
ZFSストレージプールでは、既存ものと同一か、より容量が大きいものであればデバイスの置き換えが可能なのだ。そして置き換えで発生した余剰サイズは無駄にならない、再計算されちゃんと最大容量が使用される。
 
 


デバイスを順繰りに置き換えていく


では リプレースしてみよう。
まずは 512MB のうち1つを 1024MB に置き換え。

$zpool replace m512 /zdev/512M-1 /zdev/1024M-1
 
$zpool status m512
プール: m512
状態: ONLINE
スクラブ: Mon Apr ** **:**:** 2009
上で 0 エラーが発生した 0h0m のあとの resilver completed構成:
 
NAME STATE READ WRITE CKSUM
m512 ONLINE 0 0 0
mirror ONLINE 0 0 0
replacing ONLINE 0 0 0
/zdev/512M-1 ONLINE 0 0 0
/zdev/1024M-1 ONLINE 0 0 0
/zdev/512M-2 ONLINE 0 0 0
 
エラー: 既知のデータエラーはありません


リプレースというステータスを経て、めでたく置き換わる。所要時間はZFS上のファイル容量に比例するかな。
 

$zpool status m512
プール: m512
状態: ONLINE
スクラブ: Mon Apr ** **:**:** 2009
上で 0 エラーが発生した 0h0m のあとの resilver completed構成:
 
NAME STATE READ WRITE CKSUM
m512 ONLINE 0 0 0
mirror ONLINE 0 0 0
/zdev/1024M-1 ONLINE 0 0 0
/zdev/512M-2 ONLINE 0 0 0
 
エラー: 既知のデータエラーはありません
 
$zfs list m512
NAME USED AVAIL REFER MOUNTPOINT
m512 106K 472M 18K /m512


OK、この状態でサイズが拡張しないのはミラーとして当然な。
ではもう一丁。

$zpool status m512
プール: m512
状態: ONLINE
スクラブ: Mon Apr ** **:**:** 2009
上で 0 エラーが発生した 0h0m のあとの resilver completed構成:
 
NAME STATE READ WRITE CKSUM
m512 ONLINE 0 0 0
mirror ONLINE 0 0 0
/zdev/1024M-1 ONLINE 0 0 0
/zdev/1024M-2 ONLINE 0 0 0
 
エラー: 既知のデータエラーはありません


と、完全にミラーリングのデバイスを置き換えることに成功。ここまで完全Online、ファイルアクセスの停止は無し。
 
 

サイズを確認しよう 1


512MB 2つで組んだミラーは、生まれ変わるまでもなく今や1024MB 2つとなった。もちろん間にデグレード状態も挟まないぞ。
 

さあZFSのサイズを確認しよう
$zfs list m512
NAME USED AVAIL REFER MOUNTPOINT
m512 106K 472M 18K /m512

あれー? 変わってないや。
 
ミラーは拡張できないの?いやそうでもない、次でやりかたを。
 
 

サイズを確認しよう 2


この状態からサイズ拡張をさせるには、確認できた手順で2通りある。※サーバの再起動はしてないので未確認
 

■エクスポート&インポート
$zpool export m512
$zpool import -d /zdev/ m512

これはまあ確実だ、もともとZFSではサイズなんて後から付いてくるものだから。
 

■もう一度デバイス操作
$zpool replace m512 /zdev/1024M-1 /zdev/1024M-3

この例では1024MBファイルの3つ目をつくってデバイスの置き換えをもう一度やっている、これでサイズの再計算がおこなわれるのか、使用可能サイズが拡張される。
ミラー中の片割れをデタッチ&アタッチでもいいかもしれない。
 


どちらかをやったあとにサイズを確認しよう。
$zfs list m512
NAME USED AVAIL REFER MOUNTPOINT
m512 112K 984M 18K /m512


ほら拡張している。
 
 

おわりに


なんでこの実験をしたかということを少し。
社内向けファイルサーバとしてZFSが使える環境を考えたのがきっかけ。容量の追加によるストレージ拡張は社内共用サーバとしてよく課題に上げられるので、それをZFSが楽にしてくれないかと考えた。
 

Solaris+ZFS は CIFS をサポートしているので、ADサーバがある環境には容易に突っ込むことができるだろう。ミラーであれば構築時にいろいろ融通がきくうえ、拡張が自由となればさぞ柔軟性も高かろう。
(※ZFSのiSCSIも面白いんだが、拡張に不向き)
 
弾さえ用意すれば幾らでも容量を拡張してくれるファイルサーバって素敵やん?
 

ただ、Solarisを運用する気になるか、という点では敷居がちょっと高いのかな。マニュアル充実なので、まとまった時間さえとれればと思いますが。