4

ホストが変更されたローカル マシンに 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. シード ノード (1 および 3) を開始します。
  2. ノード 2 と 4 を起動します。
  3. ノード 3 をオフにします。
  4. ノード 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 の移動はオプションではありません (と思います)。

事前にありがとう、どんな情報でも大歓迎です!

4

1 に答える 1

0

解決策は、ノード 3 (オフになっている) をトークンから手動で削除することでした。

于 2014-07-04T11:59:43.663 に答える