2015-03-28 20 views
11

Ho problemi ad ottenere un nodo Cassandra esistente per unirmi nuovamente al cluster dopo il riavvio (in una nuova istanza della macchina virtuale).Impossibile avviare Cassandra: "il nodo esiste già"

Avevo un cluster Cassandra in esecuzione con 4 nodi tutti in stato "attivo e normale" in base allo stato nodetool. I nodi sono in esecuzione su macchine virtuali in Azure. Ho cambiato il tipo di istanza della macchina virtuale per 10.0.0.6, che è tornato in un riavvio di questa macchina. La macchina è rimasta su 10.0.0.6. Dopo il riavvio non riesco ad avviare nuovamente Cassandra. Ricevo questa eccezione:

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 

Sto utilizzando Cassandra 2.1.0. Non sto riproducendo un nodo morto: sto solo cercando di riattivare il vecchio nodo. Secondo lo stato di nodetool (sugli altri nodi) tutti i nodi sono "up e normal" tranne 10.0.0.6 che è "down and normal".

Come si ottiene il riavvio e il funzionamento di questo nodo?

+0

Controllare questo: http://stackoverflow.com/questions/29312965/how-can-the-seemingly-odd-behavior-in-cassandra-cluster-be-explained – jny

+1

quando si è modificato e riavviato il sistema, ha rimosso i dati esistenti? In particolare i dati dello spazio delle chiavi di sistema? In tal caso, dovrai utilizzare l'indirizzo -Directory, anche se si tratta dello stesso nodo. –

risposta

5

Puoi guardare questo blog, http://blog.alteroot.org/articles/2014-03-12/replace-a-dead-node-in-cassandra.html.

Funziona per me, questo è un bug per Cassandra. Se il tuo host_id del nodo è cambiato, ma usa il vecchio IP, genererà questa eccezione.

Se si utilizza Cassandra 2.x.x, è necessario modificare cassandra/conf/cassandra-env.sh.

Infine, non dimenticare di RIMUOVERE le modifiche su cassandra-env.sh dopo il bootstrap completo!

+3

Questo risolve il problema. Per maggiore chiarezza, vorrei aggiungere che la riga che dovrebbe essere aggiunta a cassandra-env.sh è 'JVM_OPTS =" $ JVM_OPTS -Dcassandra.replace_address "', sai, i collegamenti scadono a volte .. – ruruskyi

3

risposta rapida, se IP del nodo è 10.200.10.200

aggiungere questo

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

alla fine del vostro

cassandra-env.sh 

Non dimenticare di rimuovere una volta che il fatto .

5

In primo luogo, su un altro nodo, utilizzare

nodetool status 

i risultati che mostrano la lista dei nodi del cluster. Trova il tuo nodo con ip che non riescono a iniziare, ottenere il suo ID e riempire di comando:

nodetool removenode <node_id> 

quindi iniziare cassandra.

migliore,

Problemi correlati