フォールトトレラントシステム(Fault tolerant system)は、その構成部品の一部が故障しても正常に処理を続行するシステムである。本項目はフォールトトレラントシステムの特定の実装方法に関して記述する。一般的な理論についてはフォールトトレラント設計を参照されたい。

## 概要

障害が発生した場合、単純な設計のシステムでは少しの障害でも全体が停止するが、フォールトトレラントシステムでは完全に機能を保ったまま処理を続行するか、障害の重大性に応じて機能を低下させながらも処理を続行する。フォールトトレラント性は連続稼働が求められるシステムや人命に関わるシステムで特に求められる。

フォールトトレラント性は個々のマシンの特性というだけではなく、マシン間の連携についての規則の特性でもある。例えば、TCP はパケット通信ネットワーク内に不完全なリンクや高負荷のリンクがあっても信頼性の高い双方向通信ができるように設計されている。これは受信側でパケット喪失、パケット二重化、順序変更などがあるものとしてプロトコルが設計されているためであり、結果として通信性能が低下してもデータの正確性が損なわれないようになっているのである。

データ形式も同様な考え方を当てはめることが出来る。例えばHTMLは下位互換を維持するよう設計されているため、新たな機能を使ったHTMLを古いブラウザが読み込んだとき、それを処理できないものとして捨てるのではなく理解できる範囲で表示することができる。

フォールトトレラントシステムにおける障害復旧はロールフォワード(roll-forward)とロールバック(roll-back)に分けられる。システムに障害が発生しエラーとなったとき、ロールフォワード復旧ではその時点のシステム状態で復旧を行い、処理をさらに先に進める。ロールバック復旧ではシステム状態を少しだけ前に戻して(例えばチェックポイントを使って)そこから処理を再開する。ロールバック復旧では、チェックポイント(戻す地点)と障害発生地点との間の処理は冪等(何度実行しても一回実行したのと同じ)でなければならない。いくつかのシステムはエラーの種類やエラー発生箇所によってロールフォワードとロールバックを使い分けている。

個々のシステム内では、フォールトトレランス性は例外的な状態を想定してそれに対処できるようにシステムを構築することで実現される。また、一般に自己安定性を持たせることによってシステムがエラーのない状態に収斂させることでフォールトトレランス性を実現する。しかし、システム障害が重大でそれに対処するのに非常にコストがかかる場合、よりよい方法は何らかの二重化をすることである。

## フォールトトレラントシステムに求められること

フォールトトレラントシステムに求められる基本的特性は以下の通りである。

1. 単一障害点(single point of failure)がないこと(障害に対して全体の障害とならないよう対策が施されていること)
2. 単一故障点(single point of repair)がないこと(ハードウェア故障についても同様)
3. 障害部品の隔離ができること
4. 障害の伝播を防ぐこと
5. 代替モードがあること

さらに、フォールトトレラントシステムは予定されたサービス停止と予期しないサービス停止の両方を尺度として使うことができる。通常、これらはアプリケーションレベルでの話であり、ハードウェアレベルの話ではない。これらを考慮した値を可用性と呼び、パーセントで表す(つまり、全時間のうち、サービス停止していない時間が何パーセントか)。99.999% の可用性を保証されたシステムは、統計的に99.999%の時間稼動し続けるはずである。

## 二重化によるフォールトトレラントシステム

二重化(多重化、冗長化)によるフォールトトレラント性は三つに分類される。

- レプリケーション:同じシステムの複製を複数用意し、それら全部に同じ処理を並列に実行させ、定足数を満足した結果を正しい結果として採用する。
- 冗長性:同じシステムの複製を複数用意し、障害が発生したら予備のシステムに切り替える。
- 多様性:同じ仕様の異なる実装のシステムを複数用意し、レプリケーションのようにそれを運用する。この場合、各システムが同じ障害を発生することがないと考えられる。

RAIDは冗長性を活用したフォールトトレラントな記憶装置の例である。

ロックステップ方式のフォールトトレラントマシンは各部分を多重化して並列して動作させる。多重化された各部分はどの時点で見ても全く同じ状態でなければならない。同じ入力を与えた場合に同じ出力が得られることが期待される。多重化部分の出力は多数決回路に集められ比較される。各部品を二重化したマシンはdual modular redundant(DMR)と呼ばれる。この場合、多数決回路は結果が異なっているということしか分からないので、復旧は別の方法で行う必要がある。各部品を三重化したマシンはtriple modular redundant(TMR)と呼ばれる。この場合の多数決回路は比較結果が2対1になったときにエラーを判定するので、正しい(と思われる)結果を出力することができ、エラーと判定された結果を捨てることが出来る。その後、エラーを発生させた複製部品は故障したものとみなし、多数決回路はDMR状態に移行する。このモデルはもっと多くの複製についても当てはめることが出来る。

ロックステップ方式のフォールトトレラントマシンは簡単に完全同期させることができ、各複製部品は同じクロックで同期して動作する。もちろん、各複製をクロック同期させないロックステップシステムも構築可能である(多数決回路で待ち合わせる)。(訳注:ただし、クロック同期しない場合、故障によって出力を多数決回路に送れなくなった部品をどう扱うかが問題となる。)

複製を同期させるには個々の内部状態が一致していなければならない。リセット状態などの同じ内部状態からいっせいに動作を開始するのである。一方で、複製間で状態をコピーするという方法もある。

DMRの一種にpair-and-spareがある。ふたつの複製部品がロックステップで同じ処理を行い、多数決回路が相異を検出したらエラー信号を出力する。もうひとつの二重化システムが全く同じ処理をしていて、ふたつの二重化システムの出力を比較してエラーとなっていない方を採用する。pair-and-spare では云わば四重化であって TMR よりも冗長だが、商用システムで採用された例もある。

## 単一故障点

システムの障害が発生し、何らかの修理が必要となったとき、修理している最中でもサービスが続行可能でなければならない。あるいは、ソフトウェアの障害でパッチを当てる場合も同様である。

## 障害部品の隔離

障害が発生したとき、その発生箇所を特定し、隔離できなければならない。このため、独立した障害箇所特定のための機構が必要となる。

## 障害の封じ込め

障害が発生すると、それがシステム全体に伝播していき、システム全体が障害となることがある。例えば、通信関係で障害が発生すると、不正なパケットが大量に発生してネットワーク全体の回線容量を消費し、結果としてサービス不能となる場合がある。このような場合に障害箇所を隔離して、システム全体に影響が及ばないようにする必要がある。

## 代替モード

障害によってはシステム(あるいは操作者や結果)を危険にさらす可能性がある。これを防ぐため、ミッションクリティカルなシステム(兵器システム、油圧機械など)はセーフモードを備える。これはインターロック機構やソフトウェアで実装可能である。