当VNode缺少令牌范围时,如何引导Cassandra节点?

当VNode缺少令牌范围时,如何引导Cassandra节点?,cassandra,Cassandra,我在Cassandra 1.2.11(DSE)上的AWS上有一个12节点的集群。我丢失了一个节点,因为它丢失了Amazon上的临时驱动器(其中包含数据)。为了解决这个问题,我使用nodetool removenode$hostid删除了节点,该操作有效。集群似乎仍处于平衡状态,等等 问题是,当我尝试引导一个新节点时,我现在遇到如下错误: java.lang.IllegalStateException: unable to find sufficient sources for streaming

我在Cassandra 1.2.11(DSE)上的AWS上有一个12节点的集群。我丢失了一个节点,因为它丢失了Amazon上的临时驱动器(其中包含数据)。为了解决这个问题,我使用
nodetool removenode$hostid
删除了节点,该操作有效。集群似乎仍处于平衡状态,等等

问题是,当我尝试引导一个新节点时,我现在遇到如下错误:

java.lang.IllegalStateException: unable to find sufficient sources for streaming range (-2556758013916855401,-2545694469859252228]
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:975)
at org.apache.cassandra.service.StorageService.joinTokenRing(StorageService.java:741)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:585)
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:482)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:348)
at com.datastax.bdp.server.DseDaemon.setup(DseDaemon.java:351)
at org.apache.cassandra.service.CassandraDaemon.init(CassandraDaemon.java:381)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.commons.daemon.support.DaemonLoader.load(DaemonLoader.java:212)
Cannot load daemon
Service exit with a return value of 3
没有意义的是,除了OpSceneter使用的是
SimpleStregy
,其余的键空间都使用的是
NetworkTopologyStrategy
,RF为3。我一直试图解决这个问题的方法是找出哪个节点的范围出现故障,并运行
nodetool repair-pr
,然后再次尝试引导。当我对整个集群进行修复(可能需要几天时间)后,这可能最终会起作用,但我关闭了一个节点,集群正在降级状态下运行。如果我失去了另一个节点,我就完蛋了


我应该在这里做什么?如何绕过这个问题并强制节点引导?

我解决了这个问题。问题在于Opscenter使用的是SimpleStrategy,并且默认的
复制系数
为1。因此,当该节点丢失时,它无法引导新节点。解决方案是使用以下命令更新Opscenter键空间:

UPDATE KEYSPACE OpsCenter
  WITH placement_strategy = 'NetworkTopologyStrategy'
   AND strategy_options = {Cassandra : 3};
这样就可以进行引导。现在所有节点都需要修复,并且在修复完成之前,可能会向OpsCenter键空间的请求提供未命中服务。但是,由于OpsCenter对于正确的集群操作来说是一个非必需的键空间,因此在这里使用可替换节点更好