2010-05-23 3 views
4

J'ai réfléchi un peu à la façon de vous assurer qu'une clé particulière est distribuée à TOUS les serveurs memcached d'un pool.Forcer memcached pour écrire sur tous les serveurs du pool

Mon actuelle, solution non testé est de faire une autre instance de memcached, quelque chose comme ceci:

$cluster[] = array('host' => '192.168.1.1', 'port' => '11211', 'weight' => 50); 

$this->tempMemcached = new Memcached; 
$this->tempMemcached->addServers($cluster); 

foreach ($this->cluster() as $cluster) {  

    $this->tempMemcached->setByKey($cluster, $key, $value, $this->compress, $expireTime); 

} 

$this->tempMemcache->close(); 

Quel est le bon sens de le faire dans ce cas, lorsque certaines clés doivent être stockés sur tous les serveurs pour la fiabilité ?

+2

Vous devrez suivre le même processus lors de la lecture des données. –

+0

@Seun - Je sais que :) @ Tout le monde: La prime est sur ON! – Industrial

Répondre

6

Je pense que vous n'utilisez pas Memcached la façon dont il a été conçu. Jetez un oeil à la FAQ: vous devriez seulement stocker un un seul exemplaire de votre article, ce qui, selon l'algorithme de hachage utilisé, mettrait votre article sur un certain nœud.

Maintenant, si vous voulez un élément disponible dans tous les nœuds, la seule façon de faire est d'itérer, exactement comme vous le faites en ce moment.

J'espère que votre code gère les cas où cet élément n'est pas trouvé dans le cache.

+1

Bonjour Mindas, merci pour votre réponse! – Industrial

+2

@Industrial: C'est le meilleur que vous obtiendrez. Comme d'autres l'ont dit, ce n'est pas ce que memcached est censé faire, il ne serait donc pas logique pour les créateurs d'implémenter un mécanisme de réplication. L'itération est le seul moyen. – ryeguy

+0

Je suis tombé sur un cas d'utilisation où l'application A envoie beaucoup de requêtes à memcache et utilise donc l'approche de hachage/partitionnement. Cependant, une clé est mise dans le cache via l'application B en utilisant un client memcache différent (rarement) et accessible par l'application A. Comment puis-je m'assurer que la clé est mappée sur le même noeud pour l'application A et B? La seule réponse à laquelle je peux penser est d'écrire la même clé pour chaque noeud. – quickinsights

4

Je pense qu'il vous manque le point de Memcached. Ce n'est pas pour un stockage de données fiable. C'est pour un accès TRÈS rapide aux données mises en cache. Si vous voulez de la redondance, essayez une base de données NOSQL comme MongoDB ...

De plus, créer plusieurs connexions va nuire à la performance et à la redondance (plus il y a de connexions à faire, plus il y a de risque que quelque chose se passe mal, et plus il doit faire pour chaque demande).

Simplifier, ne complique pas ...

+0

Salut! Je sais que, mais les clés qui doivent être stockées sur tous les serveurs sont rares et, par conséquent, le nombre de connexions pourrait être "raisonnable", je pense. Je suis sûr cependant qu'il y a une meilleure façon de faire ça! – Industrial

1

Nous avons dû 'étaler' la charge d'une clé qui est frappée très fréquemment sur les serveurs memcache. Nous faisons cela en ajoutant simplement un nombre aléatoire 0-N où N est un multiple du nombre d'instances que vous avez configuré. Si vous manquez, vous allez à la source (base de données, peu importe). Je dis un multiple depuis memcache hashes contre votre clé, vous pourriez obtenir une collision de seau sans le savoir. Ceci peut entraîner un coût initial de plus de lectures de la source (proportionnel à votre multiple de N), mais permet de répartir la charge d'une clé sur toutes les instances, en gardant ces boîtes heureuses.

Mais oui, ce n'est pas pour la redondance, c'est pour l'équilibrage de charge.

Questions connexes