NoSQLについて(MongoDB, Cassandra, HBase ) | 世界的日曜WEBプログラマー日記

世界的日曜WEBプログラマー日記

一年後に世界的なWEBサービスを運営するにはどうすればいいのか書いていく(予定)


NoSQLについて
NoSQLは「Not Only SQL]でリレーショナルなデータベースだけじゃねぇぜという意味で、SQLを否定しているわけではありません。
NoSQLの代表的な3つ以下に挙げてみます。
・Cassandra( facebook )
・MongoDB
・HBase( GoogleのBigtableライク )
上記三つはコンピュータに携わる方なら必ず知っておきましょう。

NoSQLを理解する上で避けて通れないのはCAP理論です。CAP理論の[CAP]とは
一貫性(C)、可視性(A)、分散性(P)
を表しています。「一貫性」とはデータが一貫性していることを表し、可視性とはどんなときもアクセス可能であること、分散性とは分散して処理が出来ることを表しています。
データベースにはその特性をみてC,A,P、或いはそれらの組み合わせ(CA, APなど)の属性を割り当てることが可能です。ただし、CAPを3つ満たすDBはこの世に存在しません。

世にあるDBがどのような属性を持っているか見てみます。
例えばMySQLなどのRDBMSは一貫性と可視性を備えています。CとA属性があるといえます。しかし分散したサーバでMySQLを管理することはとても難しいものです。MySQLは上記で言うP属性がありません。

Cassandra, MongoDB, HBaseは分散サーバ向きです。すべてにP属性が付いています。
データが非常に多くなってきた近年、データを捌ききるためには分散して処理できる機構が必要です。
P属性がつくデータベースが求められてきています。
昨今ではNoSQLが流行っているといわれますが、「分散性があるサーバが流行っている」と言ったほうが正しいです。分散サーバはNoSQLであることが多く、結果としてNoSQLが流行ってきているのです。

さて、CAP理論にもどりますが、CAPのうち同時に3つが満たされない事について簡単に説明します。
HbaseとMogoDBは一貫性Cがとられています。つまりMySQLのようにいつでも正確なデータを返します。しかし分散サーバです。分散ということはデータを保持したサーバが一個落ちればその中にあるデータは見ることはできません。つまりA属性である可視性が犠牲になっています。(Aを犠牲にしてPとCを取りました。)

Cassandraは一貫性を無視しました。その代わり中にデータのコピーを複数持つことで分散サーバのうち、一台が落ちても他のサーバを経由してデータを覗ける仕組みを設けています。つまりAccess性は失いません。その代わりですが、内部でのデータコピーあるということで、これが一貫しているとは限らなくなります。Cassandraは一貫性であるC属性を無視し、そのかわりA属性を重視したのです。Cを犠牲にしてAとPを取ったのです。

MySQLは分散性はなく、そのかわりAccess性と一貫性があります。

このようにC、A、Pはみっつ同時にはなりえないのです。

CA, CP, APのモデルを使えばいいかについてはサーバの種類で使い分けるといいでしょう。
例えばデータ量がそんなに多くなければ分散サーバの意味は余り無いためP属性を無視できます。
C属性とA属性を満たすサーバといえばMySQLなどのリレーショナルなデータベースです。ただし、MySQLはカラム追加が面倒です。ここで、MongoDBがキラリと光ってきます。

MongoDBは分散化できますが、分散化しなくても構いません。分散化しなければP属性がなくなります。
そして分散する必要は無くなったためA属性が現れます。MongoDBは一貫性(C)のあるDBですのでAC属性となり、結果MySQLと同じ属性になります。そしてMongoDBはスキーマレス(カラムの追加が自由自在)です。MongoDBが流行っているのは、スキーマレスでMySQLと同じ属性を持つことができるからでしょう。
なお、MongoDBはShardingを用いることで分散データベースを実現します。詳しくは本家のドキュメントをご覧ください。いつか紹介しようと思います。

蛇足ですがCassandra、Hbaseは列指向、MongoDBドキュメント指向と言われています。
こちらも詳しくは別の機会に説明します。

株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house