Software RAID on Windows



センチュリー 裸族のインテリジェントビル USB3.0+eSATAコンボ RAID機能付3.5インチSATA-HDDケース CRIB35EU3


Norton Ghost 15.0


WebサーバーをVMWare上の仮想マシンで動かすことにした。


バックアップはhost OS側にNorton Ghost 15.0を入れて外付けのHDDに日々、差分バックアップをするようにしてある。たぶん、まともなサーバー管理者が見たら「その発想は無かった」と言うか「頭おかしいんじゃないの?」と言うかどちらかだろう。


そんなに大きなお金が動くサイトではないので、サーバーマシンが丸一日止まってようがたいした損害ではないのだけど、HDDが破損した場合、前回バックアップからそこまでの決済の記録自体が吹っ飛ぶ。これはさすがに問題だ。ゆえに、DB用のHDDは常時ミラーリングしておきたい。


普通、こういうのは、RAIDを組むとか、iSCSIで共有ストレージを用意するとかすると思うのだけど、私はRAIDがどうも信用できない。


例えばお手頃価格のセンチュリー 裸族のインテリジェントビル USB3.0+eSATAコンボ RAID機能付3.5インチSATA-HDDケース CRIB35EU3のレビューを見ていると、RAIDコントローラーが破損したとか、Western DigitalのHDDは認識しないだとか、挿し込んでいてもしばらくすると電源ソケットが抜けるだとか、HDDのリビルドに失敗するだとか、評判がすこぶる悪い。


そもそもHDDなんて単体でもそうそう壊れるもんじゃない。それなのにRAIDにするとどうしてそんなに災が降って湧いたようにやってくるのだ?センチュリーの製品がたまたま粗悪品なのか?


まあ、ともかく、USBのHDDとPC本体に内蔵しているHDDとでミラーリング出来ないのか?


いや、欲を言うなら、他PCの内蔵HDDとミラーリング出来ないのか?
それが出来るなら新たなハードを買い足す必要は無いわけだ。


WindowsXPミラーリング


まず、WindowsXP Professional(Homeは不可)には、もともとミラーリングの機能が備わっている。しかしミラーリングするためには、双方のHDDがダイナミックディスクでなければならない。USBやIEEE1394で接続する外付けHDDはダイナミックディスクには成れない。


しかし、WindowsXPの時は、レジストリをいじるだけでこの制限を取り払えた。


IEEE1394経由のHDDにダイナミックディスクを適用する
http://journal.mycom.co.jp/column/winxp/049/index.html


Vista以降のミラーリング


Vista以降、この技は使えなくなっている(と思う)。もしかしたら、どこかのレジストリをいじればこの制限が解除できるのかも知れないが、私はその情報が見つけられなかった。


また、Vistaになって、ダイナミックディスクの内部形式がWindowsXPのときから変更された。WindowsXPの時とは互換性も無くなったのでWindowsXPで用意したダイナミックディスクになっているUSB接続のHDDをVista以降で使うということも出来ない。


ゆえに、外付けHDDとミラーリング普通は出来ない。


VMWareを使う場合のミラーリング


しかし、VMWare上の仮想マシンなら話は別だ。外付けHDD上に作ったVMWare用のHDDイメージは、guestマシンにとっては単なるSCSIのHDDに見えている。当然ダイナミックディスクにも変換できるわけで、ミラーリング出来る。


ミラーリングする前のHDDの速度。


ミラーリング設定中。


ディスク0の実体は内蔵HDD。
ディスク2の実体はUSB3.0接続の外部HDD。


HDDの速度を測定。


Windows7では、ミラーリングした場合、読み出しの時は基本的に片側のHDDからしか読み出さないらしく、readが高速化していない。何故こんな仕様になっているのかさっぱりわからないのだが…。


本当、腹立たしい。RAID0+1っぽくなるようにreadの時にきちんと両方のHDDから読み出すような仮想RAID driverを作ってやろうかと私は真剣に悩んだ。


■ ネットワーク上にある他マシンの共有フォルダとミラーリングする場合


ともかく、外付けHDDとミラーリングが出来たということは、ネットワーク上のドライブともミラーリング出来るはずだ。ネットワーク上にある他マシンの共有フォルダ上にVMWareのゲストOS用のHDDを一つ作った。


ディスク0の実体は内蔵HDD。
ディスク2の実体はネットワーク上の別マシンの共有フォルダ(USB2.0接続の外付けの遅いHDD。転送速度15MB/s程度)



writeはこの遅いHDDに引きずられているが、readはほとんど影響を受けていない。これは片側のHDDからしか読み込まないことが、さきほどとは逆に、功を奏している。


これなら、別PCであっても、別PCの内蔵HDDとなら実用的な速度でミラーリング出来そうだ。(ネットワーク越しなのでlatencyはそこそこあるが、readは内蔵HDD側から読み出すし、writeもNASだと思えば許せる範囲に収まるだろう)


VMWareのワーキングディレクト


私は機嫌をよくしたところで、さきほどの外付けHDDと内蔵HDDとのミラーリング構成に戻して、再度ベンチを取ったところ…。




あれあれ?writeが半分以下に落ちましたよ?さっき見ていたのは幻か?


よく考えると、VMWare仮想マシンのスナップショットをとった場合、ゲストマシンからのそれ以降のディスクへの書き出しは、VMWare仮想マシン設定の「ワーキングディレクトリ」で設定したフォルダに新しいファイルを作って、そのファイルに対してなされる。



VMWareを使っていない人には意味が伝わらないかも知れないが、VMWareはこのようにスナップショットをとっておき、その時点まで巻き戻す機能があるのだが、巻き戻せるということは、スナップショットをとった時点のHDDの実体ファイルにはそれ以上手を加えてはいけないということであり、それゆえ、スナップショット直後からのゲストマシンでのHDDへの書き込みは、新しいHDDの実体ファイルに書きだしていくという仕組みになっているのだ。


ミラーリングのためにわざわざ片方のHDDの実体ファイルを外付けHDDに配置していたのに、スナップショットを取るとワーキングディレクトリ(これは本体内蔵HDD)にそれ以降のHDDの実体ファイルが出来てしまうので、これではまずいということがわかった。


実運用しているDBはスナップショットを取って巻き戻すことはあまり考えられないので(日々のバックアップはあるわけだし)、これはまあ良しとしよう。


VMWareのワーキングディレクトリをRAM Diskに


VMWareでguestマシンが書きだすファイルをhostマシンのRAM Disk上に配置すればどれくらい速くなるだろう?


hostマシンにRamPhantomEx(→ http://d.hatena.ne.jp/yaneurao/20110108 )を入れて、4GBのRAMを作り、VMWareのワーキングディレクトリとして、そのRAM Diskを指定し、そして、仮想マシンのスナップショットを取れば以降の書き出しはこのRAM Diskになるはずである。


guestマシンで測定してみた。


特定ファイルだけではなくすべてのファイルの書き出しが速くなっているのでそこそこ快適だ。readも速くなっているが、これはCrystalDiskMarkが書きだした一時ファイルを読みだしてその読み込み速度を測定しているわけで、その書き出しはhostマシン側のRAM Diskに書き出されているのから、それを読み込むのは速くて当然だろう。guestマシンを起動してから書きだしたファイル以外は、ホストOS側の内蔵HDDから読み込むことになるので100MB/s程度しか出ない。


RAM Diskの容量はゲストマシンでファイルを書きだすごとに際限なく減っていくので長時間作業しようと思うと8GB〜16GB程度は少なくとも欲しい気がする。あと、私はゲストマシンを使い終わったら、RAM Diskの内容を破棄して二つ前のスナップショットまで戻しているが、このとき他のコンピュータなどにデータを保存していないとHDDが巻き戻されて作業データが消えるので注意が必要。


ワーキングディレクトリをSSDにして試してみたいところではあるが、適当なSSDが手元にないのでそれはまたの機会に。


VMWareでストライピング


外付けのHDDとストライピングすればread/writeの速度はおおよそ倍になるはずだ。やってみた。



ディスク2の実体は内蔵HDD。
ディスク3の実体はUSB3.0接続の外部HDD。


確かにおおよそ倍の速度になっている。512Kのreadが遅いのは、事前にHDD容量を固定で確保しておかなかったからファイルを作るのに時間がかかったのかも。


ともかく、guestマシン側で使うDropbox用のフォルダなどは耐障害性のことは気にしなくてもいいと思うので、このようなストライピングに構成すればread/writeが倍速になって気分がいいだろう。


Windows7でRAID10


ミラーリングしているのにreadが倍速にならないのはやはり納得がいかない。


外付けHDDとなんとかRAID10に出来ないものかと考えたところ、VMWareのguestマシンにさらにVMWareをインストールして、
1) VMWareのguestマシンではミラーボリューム×2セット
2) VMWareのguestマシンのguestマシンでは↑で構成されたストライプボリューム
というようにして使えばreadが倍速になるのではないかと思った…が、そこまですることもないかと思ってやってない。



Windows7でRAID5


Windows7ではRAID5はグレー表示されていて選択が出来ない。Windows7ではソフトウェアRAIDは不可で、ハードウェアRAIDのみのサポートらしい。


WindowsServer2008のほうでは選択できるらしいので、わざと選択できなくしてあるのだと思う。レジストリをいじればどうにかなるのかも知れないが、よくわからない。


ちなみに、ゲストOSをWindowsServer2008R2にして、ホスト側の内蔵HDD,外付けHDD、別PCの内蔵HDD、もう一つ別PCの内蔵HDDみたいな構成でRAID5にすることは可能だろう。2台のHDDはホスト側のPCに直結されているので市販のNASと比べれば格段に速いと思う。


WindowsXPでRAID5


WindowsXPだとpatchを当てればRAID5が可能になるらしい。
http://www.tomshardware.com/reviews/windowsxp-make-raid-5-happen,925.html
http://www.tomshardware.com/reviews/windowsxp-make-raid-5-happen,925-2.html


dmadmin.exeの"ServerNT"という文字列を“WINNT”に置換しているだけ。
しかしProduct Typeの変更なのでWindowsのライセンス違反ではないかと思う。


VMWareで擬似ストライプボリューム


Striping VMWare disks across physical drives
http://communities.vmware.com/message/290921


に面白いアイデアが書いてあった。


vmware-vdiskmanagerでvmdk(HDDの実体ファイル)を100MBずつに細切れにして、それをCドライブとDドライブとに交互に配置するというものだ。なるほど、こうしておけばストライピングしているような性能が出るかも知れない。


VMWareのゲストマシンのストライプボリュームをホスト側から


VMWareのゲストマシンのストライプボリュームにフォルダ共有をかけてホスト側からアクセスしてみたときの速度は?


遅い。遅すぎる。HDD単体より遅い。
VMWareのネットワークカードのドライバの性能が悪いのではないかと思う。


ゲストマシン側でミラーボリュームにしてNAS代わりに使う場合でもこれ以下の性能しか出ないということなので覚悟しておいたほうがいいだろう。


■ フィルタドライバで固定ドライブ化


そもそもホスト側で内蔵HDDとUSB外付けHDDとでストライプボリュームに出来ないのは、USB外付けHDDが固定ドライブではないからだ。


固定ドライブとして見せかけるフィルタドライバを使えばいいのだが、EeePCSDHCカードを固定ドライブに見せかけるhackで使われている日立のフィルタドライバがある。


EeePC901のSDHCカードスロットをHDD化する手順
http://saranrappo.blog91.fc2.com/blog-entry-33.html


私がやってみたところWindows7(x64)ではドライバとして認識しなかった。x64非対応なのかな?はてはて…。[あとでもう少し調べる]


市販品としては「f2d」の後継の「プチフリバスター Duo drive」に、USBドライブを固定ドライブとして見せかける機能がある。


[もう少し実験して追記するかも]