2017-03-08 3 views
-1

J'ai ce problème ennuyeux que je n'arrive pas à comprendre. Le problème est que mon client PHP Memcached ne cesse d'essayer d'écrire sur un serveur mort. Quand je vérifie les statistiques des serveurs, avec memcached- $> getStats(), il ressemble à ceci:PHP Memcached continue d'écrire sur le serveur

{ 
    "server1:11211": { 
     "pid" : 15, 
     "uptime" : 600 
     ... 
    }, 
    "server2:11211": { 
     "pid" : -1, 
     "uptime" : 0 
     ... 
    }, 
} 

qui, si je comprends bien, indique que server2 est mort? Mais quand je tente d'écrire des données sur le cluster, il essaie d'écrire la moitié des clés de ce serveur mort. Cela fonctionne très bien lorsque les deux serveurs sont en vie, mais dès que j'en tue un, cela ne semble pas affecter la distribution des clés.

Mon exemple Memcached ressemble à ceci:

protected static function getMemcached() 
{ 
    if(!self::$memcached) 
    { 
     self::$memcached = new Memcached(); 

     self::$memcached->setOptions(array(
      Memcached::OPT_CONNECT_TIMEOUT => 100, 
      Memcached::OPT_LIBKETAMA_COMPATIBLE => true, 
      Memcached::OPT_REMOVE_FAILED_SERVERS => true, 
      Memcached::OPT_SERVER_FAILURE_LIMIT => 2, 
      Memcached::OPT_RETRY_TIMEOUT => 1 
     )); 

     // Prevent adding a server to the connection pool each request 
     if (!self::$memcached->getServerList()) 
     { 
      // Add new connection 
      self::$memcached->addServers(self::getHosts()); 
     } 

    } 

    return self::$memcached; 
} 

PHP Info: PHP Info

Est-ce que ne Memcached::OPT_REMOVE_FAILED_SERVERS => true dire que si le serveur est en panne, il doit être retiré du pool de serveur? Est-ce que je ne comprends pas cela correctement? Lorsque j'essaie d'exécuter une commande ping sur le serveur mort à partir du client PHP, une erreur d'hôte inconnue se produit. Dois-je vérifier l'état de chaque serveur avant de les ajouter au pool avec addServers()?

En outre, chaque demande d'écriture a un getResultMessage() de SUCCESS.

apprécient vraiment une entrée sur ce point,

Répondre

0

Découvrez ce numéro sur GitHub: https://github.com/php-memcached-dev/php-memcached/issues/154

Qu'est-ce que signifie la distribution cohérente est que les clés données seront stockées sur des serveurs donnés, peu importe quoi. La distribution change lorsque vous demandez au pilote de la recalculer, en définissant à nouveau la méthode de distribution, ce qui met à jour la fonction de hachage et les serveurs morts ne sont plus utilisés.

+0

Merci pour la réponse. Si je comprends, je dois ouvrir une nouvelle connexion et appliquer l'option 'Memcached :: OPT_LIBKETAMA_COMPATIBLE' après chaque obtenir? –

+0

pas après chaque obtenir. Je voudrais essayer quelque chose comme ceci: if (! Self :: $ memcached-> getServerList()) { // Ajouter une nouvelle connexion self :: $ memcached-> addServers (self :: getHosts()); } { autre // obtenir des statistiques et vérifier si un noeud a échoué // reconnecte aux serveurs vivants } Je ne l'ai pas testé cette solution, mais je pense que le cache va commencer à partir de zéro parce que la distribution sera changement –