はじめに
RAID について調べ物をしていたら、 RAID0 から RAID6 まであることを知った。そして、一番強い冗長性を持つ RAID6 でも、同時に2台のディスクの故障までしか対応していなかった。
3台同時に壊れた場合の考慮はしなくてもいいのだろうかと思ったが、そもそも3台同時に壊れる確率はどのくらいだろうか、と疑問に思った。それを計算したのがこの記事である。
今回求めるもの
ある1日で、n台運用中のディスク群の中で、1台以上壊れる確率、2台以上壊れる確率、3台以上壊れる確率を求める。それぞれ RAID0, RAID1-5, RAID6 でも復元できない確率となる。
ある1日のディスク故障率
ディスク故障率を調べていると、 Backblaze が出している記事 では2021年の年間故障率(AFR)が 1.01% となっていた。なので、ここでは年間故障率を 1% として議論していく。
そこから1日のディスク故障率を求める。その確率を p とおくと、
1-(1-p)^{365} = 0.01
となる。これを整理すると、1日の故障率 p = 0.0000275348 \approx 2.75 * 10^{-5} が求められる(計算結果)。
n 台運用中の1日当たりの故障率
この章では今回求めたい故障率を計算していく。引き続き p を1日の故障率とおいている。求めるにあたり、 n がそれなりに小さく p は微小の値となるので、 p の次数が一番低い項だけを考慮する(詳しくは余談の章を参照)。
1 台以上壊れる確率
1台も壊れていない確率から1を引けばいい。
1 - (1 - p)^n
\approx 1 - (1 - np)
= np
2 台以上壊れる確率
1台も壊れていない確率と、1台のみ壊れている確率から1を引けばいい。
1 - (1 - p)^n - np(1 - p)^{n-1}
\approx 1 - (1 - {}_n \mathrm{C}_1 p + {}_n \mathrm{C}_2 p^2) - ({}_n \mathrm{C}_1 p - 2 {}_n \mathrm{C}_2 p^2)
= {}_n \mathrm{C}_2 p^2
3 台以上壊れる確率
同様にして2台以下壊れている確率から1を引けばいい。
1 - (1 - p)^n - np(1 - p)^{n-1} - {}_n \mathrm{C}_2 p^2(1 - p)^{n-2}
\approx 1 - (1 - {}_n \mathrm{C}_1 p + {}_n \mathrm{C}_2 p^2 - {}_n \mathrm{C}_3 p^3) - ({}_n \mathrm{C}_1 p - 2 {}_n \mathrm{C}_2 p^2 + 3 {}_n \mathrm{C}_3 p^3) - ({}_n \mathrm{C}_2 p^2 - 3 {}_n \mathrm{C}_3 p^3)
= {}_n \mathrm{C}_3 p^3
計算まとめ
近似計算を行ったことにより、非常に簡潔な答えが求まった。
故障する台数(以上) |
確率 |
1 |
np |
2 |
{}_n \mathrm{C}_2 p^2 |
3 |
{}_n \mathrm{C}_3 p^3 |
例
10台運用しているとして実際に計算して見る。
故障する台数(以上) |
確率 |
1 |
2.75 * 10^{-4} |
2 |
3.40 * 10^{-8} |
3 |
2.50 * 10^{-12} |
この場合、ある1日で3台以上同時に故障する確率は4000億分の1である。この確率は、麻雀で天和で二回連続で和了する確率が約1000億分の1であることを考えると非常に低い確率である。
余談
今回 p が非常に小さいということで、二項展開するときに近似計算を行った。例えば p + p^2 を考えたとき、 2.75 * 10^{-5} + 7.5625 * 10^{-10} = 0.00002750075625 となって、2乗の項がほぼ意味ない形となっていることを使っている。2台と3台の計算のところでは p や p^2 の項が打ち消されるので、もっと大きい次数まで二項展開している。
この近似は p が小さいことも使っているが、n がそれなりに小さいことも必要である。n が百万など大きい場合、 np が1を超えるのでおかしいことに気づくだろう。その場合はポアソン分布を使ってもらえればと思う(そんな台数扱うことがあるか知らないが)。
Discussion