Erreurs de perte de connexion Zookeeper

Vous consultez la documentation d'Apigee Edge.
Consultez la documentation Apigee X.
en savoir plus

Problème constaté

Les problèmes de connectivité de ZooKeeper peuvent se manifester par différents symptômes, par exemple:

  1. Erreurs de déploiement du proxy d'API
  2. Échec des appels d'API de gestion avec des erreurs 5XX
  3. Les routeurs ou les processeurs de messages ne démarrent pas.
  4. Les composants Analytics signalent une perte de connexion ZooKeeper dans le fichier system.logs

Messages d'erreur

Vous trouverez ci-dessous des exemples de messages d'erreur pouvant être observés en cas de perte de connexion aux nœuds ZooKeeper.

  1. L'erreur suivante est renvoyée dans les journaux du serveur de gestion en cas d'échec du déploiement d'un proxy d'API en raison d'une perte de connexion 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. Au démarrage, les routeurs et les processeurs de messages se connectent à ZooKeeper. En cas de problèmes de connectivité avec ZooKeeper, ces composants ne démarrent pas et renvoient l'erreur suivante :
    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. L'interface utilisateur Edge peut afficher l'erreur suivante indiquant qu'elle n'a pas pu vérifier l'état de déploiement des proxys d'API :
    Error Fetching Deployments
    Error while checking path existence for path: path
    

Causes possibles

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

Cause Pour
Problème de connectivité réseau dans différents centres de données Utilisateurs de cloud privé périphérique
Le nœud ZooKeeper ne diffuse pas les requêtes Utilisateurs de cloud privé périphérique

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

Problème de connectivité réseau dans différents centres de données

Diagnostic

Un cluster ZooKeeper peut comporter des nœuds répartis sur plusieurs régions/centres de données, tels que DC-1 et DC-2. La topologie DC Apigee Edge 2 classique présente les caractéristiques suivantes:

  • Serveurs 1, 2 et 3 de ZooKeeper en tant qu'électeurs dans DC-1
  • ZooKeeper 4 et 5 en tant qu'électeurs et ZooKeeper 6 en tant qu'observateur dans DC-2

En cas de panne de la région DC-1 ou si la connectivité réseau entre DC-1 et DC-2 est interrompue, les nœuds ZooKeeper ne peuvent pas désigner de nouvelle instance principale dans DC-2 et ne parviennent pas à communiquer avec celui-ci. Les observateurs de ZooKeeper ne peuvent pas élire de nouveau président, et les deux électeurs restants dans DC-2 ne disposent pas d'un quorum d'au moins trois nœuds pour élire un nouveau président. Ainsi, ZooKeepers dans DC-2 ne pourra traiter aucune requête. Les nœuds ZooKeeper restants dans DC-2 continueront d'effectuer une boucle en essayant de se reconnecter aux votants de ZooKeeper pour trouver la variante optimale.

Résolution

Appliquez les solutions suivantes pour résoudre ce problème dans l'ordre spécifié.

Si vous ne parvenez pas à résoudre le problème après avoir essayé ces solutions, veuillez contacter l'assistance Apigee.

Solution 1

  1. Contactez vos administrateurs réseau pour résoudre le problème de connectivité réseau entre les centres de données.
  2. Une fois que l'ensemble ZooKeeper est en mesure de communiquer entre les centres de données et de désigner un leader ZooKeeper, les nœuds devraient devenir opérationnels et pouvoir traiter les requêtes.

Solution 2

  1. Si la résolution de la connectivité réseau prend du temps, une solution de contournement consiste à reconfigurer les nœuds ZooKeeper dans la région où ils sont indisponibles. Par exemple, reconfigurez le cluster ZooKeeper dans DC-2 de sorte que les trois nœuds ZooKeeper de cette région soient tous des votants, et supprimez server.# dans le sous-réseau zoo.cfg de ZooKeepers de la région DC-1.
    1. Dans l'exemple suivant, zoo.cfg configure des nœuds pour deux régions, où DC-1 utilise des noms d'hôte us-ea correspondant à la région US-East et DC-2 à des noms d'hôte us-wo correspondant à la région US-West. (REMARQUE: Seules les configurations pertinentes sont affichées) :
      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
      

      Dans l'exemple ci-dessus, reconfigurez zoo.cfg comme suit:

      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. À l'aide du code avec la configuration, créez un fichier /opt/apigee/customer/application/zookeeper.properties avec le code suivant :
      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\
      

    Dans ce qui précède, les nœuds de la région US-East sont supprimés, et les nœuds US-West sont promus aux votants lorsque l'annotation :observer est supprimée.

  2. Sauvegardez /opt/apigee/apigee-zookeeper/conf/zoo.cfg et l'ancienne version de /opt/apigee/customer/application/zookeeper.properties.

    Ces fichiers seront utilisés pour restaurer les valeurs par défaut lorsque la connectivité réseau sera rétablie entre les centres de données.

  3. Désactivez la notation d'observateur pour le nœud d'observateur. Pour ce faire, ajoutez la configuration suivante en haut de /opt/apigee/customer/application/zookeeper.properties:

    conf_zoo_peertype=
  4. Modifiez le fichier /opt/apigee/data/apigee-zookeeper/data/myid comme suit :

    • Pour server.1, faites passer l'entrée dans myid de 4 à 1.
    • Pour server.2, remplacez la valeur myid de 5 par 2.
    • Pour server.3, remplacez la valeur myid de 6 par 3.
  5. Redémarrez les nœuds ZooKeeper dans la région où vous avez reconfiguré le cluster ZooKeeper.
  6. Répétez la configuration ci-dessus des étapes 1b à 5 sur tous les nœuds ZooKeeper de DC-2.
  7. Vérifiez que les nœuds sont opérationnels avec une variante optimale :
    $ 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
    

    Le résultat de cette commande contient une ligne indiquant "mode", suivie de "leader" s'il s'agit de l'instance principale ou de "follower" s'il s'agit d'un esclave.

    Lorsque le réseau entre les centres de données est rétabli, les modifications de configuration de ZooKeeper peuvent être annulées sur les nœuds ZooKeeper dans DC-2.

Solution 3

  1. Si le ou les nœuds ZooKeeper du cluster ne sont pas démarrés, redémarrez-les.
  2. Consultez les journaux ZooKeeper pour déterminer la raison pour laquelle le nœud ZooKeeper a cessé de fonctionner.

    Les journaux ZooKeeper sont disponibles dans le répertoire suivant:

    $ 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. Contactez l'assistance Apigee et fournissez les journaux ZooKeeper pour déterminer la cause de l'arrêt d'un nœud ZooKeeper.

Le nœud ZooKeeper ne diffuse pas les requêtes

Un nœud ZooKeeper de l'ensemble peut devenir non opérationnel et ne plus être en mesure de répondre aux requêtes des clients. Les raisons peuvent être multiples :

  1. Le nœud a été arrêté sans avoir été redémarré.
  2. Le nœud a été redémarré alors que le démarrage automatique n'a pas été activé.
  3. La charge système sur le nœud a entraîné une panne ou un dysfonctionnement.

Diagnostic

  1. Exécutez les commandes de vérification de l'état ZooKeeper suivantes sur chacun des nœuds ZooKeeper, puis vérifiez le résultat :
    1. $ echo "ruok" | nc localhost 2181
      

      Exemple de résultat :

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

      Vérifiez le mode pour déterminer si le nœud ZooKeeper est un leader ou un follower.

      Exemple de sortie pour un nœud ZooKeeper unique et tout-en-un:

      $ 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
      

      Cette commande liste les variables ZooKeeper permettant de vérifier l'état du cluster ZooKeeper.

      Exemple de résultat :

      $ 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
      

      Cette commande liste des statistiques sur les performances et les clients connectés.

      Exemple de résultat :

      $ 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
      

      Cette commande permet d'obtenir des informations détaillées sur les connexions ZooKeeper.

      Exemple de résultat :

      $ 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)
      

      Si l'une des trois dernières commandes de vérification de l'état affiche le message suivant:

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

      Elle indique ensuite que le ou les nœuds ZooKeeper spécifiques ne diffusent pas les requêtes.

  2. Consultez les journaux ZooKeeper sur le nœud concerné et essayez de localiser les erreurs à l'origine de l'arrêt de ZooKeeper. Les journaux ZooKeeper sont disponibles dans le répertoire suivant :
    $ 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
    

Résolution

  1. Redémarrez tous les autres nœuds ZooKeeper du cluster un par un.
  2. Exécutez à nouveau les commandes de vérification de l'état ZooKeeper sur chaque nœud et vérifiez si vous obtenez le résultat attendu.

Contactez l'assistance Apigee pour déterminer la cause de la charge système si celle-ci persiste ou si les redémarrages ne résolvent pas le problème.