当缺少具有vnodes的令牌范围时,如何引导Cassandra节点?

时间:2013-12-28 15:23:26

标签: cassandra

我在Cassandra 1.2.11(DSE)上的AWS上有一个12节点集群。我丢失了其中一个节点,因为它丢失了亚马逊(包含数据)的短暂驱动器。为了解决这个问题,我删除了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

没有意义的是,除了使用SimpleStrategy的Opscenter之外,其余的键空间都使用NetworkTopologyStrategy并且RF为3.我一直在尝试的方式处理这个问题是确定哪个节点具有失败的范围并运行nodetool repair -pr然后再次尝试引导程序。虽然这可能最终在整个集群周围运行修复(可能需要数天),但我在一个节点上运行并且集群正在以降级状态运行。如果我失去了另一个节点,我就有点搞砸了。

我应该在这做什么,如何解决这个问题并强制节点进行引导?

1 个答案:

答案 0 :(得分:5)

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

UPDATE KEYSPACE OpsCenter
  WITH placement_strategy = 'NetworkTopologyStrategy'
   AND strategy_options = {Cassandra : 3};

这允许引导程序发生。现在所有节点都需要进行修复,并且可能会在修复完成之前提供对OpsCenter密钥空间请求的未命中。但由于OpsCenter是正确集群操作的非必需键空间,因此在这里拥有可替换节点更好。