Cassandraバージョン移行検証

サービスのリリース時に0.6.8を採用して、後から0.7.0に移行することが可能かどうかを検証したいと思います。

apiのバージョン

cassandra-cliでshow api versionをした結果を比較してみます。

  • 0.6.8
cassandra> show api version
2.2.0
  • 0.7.0 RC3
[default@unknown] show api version;
19.4.0

明らかに隔絶しています。
つぎに、cassandra-cliを相互につなげてみます。

  • client:0.7.0R3 => server:0.6.8
[default@unknown] connect 192.168.133.129/9160
Syntax error at position 0: no viable alternative at input 'connect'

変なエラーが出て繋がりません。

  • client:0.6.8 => server:0.7.0RC3
cassandra> connect 192.168.133.128/9160
Exception retrieving information about the cassandra node, check you have connected to the thrift port.

こちらもエラー。さらに、サーバ側には以下のメッセージが。

ERROR [pool-1-thread-2] 2010-12-31 14:58:46,223 CustomTThreadPoolServer.java (line 175) Thrift error occ
urred during processing of message.
org.apache.thrift.protocol.TProtocolException: Missing version in readMessageBegin, old client?
        at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:213)
        at org.apache.cassandra.thrift.Cassandra$Processor.process(Cassandra.java:2543)
        at org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)

ということで、クライアントとのAPIに関しては明らかに互換性がないことがわかります。
ので、リリースするならクライアント側も総入れ替え必須ということになります。

データの互換性

基本的にSSTableであることには変わりないので、data配下総コピーすればいけるかな? ということで試してみます。
dataディレクトリのパスはあらかじめ6と7とで別の箇所を指すように、storage-conf.xml と cassandra.yaml それぞれに設定しておきます。(詳細は割愛)
んでは検証開始。まず、0.6.8側のデータを確認

cassandra> show api version
2.2.0
cassandra> get Keyspace1.Standard2['jsmith'];
=> (column=last, value=Smith, timestamp=1293773556387000)
=> (column=first, value=John, timestamp=1293773552617000)
=> (column=age, value=42, timestamp=1293773559417000)
Returned 3 results.
cassandra> exit

data配下をコピーします。

amanar@lenny101:/var/lib$ cd /var/lib
amanar@lenny101:/var/lib$ sudo mkdir -p cassandra7/data/Keyspace1
amanar@lenny101:/var/lib$ sudo cp -r cassandra6/data/Keyspace1/ cassandra7/data/

6を落として、7を起動します。

amanar@lenny101:/var/lib$ cd ../apache-cassandra-0.6.8/
amanar@lenny101:~/apache-cassandra-0.6.8$ sudo kill `cat cassandra.pid`
amanar@lenny101:~/apache-cassandra-0.6.8$ cd ../apache-cassandra-0.7.0-rc3/
amanar@lenny101:~/apache-cassandra-0.7.0-rc3$ sudo bin/cassandra -p cassandra.pid

確認してみよう。

amanar@lenny101:~/apache-cassandra-0.7.0-rc3$ bin/cassandra-cli --host localhost
Connected to: "Test Cluster" on localhost/9160
Welcome to cassandra CLI.

Type 'help;' or '?' for help. Type 'quit;' or 'exit;' to quit.
[default@unknown] use Keyspace1;
Keyspace 'Keyspace1' not found.
[default@unknown] create keyspace Keyspace1;
042f422f-14a5-11e0-b289-e700f669bcfc
[default@unknown] use Keyspace1;
Authenticated to keyspace: Keyspace1
[default@Keyspace1] create column family Standard2 with comparator=UTF8Type and default_validation_class=UTF8Type;
289b9970-14a5-11e0-b289-e700f669bcfc
[default@Keyspace1] get Standard2['jsmith'];
=> (column=age, value=42, timestamp=1293773559417000)
=> (column=first, value=John, timestamp=1293773552617000)
=> (column=last, value=Smith, timestamp=1293773556387000)
Returned 3 results.
[default@Keyspace1]

(゚∀゚)ウヒョ
データのほうはわりと簡単に引き継げそうですね。もちろん、flushとかその辺はちゃんとやらないとだめですが。