9章一貫性と合意

間違っているかもしれなくても動き続ける方が良いのか、それとも正しくあるべく停止してしまう方が良いのか?

――Jay Kreps, “A Few Notes on Kafka and Jepsen”(2013)

8章で論じたとおり、分散システムでは多くのことがおかしくなります。こういったフォールトへの最もシンプルな対応方法は、単純にサービス全体を落としてしまい、ユーザーにエラーメッセージを表示することです。この解決方法が受け入れがたいなら、フォールトに耐える方法を見つけ出さなければなりません。すなわち、内部のコンポーネントの一部に問題があってサービスを正しく機能させ続ける方法が必要なのです。

本章では、耐障害性(fault-tolerance)を持つ分散システムを構築するためのアルゴリズムとプロトコルの例について論じます。前提として、8章で述べた問題はすべて起こりうるものとします。すなわちパケットはロストし、順序は狂い、複製され、ネットワークでどれだけの遅延が生じるか分かりません。クロックはせいぜい大まかにしか正しくありません。ノードは(たとえばガベージコレクションのため)いつ一時停止したりクラッシュしたりするか分かりません。

耐障害性を持つシステムを構築するための最善の方法は、有益な保証を持つ汎用的な抽象概念を見いだし、それらを一度だけ実装し、アプリケーションをその保証に依存させることです。これは、7章でトランザクションに関して用いたアプローチと同じです。トランザクションを使うことで、アプリケーションはクラッシュが起こることはなく(原子性)、データベースが並行にアクセスされることはなく(分離性)、ストレージデバイスは完璧な信頼性を持つ(永続性)かのように振る舞うことができます。クラッシュやレース条件、ディスクの障害などが仮に生じてしまったとしても、トランザクションによる抽象化がそれらの問題を隠蔽し、アプリケーションはこれらの問題を気にする必要はなくなります。 ...

Get データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.