Не удалось запустить Cassandra: "node уже существует"

У меня есть проблемы с получением существующей Cassandra node, чтобы снова присоединиться к клану после перезагрузки (на новом экземпляре виртуальной машины).

У меня был запущенный кластер 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. Я не воспроизвожу мертвых node - я просто пытаюсь снова запустить старый node. Согласно статусу nodetool (на других узлах) все узлы "вверх и нормальны", кроме 10.0.0.6, которые "вниз и нормальны".

Как мне снова запустить этот node?

Ответ 1

Вы можете посмотреть этот блог, http://blog.alteroot.org/articles/2014-03-12/replace-a-dead-node-in-cassandra.html.

Это работает для меня, это ошибка для Кассандры. Если ваш node host_id изменился, но использует старый IP-адрес, он выкинет это исключение.

Если вы используете Cassandra 2.x.x, вы должны изменить cassandra/conf/cassandra-env.sh.

Наконец, не забудьте УДАЛИТЬ модификации на cassandra-env.sh после завершения начальной загрузки!

Ответ 2

Сначала, на другом node, используйте

nodetool status

результаты показывают список узлов в кластере. Найдите node с ip, который не запускается, получает свой идентификатор и заполняется командой:

nodetool removenode <node_id>

затем запустите cassandra.

Бест,

Ответ 3

Быстрый ответ, если node ip 10.200.10.200

добавить это

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

до конца

cassandra-env.sh

Не забудьте удалить его после выполнения.