第27章: 障害

プラネタリスケールコンピュータでは、障害(フォールト)は例外的なイベントではなく——標準です。数百万のコンポーネントがあれば、どこかで常に何かが故障しています:ディスクに不良セクタが発生し、ネットワークスイッチがパケットをドロップし、サーバーがメモリ不足になり、ソフトウェアバグがクラッシュを引き起こしています。問題は障害が発生するかどうかではなく、発生したときにシステムがどう対応するかです。

障害はそのスコープと期間によって分類できます。一時的な障害は短時間です:瞬間的なネットワークグリッチ、ガベージコレクションの一時停止、短時間のCPUスパイク。これらはリトライで最も効果的に処理されます。障害は通常自己解決するからです。間欠的な障害は予測不能に再発します:不安定なディスク、パケットロスのあるネットワークリンク、メモリリークのあるサービス。これらは検出と修復が必要です。永続的な障害は持続します:死んだディスク、故障したサーバー、破損したデータセット。これらは交換またはリカバリが必要です。

フォールトトレランスはあらゆるレベルの冗長性を通じて構築されます。データは複数のサーバーにレプリケートされます(コンセンサスシステムのように)。サービスは複数のマシンで実行されます(ディスカバリサービスによる管理)。ネットワークパスは複製されます。電源にはバックアップがあります。目標は、単一の障害——そして理想的には2つの同時障害の組み合わせ——がユーザーに見える障害を引き起こさないことを保証することです。

検出はトレランスと同じくらい重要です。モニタリングサービスはハートビートタイムアウトとメトリクスの異常を通じて障害を検出します。障害が早く検出されるほど、自動フェイルオーバーであれ人間の介入であれ、早く軽減できます。