Cassandra修行

written by shn, on Mar 15, 2010 11:10:00 PM.

日曜大工はPython3kにしようか > Python3kはMySQLドライバ無いのか > じゃあCassandra使ってみるか > thriftもPython3k無いじゃん > じゃあ2.6でCassandraか、という経路によりCassandraにトライしてみることにしました。

修行中の身である故、情報の正確性は無担保。 ためしたCassandraは0.5.1

Cassandraとは

Cassandraとは、もともとFacebookが開発して、現在はApacheでホスティングされている分散データベース。最近、TwitterがMySQLから移行したことで話題になった。

いわゆるNoSQL(この呼び方は好きじゃないけど)のジャンルに属するデータベースで、データモデルの表現力的には DataStore(GAE) > Cassandra > Key-Value Storeぐらいのものなんじゃないのかなと思う。

動かしてみる

DLしてみたらJavaだった。Javaなんて大学のレポートいらいですね。あれもJythonで書いてJavaコードにコンパイルして出した気がする。とりあえずシングルノードで動かしてみようと思って

bin/cassandra -f

してみたら、いくつかライブラリが足りなかった(主にログ関係?)。 slf4j-log4j12-1.5.11.jar, slf4j-api-1.5.11.jar, commons-collections-3.2.1.jar, google-collect-1.0.jar, log4j-1.2.15.jarを足してもっかい起動。拍子抜け 。-fはフォアグラウンドで起動するオプション。

Cassandraのデータモデル

CassandraのデータモデルはプロジェクトWikiの他に、PythonのライブラリであるLazyboyや、その作者のブログに詳しい。

特に三つ目のがわかりやすいので、いいんじゃないでしょうか。

Cassandra用語

CassandraのDataModelはKeyspace > (Super)ColumnFamily > Columnという構成になっている。 RDBMSで言うと、Keyspaceは"データベース"、ColumnFamilyは"テーブル"ってぐらいのポジションではないかと。

Column

Columは最小のデータ単位。name, value, timestampのタプル。

{
  "name": "emailAddress",
  "value": "foo@bar.com",
  "timestamp": 123456789
}

timestampはとりあえずスルーしておいていいらしい。name, valueについてはバイト列として扱う。

ColumnFamily

ColumnFamilyは、keyで識別されるRowの固まり。各Rowの中身はColumnのマップになっている。Rowは常にソート済みで保持されている。 ColumnFamilyの定義 - Row keyの評価法(バイト列として評価するか、utf8文字列として評価するか)や、レプリケーション - はstorage-conf.xmlで定義する。

ColumnFamilyのソート順

インデックスが無い代わりに、ColumnFamilyが常にソートされているっていうのがCassandraのユニークな点ではないだろうか。RSS Reader/SNS/Blogのような、昨今のウェブサービス市場を占める「なんかのタイムラインを表示する」アプリケーションに特化している(まだ実際にさわってないからようわからんけど)

ColumnFamilyのソート順はBytesType, UTF8Type, LexicalUUIDType, TimeUUIDType, AsciiType, LongTypeがある模様。 BytesTypeAsciiTypeの違いは後で調べる。 LongTypeは64bit integerと扱うようだ。64bit以上の値とかを入れたらどうなるんだろう。バイト列としてセットするのだろうか。

LexicalUUIDTypeは128bitのUUIDとして評価するのかな。多分、想像だけどLazyboyなんかのライブラリがオブジェクトを追加するときにUUIDを自動生成したりして、keyを決めるのがめんどいときに便利なんじゃないだろうか。

TimeUUIDTypeはTime UUID(ver1のUUIDのことかしら。ようわからん)として評価する? LongTypeと比べたときの利点は、timestampが被っても大丈夫ってあたりなんだろうか? 上にあげたブログ記事に、ブログ記事のタグごとのタイムラインをTimeUUIDTypeで管理する例が載っている。

SuperColumnFamily

SuperColumnFamilyはColumnFamilyのSuperColumn版。SuperColumnとはValueの代わりにColumnのリストが入っている。

TODO

だんだん書いていて飽きてきた。ただ、書くと再確認になってよいですね。ColumnFamilyのどこがソートされているのかについてアヤフヤだったのがわかった。

日本語の情報あまりないなーと思っていたら、id:dannさんが書いていた。幅広く解説してある。紹介されていた、Twitterのデータ構造をCassandraでやってみる例(Twissandra)は後で見よう。

TODOとしては

  • Twissandra見る
  • コード書いてみる
  • Replication, Partitioning, Consistencyあたりを理解する。

あたりだろうか

Leave a Reply