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特性]