ビザンチン障害(Byzantine faults)


 システムの故障において、 発生する障害には大まかにいって2パターンありますが、 そのうちの一方で、 より陰険な方がこのビザンチン障害です。

次のことを前提として知っておく必要があります。

 たとえシステムがどのように故障しても、 故障そのものを検出する方法はない。 故障したにも関わらず一切の障害が発生しなかった場合、 その故障をソフトウェアレベルで検出する方法はない。

 従って、コンピューターシステムにとって問題になるのは、 故障ではなく、 故障によって(あるいはそれ以外のものでも良いが)発生する障害である。

 逆に故障が発生したとしても、 障害が出現しないようにシステムを構築すれば それはフォールトトレラントなシステムと言うことができる。

 システムというのは基本的に「入力を受けて、出力を出す」代物であり、 電気信号で処理する限り「入力」が『本当に入ったのかどうか』を確認する 術はありません (「電気が流れている」ということは「入力が入った」ことを 意味するとは限らないから)。 このため、 何らかの障害が発生していることが検出できるとすれば、 それはでてくるべき出力に問題があるときだけです。

 このため、障害は次の2パターンに区別できます。

 沈黙型障害 というのは、 本来ならば返すべき何らかの返答を 一切行わなくなるタイプの障害です。  叩こうが殴ろうがうんともすんとも言わない、 というこの障害は
「処理結果はこれだけの時間の間に返ってくるはずだ」
という時間を定義し、 それ以上待つようであれば障害とする以外に検出方法はありません。 が、逆に言えばこの定義で何とかなってしまうもので、 ビザンチン障害に比べるとはるかに対処法は簡単です。

 ビザンチン障害 というのは、 答を返してくれるのだがその答が信頼できない場合を言います。 その昔、 ビザンチン帝国が権謀術数に満ち溢れたとき起った現象と 全く同じなのでこの名前がついたのだそうです。

 ビザンチン障害の問題点は、 権謀術数の場合と同様 「嘘をつく」点にあります。

 「常時嘘をつく」のであれば検出方法はあります。 どうでもいいような質問を投げてみて、 答が間違っていることを確認すれば良いわけです。 この問題が最もいやらしいのは
「自分が嘘をつく存在であるということに対しても嘘をつくことがある」
という点にあります。 つまり、どうでもいいような質問には本当のことを答え、 肝腎要な瞬間に嘘をつくような障害がある、ということです。

 まさかと思うかも知れませんが、実際にはこの手の障害の方が多い。 俗に「バグ」と言われるものはすべからくこの類いだし、 Hardware が故障する場合だって実際にはこの手の 「どこかのビット以外は絶対安心」 な答が返ってきたりすることも多い。

 多数決などの冗長性を利用してある程度までは回避可能です。 しかし、万全ではありません。 多数決は最終的にどこかで集計し最終決定を下す必要がありますが、 そこが故障する可能性があります。

 結局、ビザンチン障害はゲーム理論で言うところの 『囚人のジレンマ』に陥る可能性を常に持っており、 それゆえにどうやって回避したら良いものやら、 いまだに完全な答が判っていない種類の問題なのです。

 ただ一つだけ言えるのは、 『バグ』は明らかにビザンチン障害を発生させるので、 ソフトウェアやハードウェアのバグは火急かつ速やかに排除し、 また入り込みそうな類いの冗長性を持たせないことで robustness を 確保するのは重要です。