さくらVPSで稼動しているCassandra0.6.5をCassandra0.7.0-beta1に変更してみる。




前回、「Cassandra, Thriftを利用したAPIを確認する」でいろいろ試してみました。
折角なので、Cassandra0.7.0から利用できるセカンダリインデックスをCassandraのバージョンを変更し、試して
みたいと思う。併せて、環境設定の変更点なども記していけたらと思います。
(Cassandra0.7.0-beta1でセカンダリインデックスが利用できるかわかりません。)
 

Cassandra0.6.5のサービスを止める

既存のCassandra0.6.5のサービスを止めます。(独自のシェル) 

 /usr/local/bin/casactl stop

 
Cassandra0.6.5で作成されたログやデータファイルを削除します。

 rm /var/log/cassandra/system.log
 rm /var/lib/cassandra/commitlog/*
 rm -rf /var/lib/cassandra/data/*

 

apache-cassandra-0.7.0-beta1-bin.tar.gzを取得する

wgetでソースを取得します。

 wget ftp://ftp.riken.jp/net/apache//cassandra/0.7.0/apache-cassandra-0.7.0-beta1-bin.tar.gz

(0.7.0 RC4があるらしいが、落としてしまったのでこのまま利用する。)
 
シンボリックリンクをはりかえます。

 ln -s apache-cassandra-0.7.0-beta1 cassandra

(今までは、ln -s apache-cassandra-0.6.5 cassandraとしていました。)
 

Cassandra0.7.0用に設定ファイルを書き換える

cassandra-0.6.5でconf/storage-conf.xmlだったものが、cassandra0.7.0では、conf/cassandra.yaml
に変更になっています。

vi /usr/local/cassandra/conf/cassandra.yaml
 
data_file_directories:
 - /home/y_tag/tmp/cassandra/data
seeds:
    - 固有のIP
rpc_address: 0.0.0.0

 
cassandra-0.6.5でbin/cassandra.in.shにあったJVMのオプションが、cassandra0.7.0では、conf/cassandra-env.sh
内に変更になっています。

vi /usr/local/cassandra/conf/cassandra-env.sh
 
MAX_HEAP_SIZE="1G"

JVM_OPTS="$JVM_OPTS -ea"

JVM_OPTS="$JVM_OPTS -Xms$MAX_HEAP_SIZE"
JVM_OPTS="$JVM_OPTS -Xmx$MAX_HEAP_SIZE"
JVM_OPTS="$JVM_OPTS -Xss128k"

JVM_OPTS="$JVM_OPTS -XX:+UseParNewGC"
JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC"
JVM_OPTS="$JVM_OPTS -XX:+CMSParallelRemarkEnabled"
JVM_OPTS="$JVM_OPTS -XX:SurvivorRatio=8"
JVM_OPTS="$JVM_OPTS -XX:MaxTenuringThreshold=1"
JVM_OPTS="$JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError"

JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=port"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"

 
Cassandraを再度起動してみる。
/usr/local/bin/casactl start

 INFO 17:41:52,668 DiskAccessMode 'auto' determined to be mmap, indexAccessMode is mmap
 INFO 17:41:52,851 Couldn't detect any schema definitions in local storage.
 INFO 17:41:52,852 Found table data in data directories. Consider using JMX to call org.apache.cassandra.service.StorageService.loadSchemaFromYaml().
 INFO 17:41:52,877 Cassandra version: 0.7.0-beta1
 INFO 17:41:52,878 Thrift API version: 10.0.0
 INFO 17:41:52,889 Saved Token not found. Using 60241603823023011117341191363720282092
 INFO 17:41:52,890 Saved ClusterName not found. Using Test Cluster
 INFO 17:41:52,897 Creating new commitlog segment /var/lib/cassandra/commitlog/CommitLog-1294735312897.log
 INFO 17:41:52,912 switching in a fresh Memtable for LocationInfo at CommitLogContext(file='/var/lib/cassandra/commitlog/CommitLog-1294735312897.log', position=276)
 INFO 17:41:52,917 Enqueuing flush of Memtable-LocationInfo@973617947(169 bytes, 4 operations)
 INFO 17:41:52,918 Writing Memtable-LocationInfo@973617947(169 bytes, 4 operations)
 INFO 17:41:52,987 Completed flushing /var/lib/cassandra/data/system/LocationInfo-e-1-Data.db
 INFO 17:41:53,004 Starting up server gossip
 INFO 17:41:53,072 Binding thrift service to /0.0.0.0:Thrift port
 INFO 17:41:53,076 Using TFramedTransport with a max frame size of 15728640 bytes.

 
nodeがあるか確認してみる

 nodetool --host 固有のIP -p 固有のport ring
 
 Address      Status  State   Load            Token
 固有のIP       Up     Normal  385 bytes       60241603823023011117341191363720282092

 

cliからつないでみる

 $cassandra-cli
 
 Welcome to cassandra CLI.
 
 Type 'help' or '?' for help. Type 'quit' or 'exit' to quit.
 [default@unknown]connect localhost/Thrift port
 
 [default@unknown] show keyspaces
 system

 

Cassandra0.6.5時代に作成したクライアントプログラムから接続してみる

conf/cassandra.yaml内の84行目に下記の記述があります。

 thrift_framed_transport_size_in_mb: 15

その為、org.apache.thrift.transport.TFramedTransportというクラスをインスタンス
し、接続しています。「thrift_framed_transport_size_in_mb: 0」とすると
「TTransport port = new TSocket("localhost", 9160);」で接続できますが
cassandra-cliで接続ができなくなるみたいです。

 //TTransport port = new TSocket("localhost", 9160);
 TTransport port = new TFramedTransport(new TSocket("localhost", 9160));
 
 TProtocol protocol = new TBinaryProtocol(port);
 Cassandra.Client client = new Cassandra.Client(protocol);
 port.open();
 
 // クラスタ名の表示
 System.out.printf("Cluster name : [%s]\n", client.describe_cluster_name());
 
 // バージョンの表示
 System.out.printf("Version : [%s]\n", client.describe_version());
 
 // 接続中クラスタの全キースペースを取得
 for (String keyspace : client.describe_keyspaces()) {
 // キースペース名の表示
 System.out.printf("Keyspace : [%s]\n", keyspace);
 
 // キースペース内の全 Column Family の取得
 for (Map.Entry<String, Map<String, String>> entry : client.describe_keyspace(keyspace).entrySet()) {
 
 System.out.printf("\tColumn Family : [%s]\n", entry.getKey());
 for (Map.Entry<String, String> innerEntry : entry.getValue().entrySet()) {
 System.out.printf("\t\t[%s]:[%s]\n", innerEntry.getKey(), innerEntry.getValue());
 }
 System.out.println(" -- ");
 }
 
 }
 
 port.close();

 
とりあえず、Cassandra0.7.0を利用する土台ができました。
 
動的キースペースやセカンダリインデックスに関しては、別途、確認をしてみようと思います。