通常我会将可用服务器列表存储在APC中,这样我就可以随时修改它。你说得对,系统会尝试在其列出的同时继续使用已停机的服务器,但幸运的是,有了新的哈希方法,从轮换中取出它并不是什么大问题。
我建议避免使用全新的PHP扩展或尝试向部署栈添加新软件。你可能已经在使用某些监控工具(nagios?)。让它调用每个Web服务器上的简单PHP脚本来调整内存中的列表似乎是最好的选择。
值得注意的是,在Ketama哈希系统下,将服务器从轮换中移除会导致将其键重新哈希到环(连续体)的其他位置,其他服务器不会看到它们的键被分配到其他位置。将其视为一个圆圈,每个服务器在圆圈上被分配多个点(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();
$m->set($key, $key, 5);
var_dump($m->get($key));
unset($m);
$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$m->addServer('localhost', 11211);
$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);
$m->addServer('localhost', 11211);
$m->addServer('localhost', 11212);
$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);
$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个特定的插槽中有一次得到了布尔假值。显然,我只是在我的测试盒上启动了10个服务器,每个服务器只分配了4mb的内存。