No se puede iniciar Zookeeper

Estás viendo la documentación de Apigee Edge.
Ir a la documentación de Apigee X.
info

Síntoma

No se puede iniciar el proceso de ZooKeeper.

Mensajes de error

Cuando intentas iniciar el proceso de ZooKeeper, se muestra el siguiente mensaje de error que indica que no se pudo iniciar ZooKeeper:

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

Causas posibles

En la siguiente tabla, se enumeran las posibles causas de este problema:

Causa Para
myid de ZooKeeper mal configurado Usuarios de la nube privada de Edge
Puerto de ZooKeeper en uso Usuarios de la nube privada de Edge
ID de proceso incorrecto en el archivo apigee-zookeeper.pid Usuarios de la nube privada de Edge
Falla en la elección del líder de ZooKeeper Usuarios de la nube privada de Edge

Haz clic en un vínculo de la tabla para ver las posibles soluciones a esa causa.

myid de ZooKeeper mal configurado

En las siguientes secciones, se proporciona una descripción general del archivo myid y se describe cómo diagnosticar y resolver problemas de configuración incorrecta.

Descripción general del archivo myid

En cada nodo de ZooKeeper, hay dos archivos:

  1. El archivo /opt/apigee/apigee-zookeeper/conf/zoo.cfg que contiene una lista de IPs para todos los nodos de ZooKeeper en el clúster.

    Por ejemplo, si /opt/apigee/apigee-zookeeper/conf/zoo.cfg contiene las IPs de 3 nodos de ZooKeeper que forman parte del clúster de la siguiente manera:

    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. El archivo /opt/apigee/data/apigee-zookeeper/data/myid contiene una sola línea de texto que corresponde al número de servidor de ese nodo de ZooKeeper en particular. El myid de servidor 1 contendría el texto "1" y nada más. El ID debe ser único dentro del conjunto y debe tener un valor entre 1 y 255.

    Por ejemplo, en el servidor.1 de ZooKeeper, el /opt/apigee/data/apigee-zookeeper/data/myid archivo solo debe contener el texto 1 como se muestra a continuación:

    $ cat myid
    1

Diagnóstico

  1. Revisa el registro de ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log en busca de errores.
  2. Si ves el mensaje WARN similar a “Connection broken for id #, my id = #”, como se muestra en la siguiente figura, la posible causa de este problema podría ser que el servidor # en el archivo myid esté mal configurado o dañado.
    [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. Revisa el archivo /opt/apigee/apigee-zookeeper/conf/zoo.cfg y anota el server.# para el nodo de ZooKeeper actual.
  4. Revisa el archivo /opt/apigee/data/apigee-zookeeper/data/myid y comprueba si el texto de este archivo coincide con el server.# que se anotó en el paso #2.
  5. Si hay una falta de coincidencia, identificaste la causa por la que ZooKeeper no se inicia.

Solución

Si el archivo myid está configurado de forma incorrecta, edita el archivo myid y reemplaza el valor por un texto correcto que represente el parámetro server.# en zoo.cfg.

Puerto de ZooKeeper en uso

Diagnóstico

  1. Revisa el registro de ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log en busca de errores.
  2. Si observas la excepción java.net.BindException: Address already in use mientras se vincula al puerto #2181, como se muestra en la siguiente figura, indica que otro proceso está usando el puerto 2181 de ZooKeeper. Por lo tanto, no se pudo iniciar 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. Usa el siguiente comando netstat para confirmar que otro proceso está usando el puerto 2181 de ZooKeeper:
    netstat -an | grep 2181

Solución

Si el puerto 2181 de ZooKeeper aún está en uso, sigue los pasos que se indican a continuación para solucionar este problema:

  1. Usa el comando netstat para encontrar el proceso que está reteniendo el puerto 2181. Finaliza el proceso que usa el puerto 2181 de 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. Limpia los archivos pid y de bloqueo si existen:
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
  3. Reinicia ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

ID de proceso incorrecto en el archivo apigee-zookeeper.pid

Cuando intentas detener o reiniciar ZooKeeper, es posible que falle porque el apigee-zookeeper.pid archivo contiene un pid anterior o incorrecto, y no el del proceso de ZooKeeper que se ejecuta actualmente. Esto puede suceder si el proceso de ZooKeeper finalizó de forma inesperada o abrupta por algún motivo y no se borró el archivo apigee-zookeeper.pid.

Diagnóstico

  1. Para obtener el ID del proceso de ZooKeeper que se ejecuta actualmente, ejecuta el ps comando:
    ps -ef | grep zookeeper
  2. Verifica si existe el archivo /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid. Si existe, anota el ID del proceso escrito en este archivo.
  3. Compara los IDs de proceso tomados de los pasos #1 y #2. Si son diferentes, la causa de este problema es tener el ID de proceso incorrecto en el apigee-zookeeper.pid file.

Solución

  1. Edita el archivo apigee-zookeeper.pid y reemplaza el ID de proceso incorrecto por el ID de proceso correcto obtenido del comando ps (paso #1 anterior).
  2. Reinicia ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

Falla en la elección del líder de ZooKeeper

Diagnóstico

Para diagnosticar:

  1. Revisa el registro de ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log en busca de errores.
  2. Verifica si hubo cambios de configuración que puedan causar que falle la elección del líder de ZooKeeper.
  3. Revisa /opt/apigee/apigee-zookeeper/conf/zoo.cfg y asegúrate de que todos los ZooKeepers del clúster tengan el número y las direcciones IP correctos para el parámetro server.#. También ten en cuenta que, para que la elección del líder se realice correctamente, debe haber al menos 3 votantes y la cantidad de votantes debe ser impar. Si hay muy pocos votantes, como solo 2 votantes, no se puede llegar a un quórum para decidir un líder entre solo 2 votantes.

Solución

Por lo general, la falla en la elección de ZooKeeper se debe a un myid mal configurado. Usa la resolución en myid de ZooKeeper mal configurado para solucionar la falla en la elección.

Si el problema persiste y se necesita un diagnóstico adicional, comunícate con la Asistencia de Apigee Edge.