ZFSでzpoolを作成するとき、各デバイスまたはファイルに3種類の役割がある。
データ用、キャッシュ用、ログ用とあるが、zpool構成するときにそれぞれどのように使えるかまとめてみた。
検証に使ったのは取ったのはOpenSolarisのb131、zpoolバージョンは22だ。
デバイスの用途と構成・特徴一覧
ざっとこうなる。
zpool形式 | data | cache | log |
---|
スパン | ○ | ○ | ○ |
ミラー | ○ | × | ○ |
RAIDZ | ○ | × | × |
RAIDZ2 | ○ | × | × |
RAIDZ3 | ○ | × | × |
detach | 条件付○ | ○ | 条件付○※ |
ファイルを指定 | ○ | × | ○ |
dataとlogは似ている
data用は取れる構成コンプリートなのは当たり前だが、detachには制限がある。
logも同様だが、
完全なデータのコピーがないデバイスは取り外せない、すなわちミラー状態の片割れが唯一取り外しOKで他の構成ではそもそも取り外しができない。
もちろんreplaceは可能、順序的にはミラーしてdetachだから当然。
data、logともにmkfileで作成したファイルも指定OK。
raidzはdataのみ、dataもlog
も後からattachでミラーリングデバイスを追加出来る。
追記※
Logは最新のコードでは取り外せるようになってると情報をいただきました。
http://twitter.com/hasegaw/status/15496202547取り外せないことがひそかに疑問だったが、すっきりしました。
cacheは特殊
一方cacheは冗長構成が一切とれない、必要がないからだろう。
また、
デバイスの追加削除に制限がない。中身はあくまでキャッシュにすぎなく、ヒットしない・読み込めない場合はさっさと諦めて削除すればよい。
もう少し触れておくと、cacheには十分に早いデバイスの割り当てが推奨されている。
ミラーをはじめ冗長な構成では読み取りストライピング効果も確かにあるが、書き込みのペナルティが大きいため不向きだ。
また、degradeな状態を想像するといいだろう。
cacheにそんな状態があっては本末転倒だ、リシルバさせる意味も全くない。
高速に動作し、そうできない状態は必要ないのがcacheだ。
ちなみにファイルは指定できない、「ディスクまたはディスクスライスを指定すべき」と断られる。
cacheへの割り当てデバイス、お勧めは
やはりSSDだ。
という感じ。ではついでにZFS利用にあたって私からのTIPSを。
zpoolミラーは多面鏡
zpoolのミラーリングはRAID1ではない。いくつも複製対象が増やせるのだ。
2つでは何かと心配、というときは3つにすればいい。
ミラー台数を増やすたびに
リード性能は向上し、ライトはが下がる。リード重視という環境は多かろうので覚えておくとよい。
3-Way Mirrorの図、attachで作る。もちろん4つ目5つ目を追加していく事もOK。
NAME STATE READ WRITE CKSUM
zfs ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c4t0d0p0 ONLINE 0 0 0
c4t0d0p1 ONLINE 0 0 0
c4t0d0p2 ONLINE 0 0 0
ZILは意外と役に立たない(そんな事は無いというお話を追記してます)
これは特に主観が大きいTIPSなので参考程度に。
(※追記:LOGを別にした場合はかなり勝手が変わります。)
ZIL、まあトランザクションログみたいなのだが、アトミック書き込み、CoWが身上のZFSではイマイチ存在が薄いように思う。
実際どういうケースで役に立つのか、あまり実感がわかないのにZIL有効だとパフォーマンスがものすごく落ちる。
結局のところ、
HDDやストレージ側の障害にZILは無力である。ライトキャッシュ有効のストレージ装置が気まぐれでキャッシュを捨てたとする、別デバイスに取ったZIL上では正常終了なのにデータはおかしい。
逆もそう、HDDが死んでZILごと失った場合もZFSのCoW特性から、ファイルシステム上特に不都合はない。
データの小さい破壊はZFS内でミラーやRAIDZ構成をとっておくことで
チェックサムから復旧でき、そこでもやっぱりZILは関係ない。
さてZIL、有用かな?
さて、ZILに関して有識者の方からご助言をいただきました。Twitter:hasegaw さんより。
ってか、
『Xen徹底入門』とか付箋バリバリなのでえらい驚きましたが(汗
ZILはRAID-Zの上NFSサーバにしたときには効果大。Logデバイスは最新のコードだと取り外し可能に
http://twitter.com/hasegaw/status/15496202547
NFSですか。実は具体的にどう効果がもたらされるのかイメージが・・・
多分非同期だからということが関係してくるんだろう、ちょっと考えておこう。
本文がZILを完全に批判しているようになっているので載せるところまでは早くしないと。
で、答えはこちら。
http://togetter.com/li/27626親切丁寧に教えてもらっちゃいました、なるほどですねえ。
RAIDZはデータをストライプした全デバイスに書く
使用デバイスの台数から
RAIDZ=RAID5、RAIDZ2=RAID6と思ってはいけない。詳しくは書き込みホールの問題を調べたらわかるので割愛する。
で、余所ではあまり触れてないと思ったことについて。
データを全部に書くのでRAIDZにあまり一杯デバイスを並べると書き込みのペナルティが馬鹿にならなくなってくる。
よってRAIDZを構成するのは6-8デバイスにとどめておき、大容量を求めるなら
RAIDZ構成をたくさんストライピングするのが多分賢い。
単純なスパン構成でも、後から冗長化できる(1)
導入時にRAID0っぽい構成にして、後からマズイと思ったりしますか?
zfsだとattachしていくことで冗長構成にする事が可能だ。
たとえばこんなスパンボリューム。
NAME STATE READ WRITE CKSUM
zfs ONLINE 0 0 0
c4t0d0p0 ONLINE 0 0 0
c4t0d0p1 ONLINE 0 0 0
attachであれよと言う間にRAID1+0相当に。 NAME STATE READ WRITE CKSUM
zfs ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c4t0d0p0 ONLINE 0 0 0
c4t1d0p0 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
c4t0d0p1 ONLINE 0 0 0
c4t1d0p1 ONLINE 0 0 0
多少容量は犠牲になるが、RAID0相当の構成はすぐにRAID6以上の稼働率&ハイパフォーマンスを誇る
RAID1+0に進化させることができる。
これも覚えておいて損はないだろう。
単純なスパン構成でも、後から冗長化できる(2:追記)
追加するデバイスなんかネエヨ!って方のためには、copies プロパティの変更をお勧めする。
何が起こるかって言うと、ZFSが書き込むブロックのコピー保持数を指定できるのだ。
なのでコピー=2とすれば複数のデバイス間で同一のブロックを2つ持ってくれるというわけ、hadoopにもこんな機能あるね。
このように設定しよう。
# zfs get copies tank
NAME PROPERTY VALUE SOURCE
tank copies 1 default
# zfs set copies=2 tank
# zfs get copies tank
NAME PROPERTY VALUE SOURCE
tank copies 2 local
これで一応冗長構成になった、容量は半分になるけどな。
ミラーと違うのは、ミラーがどれだけデバイスを追加しても容量が大きくならないのと違い、デバイスを追加したらその半分だけ容量が増えていくことかな。
思いったったら即、実質ミラーリングが可能だ、
デバイスたくさんのZpool
悩むところだが、Log,cacheを入れたら・・・
logをミラー、cacheを複数、dataはRAIDZ以上の複数スパン(または1+0構成)がいいかなあ。
こんな感じ?あくまで一例ね。
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
c4t0d0p0 ONLINE 0 0 0
c4t1d0p0 ONLINE 0 0 0
c4t2d0p0 ONLINE 0 0 0
c4t3d0p0 ONLINE 0 0 0
c4t4d0p0 ONLINE 0 0 0
raidz1-1 ONLINE 0 0 0
c4t0d0p1 ONLINE 0 0 0
c4t1d0p1 ONLINE 0 0 0
c4t2d0p1 ONLINE 0 0 0
c4t3d0p1 ONLINE 0 0 0
c4t4d0p1 ONLINE 0 0 0
raidz1-2 ONLINE 0 0 0
c4t0d0p2 ONLINE 0 0 0
c4t1d0p2 ONLINE 0 0 0
c4t2d0p2 ONLINE 0 0 0
c4t3d0p2 ONLINE 0 0 0
c4t4d0p2 ONLINE 0 0 0
raidz1-3 ONLINE 0 0 0
c4t0d0p3 ONLINE 0 0 0
c4t1d0p3 ONLINE 0 0 0
c4t2d0p3 ONLINE 0 0 0
c4t3d0p3 ONLINE 0 0 0
c4t4d0p3 ONLINE 0 0 0
logs
mirror-4 ONLINE 0 0 0
c4t0d0p4 ONLINE 0 0 0
c4t1d0p4 ONLINE 0 0 0
cache
c4t2d0p4 ONLINE 0 0 0
c4t3d0p4 ONLINE 0 0 0
c4t4d0p4 ONLINE 0 0 0
ちなみにこれ、コマンド一発で構築可能だ。
ZFS特集でした!