プロダクションの問題の一環として、プロダクション 1.0.9 クラスタを 1.2.1/2 にアップグレードしたいと考えています。
開発環境でアップグレードをテストしているときに、アップグレードされたクラスター ノードの 1 つで cli を使用して単純なリスト操作を実行しているときに、次の例外が発生します: (3 つのノードのうち 1 つだけがアップグレードされます)
[default@testKS] list testCF;
Using default limit of 100
Using default column limit of 100
null
TimedOutException()
at org.apache.cassandra.thrift.Cassandra$get_range_slices_result.read(Cassandra.java:12932)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
at org.apache.cassandra.thrift.Cassandra$Client.recv_get_range_slices(Cassandra.java:734)
at org.apache.cassandra.thrift.Cassandra$Client.get_range_slices(Cassandra.java:718)
at org.apache.cassandra.cli.CliClient.executeList(CliClient.java:1485)
at org.apache.cassandra.cli.CliClient.executeCLIStatement(CliClient.java:272)
at org.apache.cassandra.cli.CliMain.processStatementInteractive(CliMain.java:210)
at org.apache.cassandra.cli.CliMain.main(CliMain.java:337)
アップグレードされていないノード (1.0.9) で同じリスト操作を実行すると、同じ例外が発生します。
[default@testKS] list testCF;
Using default limit of 100
null
TimedOutException()
at org.apache.cassandra.thrift.Cassandra$get_range_slices_result.read(Cassandra.java:12830)
at org.apache.cassandra.thrift.Cassandra$Client.recv_get_range_slices(Cassandra.java:762)
at org.apache.cassandra.thrift.Cassandra$Client.get_range_slices(Cassandra.java:734)
at org.apache.cassandra.cli.CliClient.executeList(CliClient.java:1390)
at org.apache.cassandra.cli.CliClient.executeCLIStatement(CliClient.java:269)
at org.apache.cassandra.cli.CliMain.processStatementInteractive(CliMain.java:220)
at org.apache.cassandra.cli.CliMain.main(CliMain.java:348)
別の 1.0.9 ノードで同じリスト操作を試行してもエラーは発生しません。このノードが唯一のレプリカを保持していると仮定します。
[default@testKS] list testCF;
Using default limit of 100
-------------------
RowKey: 0a
=> (column=0a, value=0a, timestamp=1362642828623000)
1 Row Returned.
Elapsed time: 11 msec(s).
私が使用しているtestCFにはキーと値が1つしかなく、タイムアウト例外は一貫しています。レプリケーション ファクター 1 を使用していますが、3 つのノードすべてが稼働して同期されているようです。
1.0.9 から 1.2.1/2 にアップグレードするのが最も簡単なようですが、まだ範囲 (?) スキャンの使用に失敗しています。cql クライアントから select * クエリを使用すると、同じエラーが発生します。私は特別なテストを行っていないので、この問題は 1.0.9 からのアップグレードで発生するはずであり、再現は非常に簡単であると推測しています。
nodetool リングは、すべてのノードが稼働していることを示しています (すべてのノードで実行中):
-bash-4.1$ nodetool -h localhost ring
Datacenter: US
==========
Replicas: 1
Address Rack Status State Load Owns Token
113427455640312821154458202477256070485
33.33.33.2 RAC1 Up Normal 39.31 KB 33.33% 0
33.33.33.3 RAC1 Up Normal 63.39 KB 33.33% 56713727820156410577229101238628035242
33.33.33.4 RAC1 Up Normal 63.39 KB 33.33% 113427455640312821154458202477256070485
すべてのノードでアップグレードが完了すると、クラスターは通常の状態に戻ります。
何故ですか?そんなはずないでしょ?右?私の理解では、Cassandra はこのようなローリング アップグレードをサポートできるはずですよね。誰かがこの問題に遭遇した場合、または問題が何であるかを知っていると思われる場合は、アドバイスしてください。