Memcached为PHP和故障切换

我们正在为我们的应用程序部署memcached,我想尽可能地阻止它.

我们计划使用较新的memcacheD扩展.

我没有完全想到的一件事是,如果一台服务器死机,会发生什么.至少它似乎memcached客户端只是“放弃”在该服务器上,并不存储任何东西.

这个行为我很好.我们可以处理一堆缓存未命中.然而,在其中一台服务器被认为是“失败”后续的集合并得到重新分配给剩余的服务器将是很好的.

因为这似乎不会自动发生;我想,解决这个问题的唯一方法是让外部系统对memcached系统进行身体检查,并适当地更新服务器列表.

但是如果有10个服务器的列表,并且让我们说,第五个死机,即使使用了Ketama-hash,似乎也会触发一个大的重新分配密钥(这只是基于常识).

所以理想情况下,我只是希望PHP扩展能够找出一台服务器是否关闭,将其标记为一段指定的时间(10分钟),而在这10分钟的时间内,它会返回到其他服务器(分布式很好) .

其他人如何解决这个问题?

编辑:澄清我的libketama点.

说我们有10台服务器

1,2,3,4,5,6,7,8,9,10

其中一人死亡.然后,Libketama将提供非常高的可能性,将丢失的服务器的命中平均分配给其余的服务器:

1,2,3,4,inactive,6,7,8,9,10

但是:如果我们手动提供和管理此列表,情况并非如此:

1,2,3,4,6,7,8,9,10 // There are now 9 servers!

6将会得到5的以前的钥匙,7将获得6. 8将获得7,9将获得8和10将获得9.所有第10台服务器的命中率将不会在剩余的服务器中平均分配.导致将所有密钥的几乎50%发送到新服务器的可能性很高.

我通常将我的可用服务器列表存储在APC中,因此我可以即时修改它.你是正确的,系统会尝试在列出的时候继续使用down服务器,幸运的是,使用新的哈希方法,将它从旋转中拉下来不算什么.

我将避免使用全新的PHP扩展,或尝试向您的部署堆栈添加新的软件.你可能已经在使用某些东西来监视(nagios?).在每个Web服务器上调用简单的PHP脚本来调整内存列表似乎是最好的选择.

值得注意的是,在Ketama hashing system以下,将服务器从旋转中移除将导致其密钥在环的其他位置(连续体)重新散列,其他服务器将不会将其密钥分配到别处.将其可视化为圆形,每个服务器在圆圈上分配多个点(100-200).按键被旋转到圆圈并顺时针继续,直到找到一个服务器.从环中删除服务器只会导致这些值进一步找到一个新的服务器.幸运的是,价值的分配将平均对待其余的服务器.

演示散列系统:

<?php


$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);


$m->addServer('localhost', 11211);
$m->addServer('localhost', 11212);
$m->addServer('localhost', 11213);
$m->addServer('localhost', 11214);
$m->addServer('localhost', 11215);
$m->addServer('localhost', 11216);
$m->addServer('localhost', 11217);
$m->addServer('localhost', 11218);
$m->addServer('localhost', 11219);
$m->addServer('localhost', 11210);

$key = uniqid(); //You may change this to md5(uniqid()); if you'd like to see a greater variation in keys. I don't think it necessary.
$m->set($key, $key, 5);


var_dump($m->get($key));

unset($m);


$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
//one server removed. If assignment to the continuum is dependent based on add order, we would expect the get call here to fail 90% of the time, as there will only be a success if the value was stored on the first server. If the assignment is based on some hash of the server details we'd expect success 90% of the time. 
$m->addServer('localhost', 11211);
//$m->addServer('localhost', 11212);
$m->addServer('localhost', 11213);
$m->addServer('localhost', 11214);
$m->addServer('localhost', 11215);
$m->addServer('localhost', 11216);
$m->addServer('localhost', 11217);
$m->addServer('localhost', 11218);
$m->addServer('localhost', 11219);
$m->addServer('localhost', 11210);

var_dump($m->get($key));

unset($m);

$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
//2 servers removed
$m->addServer('localhost', 11211);
$m->addServer('localhost', 11212);
//$m->addServer('localhost', 11213);
//$m->addServer('localhost', 11214);
$m->addServer('localhost', 11215);
$m->addServer('localhost', 11216);
$m->addServer('localhost', 11217);
$m->addServer('localhost', 11218);
$m->addServer('localhost', 11219);
$m->addServer('localhost', 11210);

var_dump($m->get($key));

unset($m);

$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
//Out of order
$m->addServer('localhost', 11210);
$m->addServer('localhost', 11211);
$m->addServer('localhost', 11219);
$m->addServer('localhost', 11212);
$m->addServer('localhost', 11217);
$m->addServer('localhost', 11214);
$m->addServer('localhost', 11215);
$m->addServer('localhost', 11216);
$m->addServer('localhost', 11218);
$m->addServer('localhost', 11219);
$m->addServer('localhost', 11213);

var_dump($m->get($key));

unset($m);

如果哈希系统关心命令,或者省略服务器,我们期望在大多数次要示例中得到bool(false),因为早期的服务器被删除等等.但是,基于我快速,完全非科学的测试,我只得到在10点的任何一个槽中都有一个bool false.我刚刚在我的测试箱上启动了10台服务器.给他们每人只有4公斤的公羊

翻译自:https://stackoverflow.com/questions/12372031/memcached-for-php-and-failover

转载注明原文:Memcached为PHP和故障切换