matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

1台のマシンで複数のCassandraノードを起動する

手軽にCassandraの分散環境を試すために、ローカルマシンで複数のCassandraノードを起動してみた。環境はMac OS X Snow Leopard。他の環境で出来るかどうか不明です。参考にしたのはRunning Multiple Cassandra Nodes on a Single Hostというエントリ。ただこれはCassandra 0.6系の話なので、svnやgitから取得できる0.7系でのやり方はちょっと違ったかも。手順は以下な感じでした。

localhostエイリアスを定義

CassandraのノードはIPアドレスに紐づけて起動するので、localhostエイリアスを設定してローカルマシン上に複数のIPアドレスを定義する。以下は、Mac OS Xエイリアスの設定方法。

$ sudo ifconfig lo0 alias 127.0.0.2 up
$ sudo ifconfig lo0 alias 127.0.0.3 up

これで127.0.0.1、127.0.0.2、127.0.0.3の3つのIPアドレスlocalhostエイリアスとして定義される。

$ ifconfig
lo0: flags=8049 mtu 16384
	inet 127.0.0.1 netmask 0xff000000 
	inet6 ::1 prefixlen 128 
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
	inet 127.0.0.2 netmask 0xff000000 
	inet 127.0.0.3 netmask 0xff000000 

WindowsTCP/IPのプロパティから、詳細設定のIPアドレスの追加でOKだと思います(動作未確認)。

ノード毎の設定ファイルの保存先準備

Cassanraを複数インストールするのも非効率なので、ソースは共有しながら設定ファイルだけ個別に用意。ここでは設定ファイルの保存先を決定する。自分は参考にしたサイトに合わせてcass_stuffってディレクトリをCassandraルートディレクトリ配下に用意しました。


各ノード用のディレクトリを用意

上記で作成したcass_stuff配下に、各ノード用のディレクトリを用意する。作成するディレクトリは以下の通り。

  • nodeX(対象ノードのルートディレクトリ。Xはノードの番号)
    • commitlog(対象ノードのコミットログ保存先)
    • conf(対象ノードの設定ファイル保存先)
    • data(対象ノードのデータ保存先)
    • log(対象ノードのログ保存先)

自分の場合は、127.0.0.1のノードはEclipseで実行していたものをそのまま利用することにしたので、新たに127.0.0.2(node0)と127.0.0.3(node1)のディレクトリを用意しました。


設定ファイルのコピー&修正

cass_stuff/nodeX/conf配下に、Cassandraルートディレクトリ/conf配下のファイルをすべてコピー。

以下の記述をノードごとに変更。

ファイル名 変更箇所 変更内容
cassandra.yaml data_file_directories cass_stuff/nodeX/dataを絶対パス指定

data_file_directories: /workspace/cassandra/cass_stuff/node0/data
seeds 全ノードのIPアドレスのリストを指定

seeds:
- 127.0.0.1
- 127.0.0.2
- 127.0.0.3
listen_ddress 対象ノードが紐づくIPアドレス

listen_address: 127.0.0.2
rpc_port 対象ノードに対するRPC呼び出し用のポート。ノードごとにかぶらないようにする

rpc_port: 9161
commitlog_directory cass_stuff/nodeX/commitlogを絶対パス指定

commitlog_directory: /workspace/cassandra/cass_stuff/node0/commitlog
log4j-server.properties log4j.appender.R.File 対象ノードのログの出力先

log4j.appender.R.File=/workspace/cassandra/cass_stuff/node0/log/system.log

シェルのコピー&修正

Cassandraルートディレクトリ/bin/cassandra.in.shをcass_stuff/nodeX配下にコピー。

コピーしたcassandra.in.shの以下の記述をノードごとに変更。

変更箇所 変更内容
cassandra_home Cassandraルートディレクトリを絶対パス指定

cassandra_home=/workspace/cassandra
CASSANDRA_CONF cass_stuff/nodeX/confディレクトリを指定

CASSANDRA_CONF=$cassandra_home/cass_stuff/node0/conf
JVM_OPTSの-Dcom.sun.management.jmxremote.port 対象ノードに対するJMX接続ポート。ノードごとにかぶらないようにする

-Dcom.sun.management.jmxremote.port=9082

ノードごとの起動シェルの作成

以下のような起動シェルをcass_stuff配下にノードごとに作成。ここではrun_nodeX.shという名前のファイル名にしています。

#!/bin/sh

CASSANDRA_INCLUDE=/Volumes/DATA1/Development/workspace/cassandra/cass_stuff/nodeX/cassandra.in.sh
export CASSANDRA_INCLUDE
cd ..
bin/cassandra -f


起動確認

以上で設定は終わり。まずnode0を起動してみる。

$ ./run_node0.sh
 INFO 02:44:29,595 Auto DiskAccessMode determined to be mmap
 INFO 02:44:29,728 Couldn't detect any schema definitions in local storage.
 INFO 02:44:29,729 Found table data in data directories. Consider using JMX to call org.apache.cassandra.service.StorageService.loadSchemaFromYaml().
 INFO 02:44:29,745 Saved Token not found. Using 90968483453710681660468078754621647787
 INFO 02:44:29,745 Saved ClusterName not found. Using Test Cluster
 INFO 02:44:29,750 Creating new commitlog segment /workspace/cassandra/cass_stuff/node0/commitlog/CommitLog-1277315069750.log
 INFO 02:44:29,810 LocationInfo has reached its threshold; switching in a fresh Memtable at CommitLogContext(file='/workspace/cassandra/cass_stuff/node0/commitlog/CommitLog-1277315069750.log', position=281)
 INFO 02:44:29,812 Enqueuing flush of Memtable(LocationInfo)@753505921
 INFO 02:44:29,814 Writing Memtable(LocationInfo)@753505921
 INFO 02:44:29,867 Completed flushing /workspace/cassandra/cass_stuff/node0/data/system/LocationInfo-c-1-Data.db
 INFO 02:44:29,872 Discarding 1000
 INFO 02:44:29,880 Starting up server gossip
 INFO 02:44:29,927 Binding thrift service to /0.0.0.0:9161
 INFO 02:44:29,930 Cassandra starting up...
 INFO 02:44:29,931 Will not load MX4J, mx4j-tools.jar is not in the classpath

何やら起動できたっぽい。続いてnode1を起動してみる。

$ ./run-node1.sh
 INFO 02:46:01,752 Auto DiskAccessMode determined to be mmap
 INFO 02:46:01,885 Couldn't detect any schema definitions in local storage.
 INFO 02:46:01,886 Found table data in data directories. Consider using JMX to call org.apache.cassandra.service.StorageService.loadSchemaFromYaml().
 INFO 02:46:01,902 Saved Token not found. Using 106481841707441392401573928162174111969
 INFO 02:46:01,902 Saved ClusterName not found. Using Test Cluster
 INFO 02:46:01,907 Creating new commitlog segment /workspace/cassandra/cass_stuff/node1/commitlog/CommitLog-1277315161907.log
 INFO 02:46:01,920 LocationInfo has reached its threshold; switching in a fresh Memtable at CommitLogContext(file='/workspace/cassandra/cass_stuff/node1/commitlog/CommitLog-1277315161907.log', position=281)
 INFO 02:46:01,922 Enqueuing flush of Memtable(LocationInfo)@311092314
 INFO 02:46:01,924 Writing Memtable(LocationInfo)@311092314
 INFO 02:46:01,985 Completed flushing /workspace/cassandra/cass_stuff/node1/data/system/LocationInfo-c-1-Data.db
 INFO 02:46:01,990 Discarding 1000
 INFO 02:46:01,998 Starting up server gossip
 INFO 02:46:02,064 Binding thrift service to /0.0.0.0:9162
 INFO 02:46:02,069 Cassandra starting up...
 INFO 02:46:02,070 Will not load MX4J, mx4j-tools.jar is not in the classpath
 INFO 02:46:02,087 Node /127.0.0.2 is now part of the cluster
 INFO 02:46:03,010 InetAddress /127.0.0.2 is now UP
 INFO 02:46:03,021 Compacting []

こっちも起動できたっぽい。node0のコンソールを見てみると、node1を起動したと同時にこんなログが。

 INFO 02:46:03,015 Node /127.0.0.3 is now part of the cluster
 INFO 02:46:04,012 InetAddress /127.0.0.3 is now UP
 INFO 02:46:04,023 Compacting []

node0とnode1がつながったっぽい。さらにEclipse127.0.0.1のノードを起動してみると、node0とnode1にこんなログが。

 INFO 02:47:55,759 Node /127.0.0.1 is now part of the cluster
 INFO 02:47:56,760 InetAddress /127.0.0.1 is now UP
 INFO 02:47:56,760 Compacting []

おー。3つのノードがつながった!

どんな感じで各ノードがデータの同期を取るのかはまた後日〜。