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とかその辺はちゃんとやらないとだめですが。