ZFSを使ってみる

これまでのあらすじ:

  1. Linux mdに疲れ果てる。)
  2. HP ProLiant Microserver購入&放置。
  3. 家のサーバが台風でブッ壊れる。2系統のアレイが2系統とも死亡。
  4. 重い腰を上げてサーバを作りはじめる。ZFSが使いたいのでFreeBSD 8.2Rで構築開始。
  5. ようやくUSBブートまわりの感じがわかって動くようになる。

ZFSテストドライブ

今回は実験です。

  • RAIDZの柔軟性はどのくらい?RAIDに後から容量足せたりする?

がテーマ。ZFSのraidzを構成にディスクに追加することは、出来ません (ZFS v22の話)というのだけど、ZFSってそのくらいもできないの?と思い、自分でもやってみました。

用語

ZFSは自分的に期待が大きく、しかし実態がよくわかっていませんでした。以下はやってみてから書いた「初心者なるほど用語集」です:

ZFS
Zetta File System。Sunが開発してきた「究極のファイルシステム」。柔軟で安全なボリューム管理が可能で、デバイスの付け外しやバックアップが楽というのがウリ。オープンソースで開発されており、Solarisに搭載されたあとFreeBSDにも移植され、ネイティブに使えるようになった。
zfs
小文字で書いてある場合はファイルシステム管理用のzfsコマンドのことを指す場合が多い。http://www.jp.freebsd.org/cgi/mroff.cgi?sect=8&subdir=man&lc=1&cmd=&dir=jpman-7.1.2/man&man=zfs
ストレージプール
ZFSで一番大きな管理単位。ドライブやパーティションを集めて構成し、ここからファイルシステムを切り出す。
zpool
ストレージプールの管理コマンド。zpool [サブコマンド] [対象]のシンタックスhttp://www.jp.freebsd.org/cgi/mroff.cgi?sect=8&subdir=man&lc=1&cmd=&dir=jpman-7.1.2/man&man=zpool
RAID
Redundant Arrays of Inexpensive Disks/安物のディスクを並べて冗長性を持たせることで耐障害性の高いディスクを構成しようという、貧者の高可用性システム。破壊的イノベーション
RAID5
1台壊れても大丈夫だが1台分の容量が使えなくなるRAID。沢山のドライブで構成するほど無駄が減るということ。どの1台が壊れても全データが復旧できる。2台壊れたらアウト。
RAIDZ
またの名をRAIDZ1。better RAID5であり、RAID5のアルゴリズム的弱点を克服。
RAID6
2台壊れても大丈夫だが2台分の容量が使えなくなるRAID
RAIDZ2
better RAID6であり、RAID6のアルゴリズム的弱点を克服。
tank
ZFSで遊ぶとき、ストレージプールとしてよく使われる名前。
AHCI
Advanced Host Controller Interface。SATA2.5で採用されたSerial ATAネイティブのインターフェイス体系。PATA時代のしがらみを捨てて便利になった。SATA3.x現在のデバイスでも明示的にオンにしないと使われずにPATA互換モードになってしまう。
NCQ
Native Command Queuing。読み書き命令をデバイスの都合に合わせて並べ替えることで、同じ基本性能(回転速度・シーク速度)のドライブを高速化する。昔はIDEに対するSCSIの優位性のひとつだった。以前実装されたTagged Command Queuingでは性能が出なかったもよう。
ホットスワップ
通電したままデバイスを入れ替えること。通電したまま入れ替えても壊れずにOSから認識されて使えることまでを含む場合が多い。

手順

  • ストレージプールをRAIDZで作る
  • zpool addでディスクを追加する実験をする

である。

まずzpoolを作る

heliopora# zpool list
no pools available
heliopora# zpool create tank raidz ad4 ad6
heliopora# zpool list
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
tank  3.62T   153K  3.62T     0%  ONLINE  -
heliopora# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a    7.2G    1.9G    4.7G    29%    /
devfs          1.0K    1.0K      0B   100%    /dev
tank           1.8T     21K    1.8T     0%    /tank

ちゃんとできる。追加してみる。

heliopora# zpool add tank ad8
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: pool uses raidz and new vdev is disk

なんかエラー出た。-fでやる。

heliopora# zpool add -f tank ad8
heliopora# zpool list
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
tank  5.44T   148K  5.44T     0%  ONLINE  -
heliopora# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a    7.2G    1.9G    4.7G    29%    /
devfs          1.0K    1.0K      0B   100%    /dev
tank           3.6T     21K    3.6T     0%    /tank

うまくいったのかと思いきや

heliopora# zpool status
  pool: tank
 state: ONLINE
 scrub: none requested
config:

     NAME        STATE     READ WRITE CKSUM
     tank        ONLINE       0     0     0
       raidz1    ONLINE       0     0     0
         ad4     ONLINE       0     0     0
         ad6     ONLINE       0     0     0
       ad8       ONLINE       0     0     0

errors: No known data errors
heliopora# 

raid外に追加してる〜。こんなのいらない…

heliopora# zpool destroy tank
heliopora# zpool create tank raidz ad4 ad6
heliopora# zpool list
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
tank  3.62T   153K  3.62T     0%  ONLINE  -
heliopora# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a    7.2G    1.9G    4.7G    29%    /
devfs          1.0K    1.0K      0B   100%    /dev
tank           1.8T     21K    1.8T     0%    /tank

元に戻して作り直した。今度は追加のときもraidzを指定してみる。

heliopora# zpool add tank raidz ad8
invalid vdev specification: raidz requires at least 2 devices

2台は必要だよ、と。では2台で。

heliopora# zpool add tank raidz ad8 ad10
heliopora# zpool list
NAME   SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
tank  7.25T   159K  7.25T     0%  ONLINE  -
heliopora# 

成功っぽい。と思ったら容量が足りない:

heliopora# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a    7.2G    1.9G    4.7G    29%    /
devfs          1.0K    1.0K      0B   100%    /dev
tank           3.6T     21K    3.6T     0%    /tank

3.6TB。5.4TBになってほしいのに。statusを見ると

heliopora# zpool status
  pool: tank
 state: ONLINE
 scrub: none requested
config:

     NAME        STATE     READ WRITE CKSUM
     tank        ONLINE       0     0     0
       raidz1    ONLINE       0     0     0
         ad4     ONLINE       0     0     0
         ad6     ONLINE       0     0     0
       raidz1    ONLINE       0     0     0
         ad8     ONLINE       0     0     0
         ad10    ONLINE       0     0     0

errors: No known data errors

raidz1のアレイを2個重ねただけのものが出来たみたい。これはこれで使えるね。

結論
RAIDZにデバイスを追加することはできない。

Linux mdよりはずっと柔軟で使いやすいけど、びみょーに期待外れです。
そもそも上のid:fujisan3776さんの実験はSolarisなので、より新しいZFSバージョンを使って駄目だったということ。FreeBSDでやっても無駄でした。自分でやってみる価値はあったと思うけど。

AHCIの効果

上の実験の後でAHCIをオンにしました。これにより、SATA2.5のネイティブSATAな機能が使えるようになります:

といったところが具体的なメリット。デバイス名が /dev/ad4 ad6 ad8 ad10 のときはAHCIオフ。ada[0-3]のときはオンです。

操作:
/loader.confでahci_load="YES"
http://blog.livedoor.jp/dankogai/archives/51697097.html
だけです。ブート時の認識メッセージが:

ada0:  ATA-8 SATA 3.x device
ada0: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada0: Command Queueing enabled
ada0: 1907729MB (3907029168 512 byte sectors: 16H 63S/T 16383C)

に変わります(これで1台分。4台分出る)。
これでさらにいじくりまわせます。