Não é possível iniciar o Zookeeper

Você está vendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
informações

Sintoma

Não é 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 não foi possível iniciar o ZooKeeper:

+ 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 configurado incorretamente Usuários da nuvem privada do Edge
Porta do ZooKeeper em uso Usuários da nuvem privada do Edge
ID de processo incorreto no arquivo apigee-zookeeper.pid Usuários da nuvem privada do Edge
Falha nas eleições de líder do ZooKeeper Usuários da nuvem privada do Edge

Clique em um link na tabela para ver as possíveis soluções para a causa.

Myid do ZooKeeper configurado incorretamente

As seções a seguir fornecem 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 /opt/apigee/apigee-zookeeper/conf/zoo.cfg contiver os IPs de três nós do ZooKeeper, 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 conteria o texto "1" e nada mais. O ID precisa ser exclusivo dentro do conjunto e ter um valor entre 1 e 255.

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

    $ cat myid
    1
    

Diagnóstico

  1. Verifique se há erros no registro /opt/apigee/var/log/apigee-zookeeper/zookeeper.log do ZooKeeper.
  2. Se aparecer uma mensagem de WARN semelhante a "Conexão corrompida para o ID #, meu id = #", como mostrado na figura abaixo, a possível causa para esse problema pode ser que o número do servidor no arquivo myid está corrompido ou configurado incorretamente.
    [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 veja se o texto nele corresponde ao server.# observado na etapa 2.
  5. Se houver uma incompatibilidade, você terá identificado a causa da falha da inicialização do 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 /opt/apigee/var/log/apigee-zookeeper/zookeeper.log do ZooKeeper.
  2. Se você notar a exceção java.net.BindException: Address already in use ao se vincular à porta 2181, conforme mostrado na figura abaixo, isso indica que a porta 2181 do ZooKeeper está sendo usada por outro processo. Portanto, não foi possível iniciar o 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. Use o comando netstat abaixo para confirmar se a porta 2181 do ZooKeeper está realmente 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 o pid e bloqueie os arquivos, se houver:
    /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 de processo incorreto no arquivo apigee-zookeeper.pid

Ao tentar interromper/reiniciar o ZooKeeper, é possível que ele falhe porque o arquivo apigee-zookeeper.pid contém um pid mais antigo/incorreto e não o do processo do ZooKeeper em execução no momento. Isso poderá acontecer se o processo do ZooKeeper for encerrado inesperadamente ou abruptamente por algum motivo e o arquivo apigee-zookeeper.pid não tiver sido excluído.

Diagnóstico

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

Resolução

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

Falha nas eleições de líder do ZooKeeper

Diagnóstico

Para diagnosticar:

  1. Verifique se há erros no registro /opt/apigee/var/log/apigee-zookeeper/zookeeper.log do ZooKeeper.
  2. Verifique se houve alguma mudança na configuração que possa causar a falha da eleição do líder do ZooKeeper.
  3. Verifique o /opt/apigee/apigee-zookeeper/conf/zoo.cfg e se todos os ZooKeepers no cluster têm o número e os endereços IP adequados para o parâmetro server.#. Para a eleição do líder ser bem-sucedida, é necessário ter no mínimo três eleitores, e o número de eleitores deve ser um número í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 eleitoral do ZooKeeper é causada por um myid configurado incorretamente. Use a resolução em Misconfigured ZooKeeper myid para resolver a falha eleitoral.

Se o problema persistir e mais diagnósticos forem necessários, entre em contato com o suporte do Apigee Edge.