ソフトウェア工学5 耐故障性

前回 

issunno-koin.hateblo.jp

 

 

耐故障性(fault tolerance)

 ソフトウェアの障害時でも機能し続けることのできる性質
耐故障性が重要な場面
– 機能性が多少落ちたとしても高い可用性が求められる場合
– 障害回復のためのコストが大きい場合
システムが仕様通りに作られていても耐故障
性は必要。 仕様が間違っていたり、検証(validation)が間違っていた可能性がある。

 

耐故障性のために検討すべきこと

①故障の検出(fault detection)
– 故障やエラー状態を発見する

  l予防的(preventative)故障検出
   – 状態が変化する前に状態変化の可否を検査
   – エラーと判定した場合には状態変化を実際に起
こさない
  l遡及的(retrospective)故障検出
   – システム状態が変化した後にその可否を検査
   – エラーと判定した場合には回復機能により状態を正常に戻す
②影響の見積り(damage assessment)
– 故障により影響・被害を受けるシステムの部分を特定する

  |チェックサムなどの検査機能
  l冗長なポインタの導入
  lウォッチドッグ(番犬)タイマー
③故障からの復旧(fault recovery)
– エラー状態から正常状態へ移行する。もとに戻すための仕掛けをあらかじめ用意しておくひつようがある。

  lフォワードリカバリ
   – 異常な状態を想定されていた状態に修正

   – 適用にはアプリケーションに特定の論理・ドメイン知識が必要
  lバックワードリカバリ
   – 既知の正常状態にシステム状態を戻す
   – 正常状態のバックアップをとり,その状態に戻す

④故障の修正(fault repair)
– エラー状態の再発を防止する

 

耐故障アーキテクチャ(fault tolerant architecture)

故障や障害に耐えられるソフトウェアの構成を開発時から設計を行う。特に高い可用性が求められるシステムにて用いる。ディペンダブルプログラミングはソフトウェアのみでの対処だが、ハードウェアの故障やシステム仕様の誤りに対応するために、耐故障アーキテクチャが必要になる。

 

e.g. Nバージョンプログラミング

ハードウェアを多重化するのと同じような考え方で、同一の仕様に対し,異なるチームにより複数のバージョンを開発し、同一の入力に対し出力を比較・多数決をし、システム出力とする。

 

e.g. リカバリブロック

異なるバージョンを直列に動作させ、 出力に対する受入れテストをその都度実行し、テスト結果がOKであればその結果を採用する。

 

ソフトウェアとハードウェアの冗長性と多様性

l冗長性(redundancy)
– ハードウェアの場合
• 同じ箇所で同時に故障しないことが前提→単純に台数を増やせば冗長化できる。
– ソフトウェアの場合
• 同じものをコピーしたら同じ箇所が故障→多様性を持つことが重要。
 – 異なるチームで別の方法論・言語などを利用
  • プラットフォーム技術に起因する故障の回避
  •  同じ設計の誤りを回避