耐障害性とは、システムが障害(トランジスタの故障、コネクタの短絡、データバスの断続的な障害など)の伝播を抑制する能力のことです。障害は、エラー(データ値の誤り、メッセージの欠落など)として現れ、システムの状態を誤らせる可能性があります。耐障害性システムは、エラーを隠蔽し、1つ以上のコンポーネントに障害が発生しても、障害のない動作を維持します。この機能は、高可用性、ミッションクリティカル、あるいは生命に関わるシステムにとって不可欠です。
フォールトトレランスとは、システムが障害発生時に性能低下やダウンタイムを起こさずに処理できる能力を指します。エラーが発生した場合でも、エンドユーザーは問題に気づきません。一方、サービスが多少中断したり、パフォーマンスが徐々に低下したりしながらもエラーに対応できるシステムは「レジリエント」と呼ばれます。レジリエントなシステムでは、エラーに適応し、サービスを維持しながらもパフォーマンスへの一定の影響を認識します。
一般的に、耐障害性とはコンピュータシステムを指し、ハードウェアやソフトウェアの問題が発生してもシステム全体が機能し続けることを保証するものです。コンピュータ以外の例としては、疲労、腐食、衝撃による損傷を受けても構造的な完全性を維持する構造物などが挙げられます。
最初の耐障害性コンピュータとして知られているのは、1951年にチェコスロバキアでアントニン・スヴォボダによって作られたSAPOである。[ 1 ]: 155その基本設計は、リレーを介して接続された磁気ドラムと、メモリのエラー検出のための投票方式(三重冗長構成)であった。この流れに沿って、主に軍事用途向けに、他にもいくつかのマシンが開発された。最終的に、それらは3つの異なるカテゴリに分かれた。
いわゆるLLNM(長寿命、メンテナンス不要)コンピューティングの開発の大部分は、1960年代にNASAによって行われ、[ 2 ]アポロ計画やその他の研究面への準備として行われました。NASAの最初のマシンは宇宙観測所に搭載され、2番目の試みであるJSTARコンピュータはボイジャーで使用されました。このコンピュータはメモリ回復方法を使用するためのメモリ配列のバックアップを備えていたため、ジェット推進研究所自己テストおよび修復コンピュータと呼ばれていました。自身のエラーを検出して修正したり、必要に応じて冗長モジュールを使用したりすることができました。このコンピュータは2022年初頭の時点でまだ稼働しています。[ 3 ]
超高信頼性コンピュータは、主に航空機メーカー[ 1 ] : 210、原子力発電会社、そして米国の鉄道業界によって開拓されました。これらの組織は、膨大な稼働時間を持ち、障害発生時にも運用を継続できるほど適切に障害を回避できるコンピュータを必要としていました。同時に、障害を検出するためにコンピュータ出力の継続的な人的監視に依存していました。IBMは、サターンVロケットの誘導のためにNASA向けにこの種の最初のコンピュータを開発しました。その後、BNSF、Unisys、およびGeneral Electricが独自のコンピュータを開発しました。[ 1 ] : 223
1970年代には、この分野で多くの研究が行われた。[ 4 ] [ 5 ] [ 6 ]例えば、F14 CADCには自己診断機能と冗長性が組み込まれていた。[ 7 ]
一般的に、耐障害性設計の初期の取り組みは主に内部診断に焦点を当てており、障害が発生すると何かが故障していることが示され、作業員がそれを交換できるというものでした。たとえば、SAPO は、故障したメモリ ドラムが故障する前に音を発する方式を採用していました。[ 8 ]その後の取り組みにより、システムが完全に効果を発揮するには、自己修復と診断を行う必要があることが示されました。つまり、障害を分離し、冗長バックアップを実行すると同時に、修理の必要性を警告するということです。これは N モデル冗長性として知られており、障害が発生すると自動的にフェイルセーフが作動し、オペレーターに警告が発せられます。これは、現在でも使用されているレベル 1 の耐障害性設計の最も一般的な形式です。
前述のように、投票も初期の方法の一つであり、複数の冗長バックアップが常時稼働し、互いの結果をチェックしていました。例えば、4つのコンポーネントが5という回答を報告し、1つのコンポーネントが6という回答を報告した場合、残りの4つのコンポーネントは5番目のコンポーネントが故障していると「投票」し、サービスから除外します。これはN個中M個の多数決投票と呼ばれます。
歴史的に見ると、システムの複雑さや、障害負の状態から障害正の状態への推移的状態を保証することの難しさが運用を妨げなかったことから、NモデルからM out of Nモデルへと移行する傾向が見られた。
Tandem Computersは1976年に[ 9 ]、Stratus Technologiesはオンライン取引処理用の耐障害性コンピュータシステムの設計を専門とする最初の企業の1つでした。

ハードウェアの耐障害性を実現するには、システムが稼働中に故障した部品を取り外し、新しい部品と交換する必要がある場合があります(コンピューティングではホットスワップと呼ばれます)。単一のバックアップで実装されたこのようなシステムは、シングルポイント耐障害性と呼ばれ、耐障害性システムの大部分を占めています。このようなシステムでは、バックアップも故障する前に、オペレーターが故障したデバイスを修復するのに十分な時間(平均修復時間)を確保できるよう、故障間隔の平均時間が十分に長くなければなりません。故障間隔はできるだけ長い方が望ましいですが、耐障害性システムにおいて必ずしも必須ではありません。
耐障害性はコンピュータアプリケーションにおいて特に大きな成功を収めている。タンデム・コンピュータ社は、単一障害点耐性を用いて数年単位の稼働時間を誇るノンストップシステムを構築し、事業全体をこうしたマシン上に構築した。
フェイルセーフアーキテクチャは、例えばプロセス複製によって、コンピュータソフトウェアも包含する可能性がある。
データ形式は、段階的に劣化するように設計することもできます。たとえば、Hyper Text Markup Language (HTML)は前方互換性を持つように設計されており、Web ブラウザが新しいサポートされていない HTML エンティティを無視しても、ドキュメントが使用不能になることはありません。さらに、適切なユーザー インターフェイス設計では、Web サイトがJavaScriptに依存せず、最小限のレイアウトを持つ軽量のオプションのフロント エンドを提供し、幅広いアクセシビリティと普及を確保する必要があります。[ 10 ]

耐障害性の高いシステムは、1つまたは複数のコンポーネントが故障しても、同じレベルの性能を維持し続けることができます。例えば、バックアップ発電機を備えた建物では、送電網からの電力供給が停止しても、壁のコンセントに同じ電圧が供給されます。
フェイルセーフ、フェイルセキュア、またはグレースフルに設計されたシステムは、機能が低下した状態でも完全に故障した場合でも、人、財産、またはデータを損傷、損害、侵入、または漏洩から保護する方法で動作します。コンピュータでは、プログラムはエラー発生後にデータ破損を防ぐために、グレースフル終了(制御不能なクラッシュとは対照的に)を実行することでフェイルセーフを実現する場合があります。[ 11 ]同様に、「適切に故障する」と「ひどく故障する」という区別があります。
段階的な性能低下、つまりソフトフェイル(コンピューティングでは「フェイルセーフ」[ 12 ]に類似)を経験するように設計されたシステムは、コンポーネントの一部が故障した後、性能が低下した状態で動作します。たとえば、電力網が停止した場合、建物の照明は低レベルに、エレベーターは低速で動作するかもしれません。コンピューティングでは、オンラインビデオをストリーミングするのに十分なネットワーク帯域幅が利用できない場合、高解像度バージョンの代わりに低解像度バージョンがストリーミングされることがあります。プログレッシブエンハンスメントも別の例で、古い、小型スクリーン、または機能が制限されたウェブブラウザ向けに基本的な機能形式でウェブページが利用可能である一方、追加のテクノロジーを処理できるブラウザやより大きなディスプレイを備えたブラウザ向けには拡張バージョンが提供されます。
フォールトトレラントなコンピュータシステムでは、堅牢とみなされるプログラムは、エラー、例外、または無効な入力が発生しても完全に停止するのではなく、動作を継続するように設計されています。ソフトウェアの脆弱性は堅牢性とは正反対です。回復力のあるネットワークは、一部のリンクやノードが故障してもデータの送信を継続します。同様に、回復力のある建物やインフラは、地震、洪水、衝突などの状況で完全な機能停止を防ぐことが期待されます。
障害透過性の高いシステムは、たとえコンポーネントが完全な性能で動作し続けていても、コンポーネントの障害が発生したことをユーザーに警告し、障害を修復したり、差し迫った完全な障害を予測したりできるようにします。[ 13 ]同様に、フェイルファストコンポーネントは、下流のコンポーネントが故障したときにレポートを生成するのではなく、最初の障害発生時点でレポートを生成するように設計されています。これにより、根本的な問題の診断が容易になり、故障状態での不適切な動作を防ぐことができます。
単一故障状態とは、危険に対する保護手段の一つが欠陥のある状態を指します。単一故障状態が必然的に別の単一故障状態を引き起こす場合、その二つの故障は一つの単一故障状態とみなされます。[ 14 ]ある資料では、次の例が挙げられています。
単一故障状態とは、機器の危険に対する保護手段が1つだけ欠陥がある場合、または単一の外部異常状態が存在する場合(例えば、活電部と印加部の間の短絡)の状態を指します。[ 15 ]
すべてのコンポーネントに耐障害性設計を施すことは、通常選択肢ではありません。関連する冗長性には、重量、サイズ、消費電力、コストの増加、設計、検証、テストにかかる時間の増加など、多くのデメリットがあります。したがって、どのコンポーネントを耐障害性にするべきかを決定するために、いくつかの選択肢を検討する必要があります。[ 16 ]
すべてのテストに合格するコンポーネントの例として、自動車の乗員拘束システムが挙げられます。乗員の主要な拘束システムは通常は考えられませんが、それは重力です。車両が横転したり、強いGフォースがかかったりすると、この主要な乗員拘束方法が機能しなくなる可能性があります。このような事故の際に乗員を拘束することは安全にとって絶対に不可欠なので、最初のテストは合格です。シートベルトが普及する前は、乗員が車外に投げ出される事故が非常に多かったため、2番目のテストも合格です。シートベルトのような冗長な拘束方法のコストは、経済的にも重量やスペースの面でも非常に低いため、3番目のテストも合格です。したがって、すべての車両にシートベルトを追加することは素晴らしいアイデアです。エアバッグなどの他の「補助拘束システム」はより高価なため、このテストの合格率は低くなります。
この原則が実践されているもう一つの優れた長期的な例は、ブレーキシステムです。実際のブレーキ機構は重要ですが、急激な故障(段階的な故障ではなく)は起こりにくく、いずれにしてもすべての車輪に均等かつバランスの取れた制動力を加えるために、必然的に二重化されています。主要部品をさらに二重化することは、法外なコストがかかるだけでなく、重量もかなり増加します。しかし、ドライバーが制御するブレーキを作動させるための同様に重要なシステムは、本質的に堅牢性が低く、一般的にはケーブル(錆びたり、伸びたり、詰まったり、切れたりする可能性がある)または油圧作動油(漏れたり、沸騰して気泡が発生したり、水分を吸収して効果が低下したりする可能性がある)を使用しています。そのため、現代のほとんどの自動車では、フットブレーキの油圧ブレーキ回路は対角線上に分割されており、故障箇所が2つに絞られています。どちらか一方の故障でもブレーキ力は50%しか低下せず、前後または左右に直線的に分割した場合ほど危険なブレーキ力の不均衡は生じません。また、油圧回路が完全に故障した場合(これは比較的まれなケースですが)、ケーブル式パーキングブレーキというフェイルセーフ機構が備わっており、通常は比較的弱い後輪ブレーキを作動させますが、通常の交通の流れに沿った負荷であれば、トランスミッション/エンジンブレーキと連動して車両を停止させることができます。フットブレーキが完全に故障し、緊急時に急ブレーキをかける必要が生じるという、極めてまれな組み合わせは、衝突事故につながる可能性は高いものの、そうでなければ発生するであろう速度よりも低い速度での衝突にとどまるでしょう。
フットペダルで操作するサービスブレーキと比較すると、パーキングブレーキ自体はそれほど重要な部品ではなく、フットブレーキの一時的なバックアップとして使用しない限り、作動時に機能しなくても直ちに危険を引き起こすことはありません。そのため、パーキングブレーキ自体には冗長性は組み込まれておらず(通常は安価で軽量ですが耐久性の低いケーブル式作動システムを使用しています)、坂道でこのようなことが起こった場合は、フットブレーキを使って一時的に車両を静止させてから、停車できる平坦な場所を探して走行すれば十分です。あるいは、緩やかな勾配では、トランスミッションをパーキング、リバース、または1速に入れ、トランスミッションロック/エンジン圧縮を利用して車両を静止させることもできます。これらの車両には、まず車両を停止させるための高度な機構は必要ないからです。
オートバイでは、同様のレベルのフェイルセーフティがよりシンプルな方法で実現されています。まず、フロントブレーキシステムとリアブレーキシステムは、作動方式(ケーブル式、ロッド式、油圧式など)に関わらず完全に独立しているため、一方のシステムが完全に故障しても、もう一方のシステムには影響しません。次に、リアブレーキは自動車のブレーキシステムに比べて比較的強力で、一部のスポーツモデルでは強力なディスクブレーキが採用されています。これは、通常はフロントブレーキシステムが制動力の大部分を担うことを想定しているにもかかわらずです。車両全体の重量がより中央に集中しているため、リアタイヤは一般的に大きく、トラクションも優れているため、ライダーは後ろに体重をかけてリアタイヤに荷重をかけることができ、ホイールがロックする前により大きな制動力を加えることができるのです。安価で低速な実用クラスの自転車では、前輪に制動力を高め、パッケージングを容易にするために油圧ディスクブレーキを採用する場合でも、後輪は通常、原始的でやや非効率的ではあるものの、非常に頑丈なロッド式ドラムブレーキが採用される。これは、この方式ではフットペダルをホイールに簡単に接続できることに加え、より重要な点として、多くの低価格自転車が使用開始後数年でメンテナンス不足のために崩壊寸前になったとしても、後輪が致命的な故障を起こす可能性がほとんどないからである。
耐障害性の基本特性には以下が求められる。
さらに、フォールトトレラントシステムは、計画的なサービス停止と計画外のサービス停止の両方の観点から特徴付けられます。これらは通常、ハードウェアレベルだけでなく、アプリケーションレベルでも測定されます。この性能指標は可用性と呼ばれ、パーセンテージで表されます。例えば、ファイブナインのシステムは、統計的に99.999%の可用性を提供します。
耐障害性システムは、一般的に冗長性の概念に基づいている。
重要なシステムに必要な許容範囲の種類に関する研究には、多くの学際的な作業が伴います。システムが複雑になればなるほど、考えられるすべての相互作用をより慎重に考慮し、準備する必要があります。輸送、公共事業、金融、公共安全、軍事における高価値システムの重要性を考えると、研究の対象となるトピックの分野は非常に広く、ソフトウェアのモデリングと信頼性、ハードウェア設計といった明白な主題から、確率モデル、グラフ理論、形式論理または排他論理、並列処理、リモートデータ伝送などの難解な要素まで含まれます。[ 18 ]
予備部品は、耐障害性の最初の基本的な特性に3つの方法で対応します。
RAID 0を除く、RAID(冗長アレイ・オブ・インディビジュアル・ディスク)のすべての実装は、データ冗長性を使用する耐障害性ストレージデバイスの例です。
ロックステップ耐障害性マシンは、並列に動作する複製要素を使用します。常に、各要素のすべての複製は同じ状態である必要があります。各複製には同じ入力が提供され、同じ出力が期待されます。複製の出力は、投票回路を使用して比較されます。各要素の複製が2つあるマシンは、デュアルモジュラー冗長(DMR)と呼ばれます。この場合、投票回路は不一致のみを検出でき、復旧は他の方法に依存します。各要素の複製が3つあるマシンは、トリプルモジュラー冗長(TMR)と呼ばれます。投票回路は、2対1の投票が観測された場合に、どの複製にエラーがあるかを判断できます。この場合、投票回路は正しい結果を出力し、誤ったバージョンを破棄できます。その後、誤った複製の内部状態は他の2つの複製とは異なると想定され、投票回路はDMRモードに切り替えることができます。このモデルは、より多くの複製にも適用できます。
ロックステップ耐障害性マシンは、各複製回路の各ゲートがクロックの同じエッジで同じ状態遷移を行い、複製回路へのクロックが完全に同位相となるように、完全に同期させることで最も容易に実現できます。しかし、この要件を満たさなくてもロックステップシステムを構築することは可能です。
複製を同期させるには、内部に保存されている状態を同一にする必要があります。複製は、リセット状態などの固定された初期状態から開始できます。あるいは、一方の複製の内部状態をもう一方の複製にコピーすることもできます。
DMRの派生方式の一つに、ペア・アンド・スペア方式がある。この方式では、2つの複製要素がペアとして同期して動作し、投票回路がそれらの動作の不一致を検出し、エラーを示す信号を出力する。もう1組のペアも全く同じように動作する。最終回路は、エラーを宣言していないペアの出力を選択する。ペア・アンド・スペア方式はTMRの3つではなく4つの複製要素を必要とするが、商用利用されている。
障害を無視するコンピューティングは、コンピュータ プログラムがエラーがあっても実行を継続できるようにする技術です。[ 19 ]この技術はさまざまな状況で適用できます。プログラムに製造された値を返すことで無効なメモリ読み取りを処理できます。[ 20 ]すると、プログラムは製造された値を使用し、アクセスしようとした以前のメモリ値を無視します。これは、プログラムにエラーを通知したり、プログラムを中止したりする一般的なメモリ チェッカーとは大きく異なります。
このアプローチにはパフォーマンス上のコストが伴います。この手法では、アドレスの有効性を確認するための動的なチェックを挿入するためにコードを書き換えるため、実行時間が80%から500%増加します。[ 21 ]
リカバリーシェパーディングは、ヌルポインタ参照解除やゼロ除算などの致命的なエラーからソフトウェアプログラムが回復できるようにする軽量な技術です。[ 22 ]障害を無視するコンピューティング技術と比較すると、リカバリーシェパーディングはコンパイルされたプログラムバイナリに直接作用し、プログラムを再コンパイルする必要はありません。
これは、ジャストインタイムバイナリ計測フレームワークPinを使用します。エラーが発生するとアプリケーション プロセスにアタッチし、実行を修復し、実行が継続するにつれて修復効果を追跡し、修復効果をアプリケーション プロセス内に保持し、すべての修復効果がプロセス状態からフラッシュされた後にプロセスからデタッチします。プログラムの通常の実行を妨げないため、オーバーヘッドはごくわずかです。[ 22 ]体系的に収集された 18 個の実世界のヌル参照解除エラーとゼロ除算エラーのうち 17 個については、プロトタイプ実装により、アプリケーションが実行を継続して、エラーをトリガーする入力に対してユーザーに許容可能な出力とサービスを提供できます。[ 22 ]
サーキットブレーカー設計パターンは、分散システムにおける壊滅的な障害を回避するための手法である。
冗長性とは、障害のない環境では不要となる機能を提供することです。[ 23 ]これは、1 つのコンポーネントが故障した場合に自動的に「作動する」バックアップ コンポーネントで構成されます。たとえば、大型貨物トラックは、タイヤが 1 つ外れても大きな影響はありません。トラックには多くのタイヤがあり、どのタイヤも重要ではありません (前輪は操舵に使用されますが、一般的に他の 4 ~ 16 本のタイヤよりも個々の負荷と合計負荷が少ないため、故障する可能性は低くなります)。システムの信頼性を向上させるために冗長性を組み込むという考え方は、1950 年代にジョン・フォン・ノイマンによって開拓されました。 [ 24 ]
冗長性には、空間冗長性と時間冗長性の 2 種類があります。[ 25 ]空間冗長性と時間冗長性です。空間冗長性は、障害のない動作には不要な追加のコンポーネント、機能、またはデータ項目を提供します。空間冗長性は、システムに追加される冗長リソースの種類に応じて、ハードウェア冗長性、ソフトウェア冗長性、および情報冗長性にさらに分類されます。時間冗長性では、計算またはデータ送信が繰り返され、結果が以前の結果の保存されたコピーと比較されます。この種のテストの現在の用語は、サービス内障害耐性テスト、略して ISFTT と呼ばれます。
耐障害性設計の利点は明白だが、その欠点の多くは明白ではない。
耐障害性と、めったに問題が発生しないシステムには違いがあります。例えば、ウェスタン・エレクトリック社のクロスバーシステムは、40年間で2時間という低い故障率だったため、非常に耐障害性に優れていました。しかし、故障が発生すると完全に動作が停止してしまうため、耐障害性は備えていませんでした。
{{cite web}}: CS1 maint: url-status (リンク)