auの日記

プログラミング初心者の日記。(auはハンドルネームです)

CAP定理について調べてみた

auです。

データベースを学んでいる際に、CAP定理というものがあることを知りました。調べると面白そうなのでまとめてみようと思います。

CAP定理とは

CAP定理とは、クラウドサービスなどの複数のコンピュータからなる分散システムでは、これから説明する「C・A・P」が満たすことがないという定理です。

Consistency(一貫性):どのノードからデータをみても同じであること
Availability(可用性):一部のノードで障害が起きても、いつでもデータにアクセスできる状態であること。単一障害点がないことが必要である。
Partition Tolerance(ネットワーク分断耐性): ネットワークが2つに分断されてしまい、お互いに通信ができなくなっても正しく動作すること

それぞれの頭文字をとってCAP定理と言われています。

そして、それぞれの特性は3つ同時に満たすことはできません。

単一障害点があれば、ネットワークは分断されます。しかし、データの更新ができないので、可用性が失われるからです。

しかし、以下の3パターンは成立します。

C+Aの場合

C+Aの場合、全てのサーバでデータを常に最新の状態で知る必要があります。そのために、トランザクション処理などで整合性を保つのですが、これはノード間で通信する必要があるため、Pが起きてしまった場合には通信していない状態になるので不可能です。

C+Pの場合

分断耐性があるため、サービスは継続されます。

しかし、分断されている場合には、新しい値に更新することができないため、サービスを続けることはできません。

このことから、Aの特性を保つことができません。

A+Pの場合

もっとも障害に強くなります。

ネットワークの分断があったとしても、最新の使えるデータでサービスを継続するので、常にサービスを続けることができます。

しかし、分断されたサーバのもつデータは、最新である保障がないので、Cの特性はありません。


RDBMSはCAを満たし、NoSQLはCPあるいはAPを重視しているようです。

これを知っていると、どのデータベースを使えばいいのかの参考になるかもしれませんね。