「RAIDがわからない」という話をちょいちょいいただくようになったので、RAIDについて簡単に解説しようと思う。ここでは単純にRAIDのよくある説明をするだけでなく、RAIDの実装や、クラスタストレージなどにおける冗長/高可用実装などについても軽く触れていこうと思う。計算に関しては現実的な色々を抜きにしているので、ツッコミはなしにしてほしい。RAIDの概念RAIDは複数のディスクをまとめて1台のディスクとして取り扱うための技術。ディスクの冗長性を確保する技術だが、RAIDは必ずしも冗長性を持つわけではない。「複数のディスクをまとめる」技術の中のひとつがRAIDであり、同様の技術はRAID以外にも存在する。したディスクをまとめる技術を一般化してRAIDと呼ぶ場合もあるが、RAIDの中に種類があり、その種類を限定することが多いのであまり一般的な用法ではない。メニューがまとめられる程度である。「ディスクアレイ」RAIDで組まれた一群のディスクを「ディスクアレイ」と表現する。(ストライピング)RAID0はデータを分割し、複数のディスクに渡って分散して記録する。ディスク3...と記録していく。このストライプサイズは設定できる場合もある。RAID0は同一データを分散して記録するため、大きなデータをシーケンシャルに読み出す場合にディスク台数にほぼ比例してディスク速度が向上する。ランダムアクセスに対しては、基本的にある程度高速化できる場合が多いが、激しいランダムアクセスがある場合分散記録(ファイルディストリビュート)よりも速いとは言い切れない。ディスク数に上昇する。(ミラーリング)n台のミラーレッグに対して同一のデータを書き込む。簡単なものなので実装しやすく、備わっていることも多く、なおかつ確実に効果が出る。そもそも容量増加の効果がなく、レッグ数が増えても耐障害性は上がるが、容量は増えない。ディスク台数が増えると容量効率はどんどん悪くなる。モダンな実装だと、ミラーレッグ数のミラーを連結した形で扱うことができる(RAID10相当か、RAID1のJBOD)場合がある。ミラーリングでストライピングのような読み出し方をすることも可能ではあるけれども、実際そうなっている実装は稀。(1+0)ストライピングされたディスクアレイをミラーリングするのが01、ミラーセットをストライプするのが10。どちらも高速性と冗長性を確保するものであり、結果だけをみれば同じことになる。処理の仕方の順序が変わることで耐障害性に違いが出る。RAID01の場合、ストライピングされた5台のA群をミラーしたB群が生成される。RAID10の場合、2レッグで構成されたミラーセットが5つあり、ミラーリングされた論理5ディスクをストライピングする。RAID0が破壊される条件は、ディスクアレイのいずれかのディスクが破壊されたときである。RAID01の場合、A群から1台、B群から1台故障が出るとデータは失われる。RAID10の場合は、ミラーが消失する条件は同一ミラーの全レッグが消失したときであるため、「特定の2台」が故障したときにデータが失われる。最小で障害になる台数はどちらも2だが、RAID01の場合は2台目の故障するディスクのうち致命的なのは5/9だが、RAID10の場合は2台目に故障するディスクで致命的なのは1/9である。RAID10のほうが固い。RAID5基本的にはRAID0と同じだが、全部の台数にストライプするわけではなく、1台はパリティというビットxorの情報を記録する。これは、各ディスクのそのビットの和が奇数なら0を、偶数なら1を記録するということである。RAID4は専用のディスクに対してパリティを記録していくが、RAID5はパリティをストライプごとにずらしていく「水平パリティ」を採用している。なっている理由は、例えばRAID4でディスクが4台だとすると、パリティが記録される4台目のディスクは他の3台の書き込み時すべてに書き込みが発生し、要は3倍書くことになるので早く死ぬ。このディスクには常にアクセスしなければならないことからディスクが増えても速くならない。RAID5はディスク帯域的にはディスク台数から1台引いた分のRAID0並の速度が出る。それでいながら冗長性も確保できる。使い勝手が良いように思えるが、以外と難しい。問題は、パリティの計算が重いということである。このため、ディスクの交換やディスクの追加は非常に大変な作業になる。ディスクの追加は、全域に渡って配置し直して計算し直すという作業になるため、故障を引き起こすことも多い。ついでに言えば、計算が常に重く、これが速度低下の原因になることもある。ソフトウェアRAIDの場合はディスクアクセス時にCPUが重いという状況を発生させる。RAID5は常に1台の冗長性を確保する。2台目が故障すると必ず全体がfailする。「RAID5の障害でディスクを救出していたら他のディスクが死んでだめになった」ということが、割と現実的に起きる。RAID6RAID6はRAID5からパリティを2つに増やした方式。冗長性が2台に増えている。3台目の故障でfailする。耐障害性が高く、ディスク数が多い場合は有力だが、ソフトウェアRAIDの場合はRAID5よりもさらに重い。RAID5/6のRAID構成RAID10のように、RAID5やRAID6のディスクアレイをRIADの構成要素にすることもできることはできるけれど、一般的にはあまり見ない。RAIDの弱点RAIDコントローラという、RAIDを構成するための機能が死ぬと全体が終わってしまう。復元できないということではないが、稼働はできない。ソフトウェアRAIDはこの点は安心である。JBOD単純にディスクを連結し、1台目のディスクがいっぱいになったら2台目のディスクに書いていく。耐障害性は、使用されているディスクの範囲でRAID0と同じ。RAID0のように速度が速くなるメリットはないが、RAIDが普通、「同一容量のディスクを要求し、容量が異なる場合は最小のディスクに揃えられる」ものであるのに対し、JBODはただ頭からいっぱいにしていくだけなので全部のディスクを使い切れる。LinuxのLVMのリニアボリュームや、WindowsのダイナミックディスクのスパンボリュームもソフトウェアJBOD。MirrorBtrfsのミラーリング(RAID1)はちょっと変わっていて、同一容量のディスクを要求しない。3TB+1.5TB+1.5TBのディスク構成で、「3TBの2レッグミラー」ができる。3TB+1TB+1TBだと2TBしか書けない。RAID-ZZFSに備わっているソフトウェアRAID。パリティ更新に失敗してデータが壊れる、という問題を回避する機能が載っている。基本的にはRAID5/6の改良版。ホットスペアストレージサーバーなんかに載せられるようになっている、普段は使っていないディスク。RAIDディスク故障時にすぐに交換したのと同じ状況が得られるようになっている。RAID5の場合はRAID6と同じようなものなので、どちらかといえばRAID6を構成することを想定しているのが一般的。ディスク交換と稼働を切り離せるのでディスク交換作業が楽になる、という面が大きい。ファイルディストリビュートGlusterFSなんかに載っている機能。複数のディスクに分散してファイルを置く。同時にいろんなファイルにアクセスするとRAID0のようにアクセスが分散されて高速化する。そんなに大きくないデータでもうまいことシーケンシャルになって速くなったりする。ディスクが1台死んだときに失われるデータが全部ではなくて、そのディスク上のデータだけになる。GlusterFSで手軽な拡張を目論んでいる場合は、拡張が楽ということでディストリビュートを使うことが多い。冗長性は上がらないので、RAID1やRAID5と組み合わせて使う。ちなみに、GlusterFSは自前でRAID0なブロックストライピングと、同様のRAID5を持っている。ファイルレプリケート同一ファイルを複数のディスクに書く、RAID1のファイル単位版。GlusterFSでベース単位がファイルになっている環境でreplicatedだとこれになる。バックアップに近いものなので、非常に扱いやすい。これができる環境が限られるのと、性能向上にはつながらない。基本的にはソフトウェア的に実装されるもので、OS的には倍書き込みを発生させるわけで、むしろ遅くなる。バックアップとどう違うの?冗長性っていうのは、止めない、失わないこと重視。バックアップは、失ったときに復活させるもの。私の環境は、RAID5のreplicatedなので、1台冗長の構成でバックアップがひとつ。