これまでのあらすじ:
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な機能が使えるようになります:
- NCQが使えて高速に
- ホットスワップ可能に
といったところが具体的なメリット。デバイス名が /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台分出る)。
これでさらにいじくりまわせます。