2010年10月15日金曜日

よく分からないCAP定理の話をしよう

MongodbやCassandra等の最近流行のNosqlの紹介に何故かついてくる「CAP定理」。その内容はさらっと書くと以下との事。


分散システムでは以下の3つのうち、2つしか満たす事は出来ない。
C:Consistency(一貫性)
A:Availability(可用性)
P:Tolerance to network Paritions(ネットワーク分割耐久性※)
※造語です。


で、例えばMongoDBはCPのシステムですよー。CassandraはAPのシステムですよー。OracleやPostgresql等の従来型RDBはCAですよー。という解説が大体続く。


上記説明を聞いて、「はっ??」と思う人は多いんじゃないでしょうか。
私がよく分からなかったポイントは以下です。


・C(一貫性)の定義が不明。私はACID特性の"C"を連想してしまう。Mongodb等はTransactionの概念が無く、ACIDもくそも無いはずだ。


・A(可用性)の定義も不明。例えばMongodbは"A"が無いという分類になっているが、障害が起きたらしばらく復旧できない、とか、Dataが消失する。。という事を連想してしまう。それは無いだろう。


・P(ネットワーク分割耐久性)の定義も不明。何となくだが、スケールアウト出来るか、出来ないか?という事だろうが、OracleのRAC等は"P"では無いのだろうか。


と言う訳で、CAPのそれぞれの意味を深く考える事がCAP定理の理解につながると考え、色々調べてみました。


CAP定理をGoogleで検索してみた。役に立ちそうなのは以下。。。


http://www.hyuki.com/yukiwiki/wiki.cgi?BrewersCapTheorem
↑訳は間違ってはいないと思うが、この記事の内容は日本語にすると何だか変な気がします。


http://yohei-y.blogspot.com/2009/03/cap-base.html
↑CAP定理が生まれるまでが分かりやすい流れで記載されています。


http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf
↑Brewerさんが問題提起した時のスライド。この中でCAP-theoryという用語で出てきます。(読みましたが、意味があんまり分かりません)


http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.20.1495&rep=rep1&type=pdf
↑CAP定理の証明、らしい。どういうものかと思ってたが論理学?っぽい。
  この論文の中にC、A、Pのそれぞれの定義が記載されている。(上記に同じくよく分かりません)


http://el.jibun.atmarkit.co.jp/forest1040/2009/06/caporacle-rac12.html
↑ORACLE RACの例を取ってCAP定理を解説しています。


日本語の本では以下の解説が分かりやすかったです。

クラウド・アーキテクチャの設計と解析―分散システムの基礎から大規模データストアまで




・・・私の思考過程は省きます



【まとめ】
CAP定理のC、A、Pの定義は"大体のところ"以下だと思う。


Consistency:
あるデータを更新後、他のユーザからの参照時に必ず更新後のデータが読める事。
※ACIDでの"C"とは直接関係は無い。


Availability:
いつでも、ストレス無くデータの読み書きが可能な事。
※高可用性を意味する"High Availability"とは関係が無い。


tolerance to network Partitions:
データを複数のサーバに分割保持する事。
※Oracle RACはデータファイルを分散して持てない為、これには該当しない。(ように思う)

"CA"を満たすシステムの例
→従来型のRDBMS(Oracle,Mysql,Postgresql ...etc)


"CP"を満たすシステムの例
→DNS等


"AP"を満たすシステムの例
→分散データベース等


分からなかったのはココには、"AP"の例としてCassandra,CouchDBを挙げ、"CP"の例としてMongoDBを挙げているのですがなぜなのか分かりませんでした。


また、"A"の定義がやはりあいまいだと感じます。どんなDBMSでも程度の差はあれ一貫性を保つ為に排他制御を行ってるし、それがどの程度でストレスになるかは人によって違いますし。


しかし、この"CAP定理"、米国のwikipediaにも掲載されていませんし、Net上でもあまり目にかかりません。そこまで気にする必要は無いのかなと感じました。