障害耐性のあるシステムの目標
「構成部品の障害があっても,システム全体として正常に機能すること」
・サーバがダウンしている ・クライアントのスタブが古く,新しいサーバを見つけられない
・サーバを起動してあげる ・新しいスタブで,クライアントをコンパイルする
システムの障害耐性を実現する一般的な方法.
間違った情報の回復のために,冗長な情報を付加する
(ex.エラー回復のためのハミング符号)
実行して,もし必要であればまた繰り返す → 一時的障害や間欠障害に有効
(ex.アトミックトランザクションを使った繰り返して,中止したトランザクションを再度実行する)
冗長な装置を付加する
例として,冗長なプロセッサを付加した場合の2つの方法.
・fail-silentの場合 :k+1個の冗長構成 ・ビザンチン障害の場合:2k+1個の冗長構成 k=1のときは,3つの構成部品を並列に動作させ,その結果の多数決をとる (TMR:Triple Modular Redundancy)
・通常の処理は,1つのサーバに送ればいいので簡単. ・マシンはプライマリサーバとバックアップサーバの2つだけでいい.
・ビザンチン障害時には,プライマリサーバが正常に動作してるように見えてしまう. ・障害のタイミングによって,2つのサーバによって処理が複数回行われてしまうかもしれない.
・バックアップがプライマリに対して正常かどうかの確認メッセージを周期的に送る. → プライマリの応答が遅いのと,クラッシュを区別するのが難しい ・バックアップに切り替えたら,ハードウェアによってプライマリを強制的にストップさせる.
分散処理における合意では,プロセスがすべて正常に合意しなければならない.
→ 目標:すべての正常なプロセスの間で合意に達すること
プロセスは正常だが,ときどきメッセージが無くなる(通信の信頼性が無い)
・谷に赤軍(5000人)がいて,その両側の丘の上に2つの青軍(3000人ずつ)がいる ・青軍が赤軍を攻めるときに,1つの軍だと負けてしまう ・2つの軍がいっぺんに仕掛ければ赤軍に勝てる ・反対側にいる青軍に連絡をとって,合意の下で一斉攻撃を仕掛けたい ・伝令は谷を通っていくため,赤軍に捕まってしまう心配があり,通信の信頼性が無い
・最後のメッセージが配達できないと実行できない ・最後のメッセージが正しく配達することが保証できない
通信は信頼できるが,プロセスに異常があるかもしれない.
・谷に赤軍がいて,まわりの丘にn個の青軍(それぞれに将軍)がいる ・青軍の間の通信は1対1で電話が使えて信頼性がある ・青軍のn人の将軍の内,m人は反逆者で,合意を阻止しようとする ・忠実な将軍は真実を伝え,反逆者はすべての将軍にウソをつく
・各将軍は,自分の兵力を他の全ての将軍に伝える ・その後,それぞれの各将軍は集まった情報から全ての将軍の兵力リストを作る ・そして,各将軍はそのリストをまた他の全ての将軍に伝える ・各将軍は受け取ったすべてのメッセージから多数決によって真実を決める