Impossibile avviare Zookeeper

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

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

Nella tabella seguente sono elencate le possibili cause di questo problema:

Causa Per
Myid ZooKeeper configurato in modo errato Utenti del cloud privato perimetrale
Porta ZooKeeper in uso Utenti del cloud privato perimetrale
ID processo errato nel file apigee-zookeeper.pid Utenti del cloud privato perimetrale
Mancata elezione del leader ZooKeeper Utenti del cloud privato perimetrale

Fai clic su un link nella tabella per visualizzare le possibili soluzioni a tale causa.

Myid ZooKeeper configurato in modo errato

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

Panoramica del file myid

Su ogni nodo ZooKeeper, ci sono due file:

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

    Ad esempio, se /opt/apigee/apigee-zookeeper/conf/zoo.cfg contiene gli IP di tre 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 di quel particolare nodo ZooKeeper. Il myid del server 1 conterrebbe 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, su ZooKeeper server.1, il file /opt/apigee/data/apigee-zookeeper/data/myid deve contenere solo il testo 1 come mostrato di seguito:

    $ cat myid
    1
    

Diagnostica

  1. Controlla l'eventuale presenza di errori nel log /opt/apigee/var/log/apigee-zookeeper/zookeeper.log di ZooKeeper.
  2. Se viene visualizzato il messaggio WARN simile a "Connessione interrotta per ID #, il mio ID = #", come mostrato nella figura seguente, la possibile causa di questo problema potrebbe essere che il numero di server nel file myid non sia configurato correttamente o sia 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 individuare il nodo ZooKeeper attuale.
  4. Controlla il file /opt/apigee/data/apigee-zookeeper/data/myid e verifica se il testo in questo file corrisponde al server.# indicato nel passaggio #2.
  5. Se esiste una mancata corrispondenza, significa che hai identificato la causa del mancato avvio di ZooKeeper.

Risoluzione

Se il file myid non è configurato correttamente, modifica il file myid e sostituisci il valore con un testo corretto che rappresenta il parametro server.# in zoo.cfg.

Porta ZooKeeper in uso

Diagnostica

  1. Controlla se ci sono errori nel log /opt/apigee/var/log/apigee-zookeeper/zookeeper.log di ZooKeeper.
  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 comando netstat riportato di seguito per confermare 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 questi passaggi per risolvere il problema:

  1. Usa il comando netstat per trovare il processo mantenuto sulla porta 2181. Termina il processo che utilizza la porta ZooKeeper 2181:
    $ netstat -antp | grep 2181
    tcp        0      0 0.0.0.0:2181            0.0.0.0:*
    LISTEN      28016/java <defunct>
    $ kill -9 28016
    
  2. Esegui la pulizia dei PID e blocca i file se esistono:
    /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 di processo errato nel file apigee-zookeeper.pid

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

Diagnostica

  1. Ottieni l'ID del processo ZooKeeper attualmente in esecuzione eseguendo il comando ps:
    ps -ef | grep zookeeper
    
  2. Controlla se il file /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid esiste. Se esiste, prendi nota dell'ID di processo scritto in questo file.
  3. Confronta gli ID di processo ricavati dai passaggi 1 e 2. Se sono diversi, significa che il problema è la presenza dell'ID di processo errato in apigee-zookeeper.pid file.

Risoluzione

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

Errore elettorale del leader ZooKeeper

Diagnostica

Per eseguire la diagnostica:

  1. Controlla l'eventuale presenza di errori nel log /opt/apigee/var/log/apigee-zookeeper/zookeeper.log di ZooKeeper.
  2. Controlla se sono state apportate modifiche alla configurazione che potrebbero causare un errore nella scelta del leader in ZooKeeper.
  3. Controlla /opt/apigee/apigee-zookeeper/conf/zoo.cfg e assicurati che tutti ZooKeeper nel cluster abbiano il numero e gli indirizzi IP corretti per il parametro server.#. Tieni inoltre presente che, affinché le elezioni dei leader abbiano successo, devono esserci almeno 3 elettori e il numero di elettori deve essere dispari. Se ci sono pochi elettori, come solo 2 elettori, non si può entrare in un quorum per decidere un leader tra solo 2 elettori.

Risoluzione

In genere, gli errori delle elezioni di ZooKeeper sono causati da un myid configurato in modo errato. Utilizza la risoluzione in Configurazione errata del myid di ZooKeeper per risolvere il fallimento delle elezioni.

Se il problema persiste ed è necessaria un'ulteriore diagnosi, contatta l'assistenza Apigee Edge.