我在本地机器上有一个 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 步,当我尝试加入 Node 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 move 不是一个选项(我认为)。
在此先感谢您,欢迎提供任何信息!