无法启动 Cassandra:“节点已存在”

问题描述 投票:0回答:3

我在重新启动后(在新的虚拟机实例上)让现有 Cassandra 节点再次加入集群时遇到问题。

我有一个正在运行的 Cassandra 集群,其中有 4 个节点,根据 nodetool 状态,所有节点都处于“正常运行”状态。这些节点在 Azure 中的虚拟机上运行。我将虚拟机的实例类型更改为 10.0.0.6,该类型在该计算机重新启动后返回。机器停留在 10.0.0.6。 重新启动后我无法再次启动 Cassandra。我遇到这个异常:

INFO  22:39:07 Handshaking version with /10.0.0.4
INFO  22:39:07 Node /10.0.0.6 is now part of the cluster
INFO  22:39:07 Node /10.0.0.5 is now part of the cluster
INFO  22:39:07 Handshaking version with cassandraprd001/10.0.0.6
INFO  22:39:07 Node /10.0.0.9 is now part of the cluster
INFO  22:39:07 Handshaking version with /10.0.0.5
INFO  22:39:07 Node /10.0.0.4 is now part of the cluster
INFO  22:39:07 InetAddress /10.0.0.6 is now UP
INFO  22:39:07 Handshaking version with /10.0.0.9
INFO  22:39:07 InetAddress /10.0.0.4 is now UP
INFO  22:39:07 InetAddress /10.0.0.9 is now UP
INFO  22:39:07 InetAddress /10.0.0.5 is now UP
ERROR 22:39:08 Exception encountered during startup
java.lang.RuntimeException: A node with address cassandraprd001/10.0.0.6 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node.
    at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:455) ~[apache-cassandra-2.1.0.jar:2.1.0]
    at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:667) ~[apache-cassandra-2.1.0.jar:2.1.0]
    at org.apache.cassandra.service.StorageService.initServer(StorageService.java:615) ~[apache-cassandra-2.1.0.jar:2.1.0]
    at org.apache.cassandra.service.StorageService.initServer(StorageService.java:509) ~[apache-cassandra-2.1.0.jar:2.1.0]
    at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:338) [apache-cassandra-2.1.0.jar:2.1.0]
    at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:457) [apache-cassandra-2.1.0.jar:2.1.0]
    at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:546) [apache-cassandra-2.1.0.jar:2.1.0]
java.lang.RuntimeException: A node with address cassandraprd001/10.0.0.6 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node.
    at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:455)
    at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:667)
    at org.apache.cassandra.service.StorageService.initServer(StorageService.java:615)
    at org.apache.cassandra.service.StorageService.initServer(StorageService.java:509)
    at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:338)
    at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:457)
    at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:546)
Exception encountered during startup: A node with address cassandraprd001/10.0.0.6 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node.
INFO  22:39:08 Announcing shutdown

我使用的是 Cassandra 2.1.0。我不是在重放死节点 - 我只是试图让旧节点再次启动并运行。根据节点工具状态(在其他节点上),所有节点都“正常运行”,除了 10.0.0.6 是“正常运行”。

如何让该节点再次启动并运行?

cassandra
3个回答
24
投票

首先,在另一个节点上,使用

nodetool status

结果将显示集群中的节点列表。找到启动失败的IP节点,获取其id,然后使用命令:

nodetool removenode <node_id>

然后启动 cassandra。


7
投票

快速回答,如果节点的ip是10.200.10.200

添加这个

JVM_OPTS="$JVM_OPTS -Dcassandra.replace_address=10.200.10.200"

到你的结束

cassandra-env.sh

完成后不要忘记将其删除。


3
投票

你可以看看这个博客,http://blog.alteroot.org/articles/2014-03-12/replace-a-dead-node-in-cassandra.html

它对我有用,这是 Cassandra 的一个错误。如果你的节点的host_id改变了,但是使用旧的IP,会抛出这个异常。

如果您使用Cassandra 2.x.x,则应修改cassandra/conf/cassandra-env.sh。

最后,不要忘记在完成引导后删除对 cassandra-env.sh 的修改!

© www.soinside.com 2019 - 2024. All rights reserved.