技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Cassandraを窓に突っ込んでみる

ということで、WindowsにCassandraを入れて使ってみる。
Cassandra というのは分散環境に強いBigTableデータベース。ノードを増やせばリニアに性能が上がるという速度・性能重視のDB。
引換に信頼性がトレードオフな状態になっている*1トランザクションを実現したい場合、公式にもHBase使えと言われてる。つまりトランザクションがない。あえてCassandraでトランザクションを自前で実装したければ、ScalaだとRemoteActorにApacheZooKeeperなどを使って自前制御になるのかね。

取り敢えずインストールを試みる。

ApacheCassandra1.1.6 のインストール

現時点での安定リリース版らしい。

  • JRE6 以上のインストール。
  • 公式からバイナリをダウンロード
  • C:\Cassandra あたりの適当なディレクトリを掘って解凍
  • CASSANDRA_HOME 環境変数にディレクトリを指定、PATHに %CASSANDRA_HOME%\bin を追加する。
  • conf\cassandra.yaml を開いて、ログファイルパスとかWindows用に書き換える。

ここまで来たらおk後は起動するだけ。

cassandra -f

これでザクっと起動。

シンプルにコンソールから使用

コンソールからいじる。気にせず下記を記載。

  • cassandra-cli

これで準備完了と。
起動直後のメッセージ

C:\cassandra>cassandra-cli
Starting Cassandra Client
Connected to: "Test Cluster" on 127.0.0.1/9160
Welcome to Cassandra CLI version 1.1.6

Type 'help;' or '?' for help.
Type 'quit;' or 'exit;' to quit.

メッセージの通り、Cassandraは分散ストレージですので、各ノードで「クラスタ」と呼ばれるインスタンスを作ってます。これはローカルマシン上で起動したクラスタに接続したって意味ですね。

概念と操作

Cassandra は基本KVSみたいなもんです。KVSはKeyValueStoreでキーに対して何らかの値を格納するだけのシンプル構成のものでふ。Cassandra はプライマリキーというキーに対して階層化されたデータを格納するDBです。
構造化されたValueを格納するKVSとでも言えるんですかね?一応カラム指向DBとおいうジャンルなんだそうです。

先ずは、keyspaceを作成する。

keyspace はRDBで言うところのDBみたいなものです。早速作ります。

[default@unknown] create keyspace sample;
9cfafc9b-96f0-3bbc-b0a2-4f366c94ffc3
Waiting for schema agreement...
... schemas agree across the cluster
[default@unknown] use sample;
Authenticated to keyspace: sample

そしたらカラムファミリを作成します。RDBで言うところのテーブルみたいなものですね、もっともテーブル定義なんぞありませんけどね。

[default@sample] create column family user;
e7dc172b-5d9e-352a-b477-7b6f377ea967
Waiting for schema agreement...
... schemas agree across the cluster

そしたらいきなりレコードを作成しましょう。テーブル定義なんて代物ありませんから、データ型を自分の脳内設計図で。

name:String primarykey
mail:String
tel:String
address:String

とでもしておきましょう。で、KVSっぽいやつなのでInsert文はないし、当然ですが各行入れるときにTransactionなんぞ無いわけで。

[default@sample] set user['azalea']['mail'] = 'azalea@xxxxx-azalea.net';
org.apache.cassandra.db.marshal.MarshalException: cannot parse 'mail' as hex bytes

げ、エラった、、、、というのも、どうもCassandra先生は内部データはすべて16進に変換して格納するらしい。

[default@sample] set user[utf8('azalea')][utf8('mail')] = utf8('azalea@xxxxx-azalea.net');
Value inserted.
Elapsed time: 31 msec(s).
[default@sample] set user[utf8('azalea')][utf8('tel')] = utf8('XXX-6217-XXXX');
Value inserted.
Elapsed time: 1.91 msec(s).
[default@sample] set user[utf8('azalea')][utf8('address')] = utf8('Chiba');
Value inserted.
Elapsed time: 1.77 msec(s).

わざわざエンコード指定するとかめんどくさいな。

入れたら出してみる

[default@sample] get user[utf8('azalea')];
=> (column=61646472657373, value=Chiba, timestamp=1351349182728000)
=> (column=6d61696c, value=xxxx@xxxxx-azalea.net, timestamp=1351348960864000)
=> (column=74656c, value=XXX-6217-XXXX, timestamp=1351349114914000)
Returned 3 results.
Elapsed time: 70 msec(s).
[default@sample]

取り敢えずはこんなところで。

*1:[http://e-words.jp/w/ACIDE789B9E680A7.html:title=ACID特性]