Impossible de démarrer Zookeeper

Vous consultez la documentation Apigee Edge.
Accédez à la documentation**Apigee X**.
info

Problème constaté

Impossible de démarrer le processus ZooKeeper.

Messages d'erreur

Lorsque vous tentez de démarrer le processus ZooKeeper, le message d'erreur suivant s'affiche indiquant que ZooKeeper n'a pas pu démarrer :

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

Causes possibles

Le tableau suivant répertorie les causes possibles de ce problème :

Cause Pour
myid ZooKeeper mal configuré Utilisateurs de Cloud privé Edge
Port ZooKeeper en cours d'utilisation Utilisateurs de Cloud privé Edge
ID de processus incorrect dans le fichier apigee-zookeeper.pid Utilisateurs de Cloud privé Edge
Échec de l'élection du responsable ZooKeeper Utilisateurs de Cloud privé Edge

Cliquez sur un lien du tableau pour afficher les solutions possibles à cette cause.

myid ZooKeeper mal configuré

Les sections suivantes présentent le fichier myid et expliquent comment diagnostiquer et résoudre les problèmes de configuration.

Présentation du fichier myid

Sur chaque nœud ZooKeeper, il existe deux fichiers :

  1. Le fichier /opt/apigee/apigee-zookeeper/conf/zoo.cfg contient une liste d' adresses IP pour tous les nœuds ZooKeeper du cluster.

    Par exemple, si le /opt/apigee/apigee-zookeeper/conf/zoo.cfg contient les adresses IP de trois nœuds ZooKeeper faisant partie du cluster, comme suit :

    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. Le fichier /opt/apigee/data/apigee-zookeeper/data/myid contient une seule ligne de texte qui correspond au numéro de serveur de ce nœud ZooKeeper particulier. Le myid du serveur 1 contient le texte "1" et rien d'autre. L'ID doit être unique dans l'ensemble et doit avoir une valeur comprise entre 1 et 255.

    Par exemple, sur le serveur ZooKeeper.1, le /opt/apigee/data/apigee-zookeeper/data/myid fichier ne doit contenir que le texte 1 comme illustré ci-dessous :

    $ cat myid
    1

Diagnostic

  1. Recherchez les erreurs dans le journal ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log pour erreurs.
  2. Si vous voyez le message d'avertissement semblable à "Connection broken for id #, my id = #", comme illustré dans la figure ci-dessous, la cause possible de ce problème peut être que le serveur # du fichier myid est mal configuré ou corrompu.
    [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. Vérifiez le fichier /opt/apigee/apigee-zookeeper/conf/zoo.cfg et notez le serveur.# pour le nœud ZooKeeper actuel.
  4. Vérifiez le fichier /opt/apigee/data/apigee-zookeeper/data/myid et voyez si le texte de ce fichier correspond au serveur.# noté à l'étape 2.
  5. En cas de non-concordance, vous avez identifié la cause de l'échec du démarrage de ZooKeeper.

Solution

Si le fichier myid est mal configuré, modifiez-le et remplacez la valeur par un texte correct représentant le paramètre server.# dans le fichier zoo.cfg.

Port ZooKeeper en cours d'utilisation

Diagnostic

  1. Recherchez les erreurs dans le journal ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log pour erreurs.
  2. Si vous remarquez l'exception java.net.BindException: Address already in use lors de la liaison au port #2181, comme illustré dans la figure ci-dessous, cela indique que le port ZooKeeper 2181 est utilisé par un autre processus. Par conséquent, ZooKeeper n'a pas pu démarrer.
    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. Utilisez la commande netstat ci-dessous pour vérifier que le port ZooKeeper 2181 est bien utilisé par un autre processus :
    netstat -an | grep 2181

Solution

Si le port ZooKeeper 2181 est toujours en cours d'utilisation, procédez comme suit pour résoudre ce problème :

  1. Utilisez la commande netstat pour trouver le processus qui utilise le port 2181. Arrêtez le processus qui utilise le port 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. Nettoyez les fichiers pid et de verrouillage, s'ils existent :
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
  3. Redémarrez ZooKeeper :
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

ID de processus incorrect dans le fichier apigee-zookeeper.pid

Lorsque vous tentez d'arrêter/de redémarrer ZooKeeper, l'opération peut échouer, car le apigee-zookeeper.pid fichier contient un pid plus ancien/incorrect et non celui du processus ZooKeeper en cours d'exécution. Cela peut se produire si le processus ZooKeeper s'est arrêté de manière inattendue ou brutale pour une raison quelconque et que le fichier apigee-zookeeper.pid n'a pas été supprimé.

Diagnostic

  1. Obtenez l'ID de processus du processus ZooKeeper en cours d'exécution en exécutant la ps commande :
    ps -ef | grep zookeeper
  2. Vérifiez si le fichier /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid existe. Si c'est le cas, notez l'ID de processus écrit dans ce fichier.
  3. Comparez les ID de processus obtenus aux étapes 1 et 2. S'ils sont différents, la cause de ce problème est que l'ID de processus est incorrect dans le apigee-zookeeper.pid file.

Solution

  1. Modifiez le fichier apigee-zookeeper.pid et remplacez l'ID de processus incorrect par l'ID de processus correct obtenu à partir de la commande ps (étape 1 ci-dessus).
  2. Redémarrez ZooKeeper :
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

Échec de l'élection du responsable ZooKeeper

Diagnostic

Pour effectuer un diagnostic :

  1. Recherchez les erreurs dans le journal ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log pour erreurs.
  2. Vérifiez si des modifications de configuration ont pu entraîner l'échec de l'élection du responsable ZooKeeper.
  3. Vérifiez le /opt/apigee/apigee-zookeeper/conf/zoo.cfg et assurez-vous que tous les ZooKeepers du cluster disposent du nombre et des adresses IP appropriés pour le paramètre server.#. Notez également que pour que l'élection du responsable réussisse, il doit y avoir au moins trois électeurs et que leur nombre doit être impair. S'il y a trop peu d'électeurs, par exemple seulement deux électeurs, il ne peut pas y avoir de quorum pour décider d'un responsable parmi seulement deux électeurs.

Solution

En règle générale, l'échec de l'élection ZooKeeper est dû à un myid mal configuré. Utilisez la solution décrite dans la section myid ZooKeeper mal configuré pour résoudre l'échec de l'élection.

Si le problème persiste et qu'un diagnostic plus approfondi est nécessaire, contactez l'assistance Apigee Edge.