はじめに
現在の世の中には数多くのデータを保存できるシステムが出ています。 私が作るシステムはどのDatabaseを使うべきでしょうか? 拡張性はどの程度持っていくべきか、使用できる費用はどのくらいか、チームの技術熟練度はどうなのか… などなど色々考えなければなりません。 今日は、皆さんのdatabase選択の一つの尺度として、お役に立つCAP理論について話してみたいと思います。
CAP理論
CAP理論(またはBrewers theorem)とは、Networkで連結された分散データベースシステムは一貫性(Consistency)、可用性(Availability)、and分断耐性(Partition Tolerance)の3つの特性のうち、2つの特性のみを満たすことができ、3つとも満たすことができない理論です。 それでは、各構成要素について見ていくことにしましょう。
一貫性(Consistency)
一貫性を持つということは、全てのデータを要求する時の応答として最新の変更されたデータをリターンまたは失敗をリターンするということです。 つまり、すべての読み取りに対してDBノードが常に同じデータを持っていなければならないという意味です。
DB が 2つのインスタンスを維持している場合は、A に要請しても、B に要請しても、同じ値が返されることを意味します。 これは、AでupdateしてもBでupdateした場合、誰かが同期される前にREADをするならすぐに返すのではなく、すべて同期化してREADになる必要があります。
可用性(Availability)
可用性は、すべての要請に対して正常に応答するということです。 つまり、クラスターのノードの一部で障害(Downなど)が発生しても、READやWRITEなどの動作は常に成功裏にリターンされなければならないということです。
分断耐性(Partition Tolerance)
分断耐性とは、Node間の通信障害が発生しても動作しなければならないということです。 Instacne AとBがあります。 この時、AとBのインスタンス間のネットワークに障害が発生しました。 ユーザーはADBでクエリーをしました。 インスタンス Aは Bの状態を知りませんが、Aだけで動作します。 これを分断耐性といいます。
可用性VS分断耐性
可用性と分断耐性の概念が紛らわしいかもしれません。 個人的に確認した際に可用性はノードに障害が発生してDownされた時、分断耐性はノード間の通信が正常に行われない時であることを確認しました。
クライアントの立場で見ると差があります。 前者の場合はclientaとbがある場合も同じ障害が出ないノードを利用しますが、後者の場合はclient別に見ているノードが異なることがあります。
実際のDB比較
CAP理論に合わせてDBがどのような特性を2つ持っているかを確認した三角形のグラフです。 例を挙げて確認してみましょう。
MySQL
MySQL は、上の三角形のグラフで CA に属するとされています。 しかし実質的には設定次第でCPまたはCAに属することができます。 デフォルトでは、MySQL をそのまま使用する場合は CA に属することになります。 なぜなら、mainになるmasterノードがあり、そのノードを複製して使うslaveがあるパラダイムを使うからです。 このときMySqlは可用性と一貫性を満足させることができます。
しかし、MySQLはクラスタの設定をサポートします。 クラスタの設定をすると、MySQLはCPを満足するシステムになります。 なぜなら、データを保持するほどのクラスタノードが存在しなければクラスタは終了するからです。
DynamoDB
DynamoDB は、aws でサポートする keyValue の NoSQL で、AP に属すると言われています。 Dynamoはキー値をhashingし、またこの値をmodして、正しいサーバーに保存しておきます。 そして、全ノードの中の一部のノードに複製しておきます。 そして、データversioningも行います。
DynamoDB には、strongly consistent の設定をすることができます。 この設定をすると、DynamoDBはCPに変わります。 この設定をすると最新のデータをリターンします。 そのため、すべてのノードを探すので可用性は少し落ちることになります。
まとめ
CAP理論のように完璧なCP、APシステムはなく、ほとんどCPとAPの中間くらいに存在します。 そして上記の例題でも見たように、コンフィギュレーションによって変わる部分でもあります。 また、理論そのものに幾つかの限界点が存在します。 最も問題となるのが、Pに対する明確な定義が足りないことです。 こんな問題点を乗り越えるためにPACELC理論が出たりしました。 は、あくまで参考としてご覧ください。
しかし、CAPの中から2種類を選択できるということは、DataBaseを選択する際の基準になる重要なことと思われます。