Erros de perda de conexão do Zookeeper

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

Sintoma

Os problemas de conectividade do ZooKeeper podem se manifestar como diferentes sintomas, como:

  1. Erros de implantação de proxy de API
  2. As chamadas da API Management falham com erros 5XX
  3. Os roteadores ou processadores de mensagens não são iniciados
  4. Os componentes do Analytics informam a perda de conexão do ZooKeeper em system.logs

Mensagens de erro

A seguir, apresentamos exemplos de mensagens de erro que podem ser observadas quando há perda de conexão com os nós do ZooKeeper.

  1. O erro a seguir é retornado nos registros do servidor de gerenciamento quando uma implantação de proxy de API falha devido à perda de conexão do ZooKeeper:
    org: env: main INFO ZOOKEEPER - ZooKeeperServiceImpl.exists() :
    Retry path existence path:
      /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable,
      reason: KeeperErrorCode = ConnectionLoss
    org: env: main ERROR ZOOKEEPER - ZooKeeperServiceImpl.exists() :
      Could not detect existence of path:
      /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable ,
      reason: KeeperErrorCode = ConnectionLoss
    org: env: main ERROR KERNEL.DEPLOYMENT - ServiceDeployer.startService() :
      ServiceDeployer.deploy() : Got a life cycle exception while starting service
      [ServerRegistrationService, Error while checking path existence for path :
      /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable] :
      com.apigee.zookeeper.ZooKeeperException{ code = zookeeper.ErrorCheckingPathExis tence,
      message = Error while checking path existence for path :
      /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable,
      associated contexts = []} 2015-03-25 10:22:39,811
    org: env: main ERROR KERNEL - MicroKernel.deployAll() : MicroKernel.deployAll() :
    Error in deploying the deployment : EventService com.apigee.zookeeper.ZooKeeperException:
    Error while checking path existence for path :
      /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable
      at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists(ZooKeeperServiceImpl.java:339)
      ~[zookeeper-1.0.0.jar:na] at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists(
      ZooKeeperServiceImpl.java:323) ~[zookeeper-1.0.0.jar:na] at ... snipped
  2. Durante a inicialização, os roteadores e processadores de mensagens se conectam ao ZooKeeper. Se houver problemas de conectividade com o ZooKeeper, esses componentes não serão iniciados com o seguinte erro:
    2017-08-01 23:20:00,404  CuratorFramework-0 ERROR o.a.c.f.i.CuratorFrameworkImpl
      - CuratorFrameworkImpl.logError() : Background operation retry gave up
    org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss
      at org.apache.zookeeper.KeeperException.create(KeeperException.java:99) ~[zookeeper-3.4.6.jar:3.4.6-1569965]
      at org.apache.curator.framework.imps.CuratorFrameworkImpl.checkBackgroundRetry(CuratorFrameworkImpl.java:710) [curator-framework-2.5.0.jar:na]
      at org.apache.curator.framework.imps.CuratorFrameworkImpl.performBackgroundOperation(CuratorFrameworkImpl.java:827) [curator-framework-2.5.0.jar:na]
      at org.apache.curator.framework.imps.CuratorFrameworkImpl.backgroundOperationsLoop(CuratorFrameworkImpl.java:793) [curator-framework-2.5.0.jar:na]
      at org.apache.curator.framework.imps.CuratorFrameworkImpl.access$400(CuratorFrameworkImpl.java:57) [curator-framework-2.5.0.jar:na]
      at org.apache.curator.framework.imps.CuratorFrameworkImpl$4.call(CuratorFrameworkImpl.java:275) [curator-framework-2.5.0.jar:na]
      at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_131]
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]
      at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]
  3. A interface do Edge pode mostrar o seguinte erro indicando que não foi possível verificar o status de implantação dos proxies de API:
    Error Fetching Deployments
    Error while checking path existence for path: path

Causas possíveis

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

Causa Para
Problema de conectividade de rede em diferentes data centers Usuários da nuvem privada do Edge
O nó do ZooKeeper não está atendendo a solicitações Usuários da nuvem privada do Edge

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

Problema de conectividade de rede em diferentes data centers

Diagnóstico

Um cluster do ZooKeeper pode ter nós que abrangem várias regiões/data centers, como DC-1 e DC-2. A topologia típica do Apigee Edge 2 DC terá:

  • Servidores do ZooKeeper 1, 2 e 3 como eleitores no DC-1
  • ZooKeeper 4 e 5 como eleitores e ZooKeeper 6 como observador no DC-2.

Se a região DC-1 ficar inativa ou a conectividade de rede entre DC-1 e DC-2 for interrompida, então os nós do ZooKeeper não poderão eleger um novo líder no DC-2 e não poderão se comunicar com o nó líder. Os observadores do ZooKeeper não podem eleger um novo líder, e os dois eleitores restantes no DC-2 não têm um quórum de pelo menos três nós eleitores para eleger um novo líder. Assim, os ZooKeepers no DC-2 não poderão processar nenhuma solicitação. Os nós restantes do ZooKeeper no DC-2 continuarão tentando se conectar aos eleitores do ZooKeeper para encontrar o líder.

Resolução

Aplique as soluções a seguir para resolver esse problema na ordem especificada.

Se você não conseguir resolver o problema depois de tentar essas soluções, entre em contato com o suporte da Apigee.

Solução nº 1

  1. Trabalhe com os administradores de rede para corrigir o problema de conectividade de rede entre os data centers.
  2. Quando o conjunto do ZooKeeper puder se comunicar entre os data centers e eleger um líder do ZooKeeper, os nós ficarão íntegros e poderão processar solicitações.

Solução nº 2

  1. Se a conectividade de rede levar tempo para ser reparada, uma solução alternativa será reconfigurar nós do ZooKeeper na região em que eles estão inativos. Por exemplo, reconfigure o cluster do ZooKeeper no DC-2 para que os três nós do ZooKeeper nessa região sejam todos eleitores e remova o server.# no zoo.cfg dos ZooKeepers da região DC-1.
    1. No exemplo a seguir, zoo.cfg configura nós para duas regiões em que o DC-1 usa us-ea nomes de host que denotam a região US-East e o DC-2 usa us-wo nomes de host que denotam a região US-West. OBSERVAÇÃO: somente as configurações relevantes são mostradas:
      server.1=zk01ea.us-ea.4.apigee.com:2888:3888
      server.2=zk02ea.us-ea.4.apigee.com:2888:3888
      server.3=zk03ea.us-ea.4.apigee.com:2888:3888
      server.4=zk04wo.us-wo.4.apigee.com:2888:3888
      server.5=zk05wo.us-wo.4.apigee.com:2888:3888
      server.6=zk06wo.us-wo.4.apigee.com:2888:3888:observer

      No exemplo acima, reconfigure o zoo.cfg da seguinte maneira:

      server.1=zk04wo.us-wo.4.apigee.com:2888:3888
      server.2=zk05wo.us-wo.4.apigee.com:2888:3888
      server.3=zk06wo.us-wo.4.apigee.com:2888:3888
    2. Usando código com a configuração, crie um arquivo /opt/apigee/customer/application/zookeeper.properties com o seguinte:
      conf_zoo_quorum=server.1=zk04wo.us-wo.4.apigee.com:2888:3888\
      \nserver.2=zk05wo.us-wo.4.apigee.com:2888:3888\
      \nserver.3=zk06wo.us-wo.4.apigee.com:2888:3888\

    No exemplo acima, os nós do US-East são removidos, e os nós do US-West são promovidos a eleitores quando a :observer anotação é removida.

  2. Faça backup de /opt/apigee/apigee-zookeeper/conf/zoo.cfg e do antigo /opt/apigee/customer/application/zookeeper.properties.

    Esses arquivos serão usados para restaurar os padrões quando a conectividade de rede for restaurada entre os data centers.

  3. Desative a notação do observador para o nó do observador. Para fazer isso, adicione a seguinte configuração à parte de cima de /opt/apigee/customer/application/zookeeper.properties:

    conf_zoo_peertype=
  4. Edite o arquivo /opt/apigee/data/apigee-zookeeper/data/myid da seguinte forma:

    • Para server.1, mude a entrada dentro de myid de 4 para 1.
    • Para server.2, mude o myid de 5 para 2.
    • Para server.3, mude o myid de 6 para 3.
  5. Reinicie os nós do ZooKeeper na região em que você reconfigurou o cluster do ZooKeeper.
  6. Repita a configuração acima da etapa 1b até a etapa 5 em todos os nós do ZooKeeper no DC-2.
  7. Valide se os nós estão ativos com um líder:
    $ echo srvr | nc zk04wo.us-wo.4.apigee.com 2181
    > echo srvr | nc zk05wo.us-wo.4.apigee.com 2181
    > echo srvr | nc zk06wo.us-wo.4.apigee.com 2181

    A saída desse comando vai conter uma linha que diz "mode" seguida de "leader" se for o líder ou "follower" se for um seguidor.

    Quando a rede entre os data centers for restabelecida, as mudanças de configuração do ZooKeeper poderão ser revertidas nos nós do ZooKeeper no DC-2.

Solução nº 3

  1. Se os nós do ZooKeeper no cluster não forem iniciados, reinicie-os.
  2. Verifique os registros do ZooKeeper para determinar por que o nó do ZooKeeper ficou inativo.

    Os registros do ZooKeeper estão disponíveis no seguinte diretório:

    $ cd /opt/apigee/var/log/apigee-zookeeper
    $ ls -l
    total 188
    -rw-r--r--. 1 apigee apigee   2715 Jul 22 19:51 apigee-zookeeper.log
    -rw-r--r--. 1 apigee apigee  10434 Jul 17 19:51 config.log
    -rw-r--r--. 1 apigee apigee 169640 Aug  1 19:51 zookeeper.log
  3. Entre em contato com o suporte da Apigee e forneça os registros do ZooKeeper para solucionar a causa de qualquer nó do ZooKeeper que possa ter sido interrompido.

O nó do ZooKeeper não está atendendo a solicitações

Um nó do ZooKeeper no conjunto pode ficar inativo e não conseguir responder às solicitações do cliente Conheça os possíveis motivos:

  1. O nó foi interrompido sem ser reiniciado.
  2. O nó foi reinicializado sem a inicialização automática ativada.
  3. A carga do sistema no nó fez com que ele ficasse inativo ou inativo.

Diagnóstico

  1. Execute os comandos de verificação de integridade do ZooKeeper a seguir em cada um dos nós do ZooKeeper e verifique a saída:
    1. $ echo "ruok" | nc localhost 2181

      Exemplo de saída:

      $ echo "ruok" | nc localhost 2181
      imok
    2. echo srvr | nc localhost 2181

      Verifique o modo para determinar se o nó do ZooKeeper é um líder ou seguidor.

      Exemplo de saída para um nó do ZooKeeper único e completo:

      $ echo srvr | nc localhost 2181
      ZooKeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT
      Latency min/avg/max: 0/0/88
      Received: 4206601
      Sent: 4206624
      Connections: 8
      Outstanding: 0
      Zxid: 0x745
      Mode: standalone
      Node count: 282
    3. $ echo mntr | nc localhost 2181

      Esse comando lista as variáveis do ZooKeeper que podem ser usadas para verificar a integridade do cluster do ZooKeeper.

      Exemplo de saída:

      $ echo mntr | nc localhost 2181
      zk_version 3.4.5-1392090, built on 09/30/2012 17:52 GMT
      zk_avg_latency 0
      zk_max_latency 88
      zk_min_latency 0
      zk_packets_received     4206750
      zk_packets_sent 4206773
      zk_num_alive_connections 8
      zk_outstanding_requests 0
      zk_server_state standalone
      zk_znode_count 282
      zk_watch_count 194
      zk_ephemerals_count 1
      zk_approximate_data_size 22960
      zk_open_file_descriptor_count 34
      zk_max_file_descriptor_count 4096
    4. $ echo stat | nc localhost 2181

      Esse comando lista estatísticas sobre o desempenho e os clientes conectados.

      Exemplo de saída:

      $ echo stat | nc localhost 2181
      ZooKeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT
      Clients:
       /10.128.0.8:54152[1](queued=0,recved=753379,sent=753385)
       /10.128.0.8:53944[1](queued=0,recved=980269,sent=980278)
       /10.128.0.8:54388[1](queued=0,recved=457094,sent=457094)
       /10.128.0.8:54622[1](queued=0,recved=972938,sent=972938)
       /10.128.0.8:54192[1](queued=0,recved=150843,sent=150843)
       /10.128.0.8:44564[1](queued=0,recved=267332,sent=267333)
       /127.0.0.1:40820[0](queued=0,recved=1,sent=0)
       /10.128.0.8:53960[1](queued=0,recved=150844,sent=150844)
      
      Latency min/avg/max: 0/0/88
      Received: 4206995
      Sent: 4207018
      Connections: 8
      Outstanding: 0
      Zxid: 0x745
      Mode: standalone
      Node count: 282
    5. $ echo cons | nc localhost 2181

      Esse comando fornece detalhes estendidos sobre as conexões do ZooKeeper.

      Exemplo de saída:

      $ echo cons | nc localhost 2181
      /127.0.0.1:40864[0](queued=0,recved=1,sent=0)
      /10.128.0.8:54152[1](queued=0,recved=753400,sent=753406,sid=0x15d521a96d40007,
        lop=PING,est=1500321588647,to=40000,lcxid=0x972e9,lzxid=0x745,lresp=1502334173174,
        llat=0,minlat=0,avglat=0,maxlat=26)
      /10.128.0.8:53944[1](queued=0,recved=980297,sent=980306,sid=0x15d521a96d40005,
        lop=PING,est=1500321544896,to=40000,lcxid=0xce92a,lzxid=0x745,lresp=1502334176055,
        llat=0,minlat=0,avglat=0,maxlat=23)
      /10.128.0.8:54388[1](queued=0,recved=457110,sent=457110,sid=0x15d521a96d4000a,
        lop=PING,est=1500321673852,to=40000,lcxid=0x4dbe3,lzxid=0x745,lresp=1502334174245,
        llat=0,minlat=0,avglat=0,maxlat=22)
      /10.128.0.8:54622[1](queued=0,recved=972967,sent=972967,sid=0x15d521a96d4000b,
        lop=PING,est=1500321890175,to=40000,lcxid=0xccc9d,lzxid=0x745,lresp=1502334182417,
        llat=0,minlat=0,avglat=0,maxlat=88)
      /10.128.0.8:54192[1](queued=0,recved=150848,sent=150848,sid=0x15d521a96d40008,
        lop=PING,est=1500321591985,to=40000,lcxid=0x8,lzxid=0x745,lresp=1502334184475,
        llat=3,minlat=0,avglat=0,maxlat=19)
      /10.128.0.8:44564[1](queued=0,recved=267354,sent=267355,sid=0x15d521a96d4000d,
        lop=PING,est=1501606633426,to=40000,lcxid=0x356e2,lzxid=0x745,lresp=1502334182315,
        llat=0,minlat=0,avglat=0,maxlat=35)
      /10.128.0.8:53960[1](queued=0,recved=150848,sent=150848,sid=0x15d521a96d40006,
        lop=PING,est=1500321547138,to=40000,lcxid=0x5,lzxid=0x745,lresp=1502334177036,
        llat=1,minlat=0,avglat=0,maxlat=20)

      Se algum dos três últimos comandos de verificação de integridade mostrar a seguinte mensagem:

      $ echo stat | nc localhost 2181
          This ZooKeeper instance is not currently serving requests

      Isso indica que nós específicos do ZooKeeper não estão atendendo a solicitações.

  2. Verifique os registros do ZooKeeper no nó específico e tente localizar erros que causem a inatividade do ZooKeeper. Os registros do ZooKeeper estão disponíveis no seguinte diretório:
    $ cd /opt/apigee/var/log/apigee-zookeeper
    $ ls -l
    total 188
    -rw-r--r--. 1 apigee apigee   2715 Jul 22 19:51 apigee-zookeeper.log
    -rw-r--r--. 1 apigee apigee  10434 Jul 17 19:51 config.log
    -rw-r--r--. 1 apigee apigee 169640 Aug  1 19:51 zookeeper.log

Resolução

  1. Reinicie todos os outros nós do ZooKeeper no cluster um por um.
  2. Execute novamente os comandos de verificação de integridade do ZooKeeper em cada nó e confira se você recebe a saída esperada.

Entre em contato com o suporte da Apigee para solucionar a causa da carga do sistema se ela persistir ou se as reinicializações não resolverem o problema.