Não é possível iniciar o Zookeeper

Você está lendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
info

Sintoma

Não foi possível iniciar o processo do ZooKeeper.

Mensagens de erro

Quando você tenta iniciar o processo do ZooKeeper, a seguinte mensagem de erro é retornada indicando que o ZooKeeper não pôde ser iniciado:

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

Causas possíveis

A tabela a seguir lista as possíveis causas desse problema:

Causa Para
myid do ZooKeeper mal configurado Usuários da nuvem privada do Edge
Porta do ZooKeeper em uso Usuários da nuvem privada do Edge
ID do processo incorreto no arquivo apigee-zookeeper.pid Usuários da nuvem privada do Edge
Falha na eleição do líder do ZooKeeper Usuários da nuvem privada do Edge

Clique em um link na tabela para conferir as possíveis resoluções para essa causa.

myid do ZooKeeper mal configurado

As seções a seguir oferecem uma visão geral do arquivo myid e descrevem como diagnosticar e resolver problemas de configuração incorreta.

Visão geral do arquivo myid

Em cada nó do ZooKeeper, há dois arquivos:

  1. O arquivo /opt/apigee/apigee-zookeeper/conf/zoo.cfg, que contém uma lista de IPs para todos os nós do ZooKeeper no cluster.

    Por exemplo, se o /opt/apigee/apigee-zookeeper/conf/zoo.cfg contiver os IPs de três nós do ZooKeeper que fazem parte do cluster, da seguinte maneira:

    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. O arquivo /opt/apigee/data/apigee-zookeeper/data/myid contém uma única linha de texto que corresponde ao número do servidor desse nó específico do ZooKeeper. O myid do servidor 1 contém o texto "1" e nada mais. O ID precisa ser exclusivo no conjunto e ter um valor entre 1 e 255.

    Por exemplo, no servidor 1 do ZooKeeper, o /opt/apigee/data/apigee-zookeeper/data/myid arquivo precisa conter apenas o texto 1 conforme mostrado abaixo:

    $ cat myid
    1

Diagnóstico

  1. Verifique se há erros no registro do ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log para erros.
  2. Se você encontrar a mensagem de AVISO semelhante a "Conexão interrompida para o ID #, meu ID = #", conforme mostrado na figura abaixo, a possível causa desse problema é que o servidor # no arquivo myid está mal configurado ou corrompido.
    [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. Verifique o arquivo /opt/apigee/apigee-zookeeper/conf/zoo.cfg e anote o server.# para o nó atual do ZooKeeper.
  4. Verifique o arquivo /opt/apigee/data/apigee-zookeeper/data/myid e confira se o texto nesse arquivo corresponde ao server.# anotado na etapa 2.
  5. Se houver uma incompatibilidade, você identificou a causa da falha ao iniciar o ZooKeeper.

Resolução

Se o arquivo myid estiver configurado incorretamente, edite-o e substitua o valor por um texto correto que represente o parâmetro server.# no zoo.cfg.

Porta do ZooKeeper em uso

Diagnóstico

  1. Verifique se há erros no registro do ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log para erros.
  2. Se você notar a exceção java.net.BindException: Address already in use ao vincular à porta #2181, conforme mostrado na figura abaixo, isso indica que a porta 2181 do ZooKeeper está sendo usada por outro processo. Portanto, o ZooKeeper não pôde ser iniciado.
    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. Use o comando netstat abaixo para confirmar se a porta 2181 do ZooKeeper está sendo usada por outro processo:
    netstat -an | grep 2181

Resolução

Se a porta 2181 do ZooKeeper ainda estiver em uso, siga as etapas abaixo para resolver esse problema:

  1. Use o comando netstat para encontrar o processo que está mantendo a porta 2181. Encerre o processo que está usando a porta 2181 do 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. Limpe os arquivos pid e de bloqueio, se eles existirem:
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
  3. Reinicie o ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

ID do processo incorreto no arquivo apigee-zookeeper.pid

Ao tentar parar/reiniciar o ZooKeeper, ele pode falhar porque o apigee-zookeeper.pid arquivo contém um pid mais antigo/incorreto e não o do processo do ZooKeeper em execução. Isso pode acontecer se o processo do ZooKeeper for encerrado inesperadamente ou abruptamente por algum motivo e o arquivo apigee-zookeeper.pid não for excluído.

Diagnóstico

  1. Receba o ID do processo do ZooKeeper em execução executando o ps comando:
    ps -ef | grep zookeeper
  2. Verifique se o arquivo /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid existe. Se ele existir, anote o ID do processo gravado nesse arquivo.
  3. Compare os IDs do processo das etapas 1 e 2. Se eles forem diferentes, a causa desse problema é ter o ID do processo incorreto no apigee-zookeeper.pid file.

Resolução

  1. Edite o arquivo apigee-zookeeper.pid e substitua o ID do processo incorreto pelo ID correto obtido no comando ps (etapa 1 acima).
  2. Reinicie o ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart

Falha na eleição do líder do ZooKeeper

Diagnóstico

Para diagnosticar :

  1. Verifique se há erros no registro do ZooKeeper /opt/apigee/var/log/apigee-zookeeper/zookeeper.log para erros.
  2. Verifique se houve mudanças na configuração que podem causar falha na eleição do líder do ZooKeeper.
  3. Verifique o /opt/apigee/apigee-zookeeper/conf/zoo.cfg e confira se todos os ZooKeepers no cluster têm o número e os endereços IP corretos para o parâmetro server.#. Observe também que, para que a eleição do líder seja bem-sucedida, é necessário ter pelo menos três eleitores e o número de eleitores precisa ser ímpar. Se houver poucos eleitores, como apenas dois, não será possível chegar a um quórum para decidir um líder entre apenas dois eleitores.

Resolução

Normalmente, a falha na eleição do ZooKeeper é causada por um myid mal configurado. Use a resolução em myid do ZooKeeper mal configurado para resolver a falha na eleição.

Se o problema persistir e for necessário mais diagnóstico, entre em contato com o suporte do Apigee Edge.