はじめに
現在はクラウドサーバーなどの分散システムを前提とした設計が主流になっており、データや処理を別々のサーバーに保持するという流れがあります。
そうした分散システムを設計する際に必ずと言っていいほど話に出てくるのがCAP理論です。
CAP理論とは
CAP理論とは、分散システムはConsistency(一貫性) 、Availability(可用性)、Tolerance to network Paritions(分断耐性)の3つの保証のうち、同時に2つを満たすことはできるが、全てを満たすことはできないとするものです。以下それぞれの項目について書いていきます。
- Consistency: 一貫性
最新のデータを読み込むことができるという特性です。
- Availability: 可用性
必ずデータにアクセスできるという特性です。
- Tolerance to network Paritions: 分断耐性
何らかの障害により通信が分断されたとしても、データにアクセスできるという特性です。
これだけだと少し抽象的でわかりにくいので、銀行の口座情報を例にして1つ1つの項目について考えてみましょう。
例えばAさんが自分の口座からBさんの口座へ5万円の振り込みをしたいとします。
ここではわかりやすいように、AさんとBさんの口座には10万円が入っていることとします。
さて、AさんはBさんへ5万円振り込みました。そしてBさんへ連絡をします。
Aさん「5万円振り込んでおいたよ」
Bさん「ありがとう!確認するね」
そして、Bさんはすぐさま口座を確認してみました。すると、本来送られた後には15万円であるはずのBさんの口座には10万円しかありません。
このように、最新の情報を受け取れない状態のことを「一貫性がない」、と言います。
一方で、最新の情報ではないものの、口座情報にはアクセスすることはできています。この状態は、「可用性がある」状態と言えます。
では、もしBさんが口座情報を確認しようとした際に、何も情報を得ることができなかったらどうでしょう。
この場合、通信に何らかの不具合があってデータベースの情報にアクセスできていない可能性があります。これは、「分断耐性がない」システムであると言えます。
本当にトレードオフ?
さて、これら3つの特性を同時に実現することはできるのでしょうか?
常に最新の情報に、通信の障害があったとしても、必ずアクセスできる状態...。
一番最初に述べましたが、CAP理論では3つはトレードオフの存在であり、分散システムにおいて全てを同時に実現することはできないとしています。
どういうことなのでしょうか。
大前提としてインターネットサービスを行う事業者にとって、いつでもデータにアクセスできるというのは必須でしょう。先ほどの例のように口座情報を得たいのに、その情報にアクセスできないと言うのはユーザビリティを損ないます。そのため、可用性は必須と言っていいでしょう。
可用性を実現させるためには、単一障害点をなくす設計が必要です。
単一障害点とは、ある1つのサーバが何らかの不具合を持った時に、目的のデータにアクセスできなくなってしまう時のサーバのこと(点)を言います。
この部分と関連性が強いのが分断耐性です。通信の障害があった場合にもアクセスができるように設計をする必要があります。そのため、ある通信経路が接続不可能になったとしても、別の経路で目的のデータにアクセスすることができるようにします。
ただ、上記のように分散システムはデータを別々に保持しているため、通信による遅延などにより必ずしも最新のデータを全てのサーバで持つことができるとは限りません。ここで一貫性が達成できないと言うことになります。
終わりに
最近ではこのようなトレードオフの関係が必ずしもゼロイチの考え方ではないとして、BASEと言う考え方も出てきています。
これは最終的には全てのデータは一貫性が担保される、と言ったものです。
詳しい内容についてはまた書きたいと思います。