ソフトウェアのフォールトトレランスとは、システムまたはハードウェアに障害が発生してもコンピュータソフトウェアが通常の動作を継続する能力のことである。フォールトトレラントソフトウェアは、障害が発生しても要件を満たす能力を持つ。[ 1 ] [ 2 ]
システムの耐障害性を高めるには、再試行、フォールバック、タイムアウト、サーキットブレーカー、バルクヘッドパターンなどの設計パターンを組み合わせる必要があります。 [ 3 ] [ 4 ]
システムの耐障害性を高めるには、99パーセンタイルのレイテンシを測定し、残りの1%(テールレイテンシ)を自己修復メカニズムで抑制する必要があります。[ 5 ]
導入
唯一不変なものは変化です。これはソフトウェアシステムにおいては、他のほとんどの現象よりも特に当てはまります。[ 6 ]すべてのソフトウェアが同じように変化するわけではないため、ソフトウェアのフォールトトレランス手法は、変数値を変更して許容可能なプログラム状態を作り出すことで実行エラーを克服するように設計されています。[ 7 ]ソフトウェアのフォールトを制御する必要性は、今日のソフトウェア業界が直面している最も深刻な課題の一つです。フォールトトレランスは、ソフトウェア開発の初期段階で重要な考慮事項でなければなりません。
ソフトウェアのフォールト トレランスにはさまざまなメカニズムがあり、その中には次のようなものがあります。
- 回復ブロック
- Nバージョンソフトウェア
- 自己チェックソフトウェア
オペレーティングシステムの障害
コンピュータアプリケーションは、キーボード、マウス、画面、ディスクドライブ、ネットワーク、プリンターなどの共有リソースにアクセスするために、アプリケーションプログラミングインターフェース(API)を使用して呼び出しを行います。この呼び出しは、2つの原因で失敗する可能性があります。
- ブロックされた通話
- 欠陥
ブロックされた通話
ブロックされた呼び出しは、結果が得られるまでコンピュータ プログラムを停止する オペレーティング システムからのサービス要求です。
例えば、TCP呼び出しはリモートサーバーからの応答が得られるまでブロックされます。これは、Webブラウザで操作を実行するたびに発生します。集中的な計算は、API呼び出しがブロックされた場合と同じ影響で、長時間の遅延を引き起こします。
ブロックを処理するために使用される方法は 2 つあります。
- スレッド
- タイマー
スレッド化により、ブロックされる可能性のあるAPI呼び出しごとに個別の実行シーケンスが可能になります。これにより、リソースの待機中にアプリケーション全体が停止するのを防ぐことができます。また、他のアクティビティの実行中にAPI呼び出しの状態に関する情報が失われることがないという利点もあります。
スレッド言語には以下のものがあります。
| エイダ | アフニックス | C++ | C# | シルク | エッフェル | アーラン |
| ジャワ | Lisp | マゼンタ | モジュラ3 | ネイピア88 | オズ | プレスト |
| pSather | Perl 5.8.7以降 | PHP | パイソン | R | ルビー | 雑談 |
| Tcl/Tk | V | ユニコン | バレリーナ | D |
タイマーは、ブロックされた呼び出しを中断することを可能にします。周期タイマーは、プログラマーがスレッド処理をエミュレートすることを可能にします。割り込みは通常、ブロックされたAPI呼び出しや集中的な計算の状態に関する情報をすべて破壊するため、プログラマーはこれらの情報を別途追跡する必要があります。
スレッド化されていない言語には次のものがあります。
| バッシュ | JavaScript | SQL | ビジュアルベーシック |
タイマーを使用すると破損した状態が発生します。これは以下の方法で回避できます。
欠陥
障害は POSIX 準拠システム内のシグナルによって引き起こされ、これらのシグナルは API 呼び出し、オペレーティング システム、および他のアプリケーションから発生します。
ハンドラー コードを持たないシグナルは、アプリケーションの早期終了を引き起こす障害になります。
ハンドラとは、アプリケーションがシグナルを受信した際にオンデマンドで実行される関数です。これは例外処理と呼ばれます。
終了シグナルは処理できない唯一のシグナルです。その他のシグナルはすべてハンドラー関数に渡すことができます。
ハンドラー関数には、大きく分けて 2 種類あります。
- 初期化済み
- 列をなして
ソフトウェア起動時に、初期化されたハンドラ関数が各シグナルとペアリングされます。これにより、対応するシグナルが到着するとハンドラ関数が起動します。この手法はタイマーと組み合わせて使用することで、スレッド処理をエミュレートできます。
インラインハンドラ関数は、特殊な構文を使用して呼び出しに関連付けられます。最もよく知られているのは、C++とJavaで使用される以下の構文です。
- 試す
- {
- API_呼び出し();
- }
- キャッチ
- {
- シグナルハンドラコード;
- }
ハードウェア障害
ソフトウェアのハードウェアフォールトトレランスには次の要件があります。
バックアップは、ハードウェアの交換が必要になった場合に備えて情報を維持します。これは2つの方法のいずれかで実行できます。
- ソフトウェアを使用した自動スケジュールバックアップ
- 定期的な手動バックアップ
- 情報の復元
バックアップには、交換用システムでバックアップ情報を利用できるようにするための情報復元戦略が必要です。復元プロセスは通常時間がかかり、復元プロセスが完了するまで情報は利用できなくなります。
冗長性は、複数のコンピュータデバイスに情報を複製することで、復旧遅延を短縮することに依存しています。これは、必要な時まで非アクティブ状態を維持する稼働中のシステムへの継続的なバックアップ(同期バックアップ)によって実現できます。
これは、複数の同一システムで作成された情報を複製することによっても実現でき、回復の遅延を排除できます。
参照
参考文献
- ^ 「ソフトウェアフォールトトレランス」カーネギーメロン大学。
- ^ 「ポータブルでフォールトトレラントなソフトウェアシステム」(PDF)マサチューセッツ工科大学。
- ^ KubernetesネイティブマイクロサービスとQuarkusおよびMicroProfile。Manning。2022年。ISBN 9781638357155。
- ^システム設計面接合格術. マニング社. 2024. ISBN 9781638355915。
- ^ Vitillo, Roberto (2021). 『分散システムを理解する:大規模分散アプリケーションについてすべての開発者が知っておくべきこと』 Roberto Vitillo. ISBN 978-1838430207。
- ^ Eckhardt, DE、「Nモジュール冗長性とNバージョンプログラミングの信頼性における基本的な違い」、The Journal of Systems and Software、8、1988年、313~318頁。
- ^ Ray Giguette と Johnette Hassell、「ソフトウェアフォールトトレランスのリソースフルな方法に向けて」、ACM Southeast 地域会議、1999 年 4 月。