たごもりすメモ

コードとかその他の話とか。

RAIDレベルの話: 1+0と6はどっちが安全か?

仕事でちょっくら12台のHDDを使ったRAIDアレイを組むんだけど、その折にちょうどTwitterで「RAID-1+0にしないとRAID-6とか怖くて使えませんよ!」というウソ八百な内容のWebページのURLを見掛けたので、いいかげんそのような迷信が消え去ってもよかろうと思って書くことにした。

1重ミラー設定のRAID-1+0は安全性においてRAID-6に劣る。ただし、正しく運用されている場合に限る。*1

知っている人はずっと前から知っている事実ではあるんだけど、某巨大SIerなんかでも高い方が安全に決まってる的な残念な脳味噌の持ち主がいっぱいいて「いやあデータの安全性を考えるとRAID-1+0」とか考えもなしにクチにし、そっちの方がディスクがいっぱい売れて嬉しいストレージベンダーもニコニコしながら否定せず売りつけて去っていくといううわなにをす(ry
まあそんな感じで。ちなみに正しくない運用状況にあるRAIDアレイはそもそもどう構成しても安全じゃないので論じても無駄です。

もう何年も前に目にしたNetAppが公開しているホワイトペーパーにディスクの故障率とかその他の数値仮定といっしょに計算式がちゃんと載ってて超わかりやすかったんだけど、いまググってみたらなんか見付からない……。NOW*2の中のドキュメントだったかなあ。誰か知ってたら教えてください。
見付かった範囲だと こんなの があるけど、計算式とか載ってなくて数値に信憑性がない。もっと怪しげで更に信憑性のないのだと こっち (笑)

しょうがないので自分であれこれ仮定の数字をおいて計算してみる。仮定の数字なんで現実と違うところはあっちこっちあるし、ざっくりと省略する要素もいっぱいあるんでそのへんはご勘弁ね。詳しくはNetAppの営業にでも聞くと何か出てくるんじゃないでしょうか。知らんけど。あと資料の調べ直しとかせずに記憶ベースで書いてるんで、あちこち間違ってる可能性も高いです。勘弁してね。

あともうひとつ、RAID-1+0はパフォーマンスにおいては確かにRAID-6より(たいていの場合において)優秀です。そこに言及する気は今回ありません。

前提: RAIDアレイの正しい運用

RAIDアレイの正しい運用とはなにか、を認識することがRAIDアレイの安全性の試算には重要です。ここがそもそもあんまり認識されてないように思うので、軽くまとめ。

ディスクのfail

RAIDを構成するディスクそれぞれについて、RAIDコントローラは状態を監視しています。各ディスクへのI/Oの成功/失敗が常に監視され、特定のディスクについてI/Oの失敗が許容値を超えたと判断*3された場合に、ようやくfailしたとマークされ、そのディスクを構成するRAIDアレイの冗長度が下がったと判断される。

ここで大事なのは、ディスクがfailしたと判断されるのはあくまでI/Oの結果ベースだということ。ディスクは壊れたときにそれを勝手にRAIDコントローラに通知してくれるような機能は持ってません。書かれているはずのデータを読みに行く(そして失敗する)、もしくは書けるはずの場所にデータを書きに行く(そして失敗する)ことでしかディスクの故障というのは発見できない。

この図のように、特に最近の大容量HDDであれば昔に書かれたデータと最近読み書きしているデータが綺麗に分かれることは割とよくある。ディスクの特定の部分に(HDDの先頭セクタに)このディスクを使いはじめた頃のデータが多く書かれたとする。時間が経つにつれて古いデータへのアクセス頻度が減り、ディスクの別の部分に対して書いた新しいデータに頻繁に読み書きが行われるようになっていく。
この頃に古いデータが書かれている領域で劣化がありデータの読み書きが不可能になっても、このデータを読み込もうとすること自体が起きなければ、そのことに気付けない(真ん中の図)。長い期間が経てば、そのような箇所は当然増えていく。
そしてある日になんらかのきっかけで古いデータを読み込みに行こうとして、その時はじめてデータの読み込みが不可能であることに気付く。こうしてこのディスクが壊れた(failした)と判定されることになる。*4

RAIDアレイの故障

RAIDアレイはどのようなときに故障したとみなされるか。たとえば一番単純な2台構成でミラーリングRAID-1について考えると?
ミラーを構成する2台のHDDが同時に故障したときにRAIDアレイも故障する、というのは間違い。厳密に同時に2台のHDDが故障する確率というのは極めて低く、基本的にはほとんど無視していい確率のはず。まあ絶対に無いとは言えないけど、あまり現実的じゃない。
もうひとつの場合は、1台のディスクがfailし、代替ディスクを手配している間にもう1台(もしくはそれ以上)のディスクもfailした、というケース。これは無くはない。無くはないが、そもそも代替ディスクの調達にそんなに時間をかける方が間違ってる。自宅でRAIDを組んでるという趣味人はともかく、お仕事でRAIDを使うような人ならすぐに抜いて挿せる位置に代替ディスクくらい置いておくべき。あるいはホットスペアを用意しましょう。RAID-1+0じゃないと嫌だとか言う人は当然やってることだよね?

じゃあ他にどういう場合があるかというと、1台のディスクがfailしたあと、リビルドをかけている間にもう1台(もしくはそれ以上)のディスクがfailする場合だ。これを「2台同時に壊れる」と表現する人がいるが、その人はほとんどの場合は正しく状況を認識していない。これは厳密に考えると、以下ふたつのケースがある。

  • ディスクのfailひとつめの瞬間までは「全ディスクの全ブロックが読み書き可能な状態」だった
    • ひとつめのディスクのfailが起きてからリビルドをかけている時間のうちに、もうひとつのディスクがfailした
  • ディスクひとつ(もしくはそれ以上)が「実質的には読み書きできないブロックを抱えており潜在的にはfail」だった
    • ひとつめのディスクのfailが起きてからリビルドをかける際に全ブロックへのアクセスが発生し、他のディスクのfailに気付いた

後者のケースを図示してみると、こんな感じだ。

頻繁にアクセスされるのは 4〜6あたりの領域だとすると、A4〜A6およびB4〜B6のあたりで不良セクタができればI/Oエラーで気付けるが、A1〜A3およびB1〜B3あたりで不良ブロックが出てもなかなか気付けない。このときにB2が不良ブロック化し、それに気付けないままの状態が一番左だ。その状態のまま使い続けていたが、A5に不良ブロックが出て読み込み不可能となり、ディスクAがfailしたと判定される。ディスクAを新品と交換しRAIDアレイのリビルドをかけると、ここで初めてアクセスが低頻度な領域も含めてディスク全体への読み込みが発生し、ディスクBの不良ブロックが発見され、ディスクBもfailしてしまう。全データを取り出す方法が無くなってしまい、RAIDアレイ全体が故障したとみなされる。

定期的なベリファイ

しかし、これらRAIDアレイの故障のケースのうち、最後のものについては予防が可能だ。RAIDコントローラは各ディスクの記録内容を強制的に同期する機能を持っているものが数多くある。*5
これらの機能は通常、RAIDアレイを構成するHDD上の全ブロックのデータをスキャンし、各ディスク間で矛盾が無いかどうかをすべてチェックする。HDD上のデータのアクセス頻度に関わらず全ブロックを走査するため、もうほとんど読んでいないようなデータが書かれているブロックにエラーがあった場合でも問題なく検出し、回復不可能であればそのディスクをfailさせてくれる。
これを頻繁に*6実行していれば「読み込めないブロックがあるが気付けない」状況のことを気にしなくてよくなり、いざRAIDアレイのリビルドをかけようとしたときに生きていたはずのディスクがfailする確率が格段に減ることとなる。

で、こういう話をすると「ディスクの寿命が縮むから嫌だ」とか言う人が必ずいる。多少ディスクの寿命が延びたからといって、データ損失の危険と天秤にかけられるんですかー? まあそういう人は好きにすればぁ? 週1回くらい全走査したからってそんな寿命減りゃしねーよ。

ということで、RAIDアレイに対する定期的なベリファイは必須だ。必ずやろう。前提とします。

failディスクを発見したらすぐに交換・リビルド

これはもう言うまでもない。放置は悪。そんな奴にデータの安全性を云々する資格はありません。

RAIDアレイ故障の起きる確率

さて、じゃあ定期的なベリファイとfailディスクはすぐ交換という前提を置いたとして、各RAIDレベルのアレイの故障確率を計算してみよう。ここではHDD8台分の論理容量がアレイに必要だということにして、RAID-1+0 および RAID-5/6 の各レベルを比較する。
1年間でHDD1台が故障する確率を 1/10 ということにしてみる。1年間は365日だから、1日あたりの故障確率を x とすると (1-x)^365 == (1-0.1) == 0.9 となるので x == 1 - 0.9^(1/365) == 1 - 0.99971138 == 0.00028862 == 2.89*10^-4 くらい、となる。だいたい 0.0289% くらいですな。10,000台あったら2〜3台壊れる、だと、だいたいそんなもんかね? ちょっと多いかな。
またRAIDアレイのリビルドに必要な時間を仮定する必要がある。たいてい数時間だと思うしディスクの容量とコントローラの性能(ソフトウェアRAIDの場合はCPUのパワー)、およびリビルドと並行して発生している通常のI/O負荷などによるので一概には言えないんだけど、ここでは長めを仮定し、あと計算の簡単のため、1日かかることにしよう。なおRAIDレベルによってもリビルドに必要な時間は異なるが、ここでは計算の簡単のため、等しいとする。*7

2台1ペア(単純なミラー)のRAID-1+0 HDD 16台構成

前述「RAIDアレイの故障」に書いた内容から、確率を求めなければならないのは以下のケース。

  • (a): 完全に同時に複数台のディスクがfailしてRAIDアレイが故障する
  • (b): 1台のディスクがfailし、それに対してリビルドをかけている間に他のディスクがfailしてRAIDアレイが故障する

(a) は簡単で RAID-1+0 の場合はペアになっている2台が同時にfailする確率を求めればいい。16台構成の場合は8ペアだから、確率は1ペアの単純に8倍になる。「同時に」が難しいけど、簡単のため「同じ日に」としてしまおう。*8
確率は x^2*8 == (2.89*10^-4)^2*8 == 8.3521*10^-8*8 == 6.68168*10^-7 だそうだ。1年あたりで起きる確率に直してみると (1 - 0.999756148) となって、1万個のアレイがあれば3個は故障が起きるらしい。おおう、意外に高い! ディスクのfailを1日放置しておくと、このくらいの確率で RAID-1+0 のアレイでも壊れる

(a) やりなおし。「同時に」を「同じ日」はやめて、そうだなあ、1時間くらいにするか。ディスクひとつが1時間あたりでfailする確率 y を求めよう。1日は24時間なので (1 - y)^24 == (1 - x) を解けばいい。y == 1 - (1 - x)^(1/24) == 1 - 0.99971138^(1/24) = 1 - 0.999987973 == 1.2027*10^-5 だそうだ。
これを使って先程のように「ある1時間に複数台のディスクがfailしてRAIDアレイが故障する」確率を求めると y^2*8 == (1.2027*10^-5)^2*8 == 1.15718983*10^-9 となった。1年あたりの確率では (1 - 0.999989863) となるので、10万個のアレイがあると1個か2個で起きるくらいの確率となる。おおおお、安全! ていうかもうこんなケース考えなくてよくね? 絶対これより何桁も高い確率で世の中でデータ欠損起きてるじゃん。

(b) じゃあリビルド中に「ペアになっているもう1台」がfailする可能性を考えよう。ディスク1台のfailは既に起きてしまったものとするので、そこまでの確率は考えなくていい。条件付確率というやつだ。みんな中学校でやったよね?(高校だっけ?)
リビルドに1日かかるとする。1重ミラーのRAID-1+0の場合、failしたディスクとペアになっているディスクがfailしたらアレイは故障するので、このディスクのfailする確率だけを考える。「正しい運用」が行われていれば1週間ごとにベリファイが実行されているはずなので、最長でもこの1週間 + リビルドに必要な1日の合計8日間にディスクが「実際には壊れてしまった」可能性を求めればいい*9
で、計算。リビルドの前後8日間で特定の1台のディスク(リビルド対象のHDDのペア)がfailする確率は 1 - (1-x)^8 == 1 - 0.99971138^8 = 0.0023066289 == 0.23% となった。おや、かなり高いですね?*10

RAID-5 HDD 9台構成

RAID-5 はあんまり問題に出してなかったが、こっちでも同じように確率を出しておこう。

  • (a): 完全に同時に複数台(任意の2台)のディスクがfailしてRAIDアレイが故障する
  • (b): 1台のディスクがfailし、それに対してリビルドをかけている間に他の任意の1台のディスクがfailしてRAIDアレイが故障する

(a) ある1時間に、9台のうち任意の2台がfailする確率を求めればいい。9C2 * y^2 == 9*8/2 * y^2 == 36 * (1.2027*10^-5)^2 == 5.20735424*10^-9 となる。ああ、確かに RAID-1+0 の4倍くらい高い確率ですね。しかし1年あたりに直すと (1 - 0.999954385) ってことで、10万個のアレイのうち5個くらい起きるかも、ということでやっぱり小さい確率には違いないよなあ。

(b) RAID-5 の場合、リビルド中に他のどの1台がfailしてもアレイは故障する。さっきと同じようにリビルドの前後8日間で故障ディスク以外の8台のうち任意の1台がfailする確率を計算してみると 8 * (1 - (1 - x)^8) == 0.0184530312 == 1.85% だ。要するにRAID-1+0の8倍だよねってことで、RAID-5が危険な構成であることがわかる。

RAID-6 HDD 10台構成

(a) RAID-6 の場合はある1時間に、10台のうち任意の3台がfailする確率となる。10C3 * y^3 == (10*9*8)/(3*2) * y^3 == 120 * (1.2027*10^-5)^3 == 2.08762832 * 10^-13 となった。この時点で RAID-1+0 のアレイに対してざっと4桁も安全だということがわかる。1年あたりに直しても
(1 - 0.999999998) ってことで、まあもう壊れないじゃんコレ。

(b) こちらはリビルド前後8日間で、故障ディスク以外の9台のうち任意の2台がfailする確率になる。8日間で1台がfailする確率は (1 - (1 - x)^8) だから、求める確率は 9C2 * (1 - (1 - x)^8)^2 == 9*8/2 * (1 - 0.99971138^8)^2 == 0.000191539328 == 1.915*10^-4 == 0.01915% となった。ざっと RAID-1+0 の1/10の確率になる。

試算から

この簡単な試算の結果、以下のことがわかる。

  • 本当に同時にディスクが複数台壊れる確率だけに注目すると
    • RAID-1+0 の場合は年あたり 0.001% くらいの確率でデータロストする
    • RAID-6 の場合は年あたり 0.0000002% くらいの確率でデータロストする
    • 基本的にどちらも低過ぎてあまり考える意味はないけど、それでもRAID-6の方が何桁も安全
  • 1台のディスクがfailしたあとのリカバリ中の故障の確率を見ると
    • RAID-1+0 の場合は 0.23% の確率でデータロストする
    • RAID-6 の場合は 0.019% の確率でデータロストする
    • NetAppの試算とは数字がひと桁違うが、アレイの構成台数の前提やリビルド前後期間のとりかたなどで変わってくる
    • 疑われる向きは自分のアレイ構成で計算してみればいいと思いますよ計算式は全部上にあるから

結論

単純な安全性だけ考えるならRAID-6はRAID-1+0(2重化)よりすぐれている。*11
もちろん実際の選択においては性能、要求容量に対するHDDあたり容量のトレンドと冗長性の兼ね合い、手に入るRAIDコントローラの機能および価格なども考慮の上で選択するべきであって、安全性だけを考えればいいというものではない。ただし性能要件が厳しいことというのは実際にはそんなに多くないはずなので、きちんと考えた上でならより安価で安全なRAID-6を選択するというのは現実的なものでしょう。

*1:3台以上のHDDが故障しているとき、データが助かる可能性があるのはRAID-1+0であってRAID-6では確実にデータが失われる。しかしそもそも3台以上のHDD故障を想定しなければならないケースは運用が間違っている。

*2:NetApp on the Web: 登録制でログインが必要なNetAppの技術サイト

*3:この判断基準はRAIDコントローラの実装によって異なり、またディスクの種類によっても異なるため、あまり一般化できません。ただし1つのセクタに対するI/O失敗だけでいきなりディスクをfail扱いするコントローラはほとんどないはず。通常はいくつかのbad blockが予備ブロックに置き換えられるなどした後、その回数や頻度が許容値を超えた場合などにようやくfail扱いとなります。まあ自分も詳しくないんでHW系の誰かに聞きましょう。

*4:この図ではI/Oの成功/失敗がものすごく単純化されているが、ブロック/セクタ単位でのread/writeの成功/失敗にはそれはそれであれこれある。らしいよ。

*5:Linux Software RAID(md) でも可能。

*6:といっても週1以上でかける意味はあんまり無いと思うけど……

*7:RAIDレベル毎にどれくらいリビルドの所要時間が異なるかはCPUやI/O負荷により以下略。

*8:これはつまり、ディスクがfailしてからリビルドを開始するまでの時間が必ず1時間ある、という前提だと思ってもいい。

*9:さっきまでは「ディスクがfailする確率」を扱っていたが、ここでは「実際には壊れていたがfailとしては見えていない」ケースも扱っている。ただし「ディスクがfailする単位時間あたりの確率」と「実際には壊れていたものを単位時間あたりでfailとして検出する確率」は数字としては等しいので、ここでは同じ数値をそのまま用いることができる。

*10:逆にこの数字を見て「もっと高い確率で失敗している!」と思った人は正しくない運用をしている疑いが強い。

*11:計算するまでもなく3重化以上のRAID-1+0であれば常にRAID-6よりも安全性において優る。なぜならRAID-6は任意の3台がfailした時点でRAIDアレイが故障するが、3重化ミラーなら組になった3台が同時にfailしない限りRAIDアレイ故障は起きない