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=8049mtu 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
ノード毎の設定ファイルの保存先準備
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がつながったっぽい。さらにEclipseで127.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つのノードがつながった!
どんな感じで各ノードがデータの同期を取るのかはまた後日〜。