HA構成と復旧作業時間と信頼性

2台でHAノードを組んでいて1台が落ちた場合に、何時間以内に再度2台構成に復帰させる必要があるのかなーと思って、ちょっと計算してみた。ノード毎の障害発生の確率が独立であると仮定すると、

$ perl -le 'print exp(log($ARGV[0])/(365*24))**$ARGV[1]' 0.97 1
0.999996522927565

のように、サーバの障害発生率が 3%/year で、かつ復旧に1時間かかる場合、復旧中に残存ノードにも障害が発生してサービスが停止する可能性は 0.001% 以下。

$ perl -le 'print exp(log($ARGV[0])/(365*24))**$ARGV[1]' 0.97 24
0.999916553598325

2台構成に戻るまで24時間かかる場合だと、約0.01%。

$ perl -le 'print exp(log($ARGV[0])/(365*24))**$ARGV[1]' 0.90 1
0.999987972616204
$ perl -le 'print exp(log($ARGV[0])/(365*24))**$ARGV[1]' 0.90 24
0.999711382710977

サーバの年間障害発生率を10%と見積もった場合で、それぞれ 0.001% (1時間での復旧) と 0.03% (24時間での復旧)。

データの復旧可能性とサービスの可用性はわけて議論する必要があるけど、冗長なディスクアレイ組んでて要求されるサービスレベルがフォーナイン程度のケースでは、2台構成のHAでいいような気もする。

追記:

ただ、サーバ台数が増えると障害発生率は高くなるわけで。仮にHAクラスタが100個ある場合だと、年間障害発生率3%で復旧時間が1時間でもフォーナインは達成できない。

$ perl -le 'print +(1-$ARGV[0]*(1-exp(log($ARGV[0])/(365*24))**$ARGV[1]))**$ARGV[2]' 0.97 1 100
0.999662780276383

部分的なデータベース障害がサービス全体の可用性に影響しないようにしたり、SLAを工夫したり、あるいはさらなる高可用構成を組む、といった対策をとる必要がある。

追記その2 (21:03):

追記は計算してるものがおかしい。仮にHAクラスタが100個あった場合、サーバの障害発生率3%で復旧時間が24時間の場合、HAを構成する2台のサーバが両方ダウンしてサービスに障害が発生する可能性は 0.05%/year。サーバ障害発生率10%で普及時間24時間の場合、0.55%。2台構成で限界かどうか、微妙なライン。

$ perl -le 'print +exp(log($ARGV[0])/(365*24))**($ARGV[1]*(1-$ARGV[0]**2)*$ARGV[2])' 0.97 24 100
0.999506932786007
$ perl -le 'print +exp(log($ARGV[0])/(365*24))**($ARGV[1]*(1-$ARGV[0]**2)*$ARGV[2])' 0.90 24 100
0.994530492528583