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;
}
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,
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? –
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 –