Impossibile avviare Zookeeper

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

Sintomo

Impossibile avviare il processo ZooKeeper.

Messaggi di errore

Quando tenti di avviare il processo ZooKeeper, viene restituito il seguente messaggio di errore che indica che non è stato possibile avviare ZooKeeper:

+ apigee-service apigee-zookeeper status
apigee-service: apigee-zookeeper: Not running (DEAD)
apigee-all: Error: status failed on [apigee-zookeeper]

Possibili cause

La tabella seguente elenca le possibili cause di questo problema:

Causa Per
myid di ZooKeeper configurato in modo errato Utenti di Edge Private Cloud
Porta di ZooKeeper in uso Utenti di Edge Private Cloud
ID processo errato nel file apigee-zookeeper.pid Utenti di Edge Private Cloud
Errore di elezione del leader di ZooKeeper Utenti di Edge Private Cloud

Fai clic su un link nella tabella per visualizzare le possibili risoluzioni per quella causa.

myid di ZooKeeper configurato in modo errato

Le sezioni seguenti forniscono una panoramica del file myid e descrivono come diagnosticare e risolvere i problemi di configurazione errata.

Panoramica del file myid

Su ogni nodo ZooKeeper sono presenti due file:

  1. Il file /opt/apigee/apigee-zookeeper/conf/zoo.cfg che contiene un elenco di indirizzi IP per tutti i nodi ZooKeeper nel cluster.

    Ad esempio, se /opt/apigee/apigee-zookeeper/conf/zoo.cfg contiene gli indirizzi IP di 3 nodi ZooKeeper che fanno parte del cluster come segue:

    server.1=11.11.11.11:2888:3888
    server.2=22.22.22.22:2888:3888
    server.3=33.33.33.33:2888:3888
  2. Il file /opt/apigee/data/apigee-zookeeper/data/myid contiene una singola riga di testo che corrisponde al numero del server del nodo ZooKeeper specifico. Il file myid del server 1 conterrà il testo "1" e nient'altro. L'ID deve essere univoco all'interno dell'insieme e deve avere un valore compreso tra 1 e 255.

    Ad esempio, sul server ZooKeeper.1, il /opt/apigee/data/apigee-zookeeper/data/myid file deve contenere solo il testo 1 come mostrato di seguito:

    $ cat myid
    1

Diagnosi

  1. Controlla il log di ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log per errori.
  2. Se vedi il messaggio WARN simile a "Connection broken for id #, my id = #", come mostrato nella figura seguente, la possibile causa di questo problema potrebbe essere che il server # nel file myid è configurato in modo errato o danneggiato.
    [myid:2] - WARN [RecvWorker:2:QuorumCnxManager$RecvWorker@762] -
      Connection broken for id 2, my id = 2, error = java.io.EOFException
        at java.io.DataInputStream.readInt(DataInputStream.java:375)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager$RecvWorker.
          run(QuorumCnxManager.java:747)
  3. Controlla il file /opt/apigee/apigee-zookeeper/conf/zoo.cfg e annota il server.# per il nodo ZooKeeper corrente.
  4. Controlla il file /opt/apigee/data/apigee-zookeeper/data/myid e verifica se il testo in questo file corrisponde al server.# annotato nel passaggio 2.
  5. Se c'è una mancata corrispondenza, hai identificato la causa del mancato avvio di ZooKeeper.

Risoluzione

Se il file myid è configurato in modo errato, modificalo e sostituisci il valore con un testo corretto che rappresenta il parametro server.# in zoo.cfg.

Porta di ZooKeeper in uso

Diagnosi

  1. Controlla il log di ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log per errori.
  2. Se noti l'eccezione java.net.BindException: Address already in use durante l'associazione alla porta #2181, come mostrato nella figura seguente, significa che la porta 2181 di ZooKeeper è utilizzata da un altro processo. Di conseguenza, non è stato possibile avviare ZooKeeper.
    2017-04-26 07:00:10,420 [myid:3] - INFO  [main:NIOServerCnxnFactory@94] -
      binding to port 0.0.0.0/0.0.0.0:2181
    2017-04-26 07:00:10,421 [myid:3] - ERROR [main:QuorumPeerMain@89] -
      Unexpected exception, exiting abnormally
      java.net.BindException: Address already in use
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:433)
        at sun.nio.ch.Net.bind(Net.java:425)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67)
        at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:95)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:130)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:111)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)
  3. Utilizza il seguente comando netstat per verificare che la porta 2181 di ZooKeeper sia effettivamente utilizzata da un altro processo:
    netstat -an | grep 2181

Risoluzione

Se la porta 2181 di ZooKeeper è ancora in uso, segui i passaggi riportati di seguito per risolvere il problema:

  1. Utilizza il comando netstat per trovare il processo che utilizza la porta 2181. Termina il processo che utilizza la porta 2181 di ZooKeeper:
    $ netstat -antp | grep 2181
    tcp        0      0 0.0.0.0:2181            0.0.0.0:*
    LISTEN      28016/java <defunct>
    $ kill -9 28016
  2. Elimina i file pid e di blocco, se esistenti:
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
  3. Riavvia ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

ID processo errato nel file apigee-zookeeper.pid

Quando tenti di arrestare/riavviare ZooKeeper, l'operazione potrebbe non riuscire perché il apigee-zookeeper.pid file contiene un pid precedente/errato e non quello del processo ZooKeeper attualmente in esecuzione. Questo può accadere se il processo ZooKeeper è terminato in modo imprevisto o improvviso per qualche motivo e il file apigee-zookeeper.pid non è stato eliminato.

Diagnosi

  1. Recupera l'ID processo del processo ZooKeeper attualmente in esecuzione eseguendo il ps comando:
    ps -ef | grep zookeeper
  2. Verifica se esiste il file /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid. Se esiste, annota l'ID processo scritto in questo file.
  3. Confronta gli ID processo recuperati nei passaggi 1 e 2. Se sono diversi, la causa di questo problema è l'ID processo errato nel apigee-zookeeper.pid file.

Risoluzione

  1. Modifica il file apigee-zookeeper.pid e sostituisci l'ID processo errato con l'ID processo corretto ottenuto dal comando ps (passaggio 1 sopra).
  2. Riavvia ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

Errore di elezione del leader di ZooKeeper

Diagnosi

Per la diagnosi:

  1. Controlla il log di ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log per errori.
  2. Verifica se sono state apportate modifiche alla configurazione che potrebbero causare l'errore di elezione del leader di ZooKeeper.
  3. Controlla /opt/apigee/apigee-zookeeper/conf/zoo.cfg e assicurati che tutti i nodi ZooKeeper nel cluster abbiano il numero e gli indirizzi IP corretti per il parametro server.#. Tieni presente che, affinché l'elezione del leader vada a buon fine, sono necessari almeno 3 votanti e il numero di votanti deve essere dispari. Se i votanti sono troppo pochi, ad esempio solo 2 votanti, non è possibile raggiungere un quorum per decidere un leader tra solo 2 votanti.

Risoluzione

In genere, l'errore di elezione di ZooKeeper è causato da un file myid configurato in modo errato. Utilizza la risoluzione in myid di ZooKeeper configurato in modo errato per risolvere l'errore di elezione.

Se il problema persiste e sono necessarie ulteriori diagnosi, contatta l'assistenza Apigee Edge.