ホストが変更されたローカル マシンに Cassandra 1.2 クラスターがあります。
#cassandra nodes
m.y.i.p m.y.i.p (Node 1)<---- seed 1
m.y.i.p 127.0.0.3 (Node 2)
m.y.i.p 127.0.0.4 (Node 3)<---- seed 2
m.y.i.p 127.0.0.5 (Node 4)
m.y.i.p 127.0.0.6 (Node 5)
...つまり、クラスターには合計 5 つのノードがあります。私は仮想ノードを使用しているので、initial_token をどこにも設定する必要はありません。
私が従った手順:
- シード ノード (1 および 3) を開始します。
- ノード 2 と 4 を起動します。
- ノード 3 をオフにします。
- ノード 5 への参加を試みます。
問題は 4 番目のステップにあります。ノード 5 に参加しようとすると、Cassandra が次の例外をスローします。
java.lang.IllegalStateException: unable to find sufficient sources for streaming range (-7204018021044318047,-6965052533844316617]
at org.apache.cassandra.dht.RangeStreamer.getRangeFetchMap(RangeStreamer.java:205)
at org.apache.cassandra.dht.RangeStreamer.addRanges(RangeStreamer.java:129)
at org.apache.cassandra.dht.BootStrapper.bootstrap(BootStrapper.java:81)
at org.apache.cassandra.service.StorageService.bootstrap(StorageService.java:890)
at org.apache.cassandra.service.StorageService.joinTokenRing(StorageService.java:659)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:514)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:411)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:278)
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:366)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:409)
java.lang.IllegalStateException: unable to find sufficient sources for streaming range (-7204018021044318047,-6965052533844316617]
at org.apache.cassandra.dht.RangeStreamer.getRangeFetchMap(RangeStreamer.java:205)
at org.apache.cassandra.dht.RangeStreamer.addRanges(RangeStreamer.java:129)
at org.apache.cassandra.dht.BootStrapper.bootstrap(BootStrapper.java:81)
at org.apache.cassandra.service.StorageService.bootstrap(StorageService.java:890)
at org.apache.cassandra.service.StorageService.joinTokenRing(StorageService.java:659)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:514)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:411)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:278)
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:366)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:409)
Exception encountered during startup: unable to find sufficient sources for streaming range (-7204018021044318047,-6965052533844316617]
ERROR 16:55:47,634 Exception in thread Thread[StorageServiceShutdownHook,5,main]
java.lang.NullPointerException
at org.apache.cassandra.service.StorageService.stopRPCServer(StorageService.java:321)
at org.apache.cassandra.service.StorageService$1.runMayThrow(StorageService.java:479)
at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28)
at java.lang.Thread.run(Thread.java:722)
範囲 (-7204018021044318047,-6965052533844316617] は、死んだノード (ノード 3) に属しています。仮想ノードを使用しているため、リングを再調整する必要があると思います。
ノードを追加または削除するときに、クラスターを再調整する必要がなくなりました。ノードがクラスターに参加すると、クラスター内の他のノードからのデータの偶数部分に対する責任を負います。ノードに障害が発生した場合、負荷はクラスター内の他のノードに均等に分散されます。
しかし、私は明らかに間違っています:)。
前のノードがダウンしているときに既存のクラスターに新しいノードを参加させるにはどうすればよいですか? ノードごとに 256 個のトークンがあることに注意してください。nodetool の移動はオプションではありません (と思います)。
事前にありがとう、どんな情報でも大歓迎です!