强制memcached写入池中的所有服务器

时间:2010-05-23 21:31:33

标签: php memcached reliability

我已经考虑过如何确保将特定密钥分发给池中的所有memcached服务器。

我当前未经测试的解决方案是创建另一个memcached实例,如下所示:

$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();

在这种情况下,当需要将某些密钥存储在所有服务器上以确保可靠性时,常识是什么?

3 个答案:

答案 0 :(得分:6)

我认为你没有按照它的设计方式使用memcached。请查看FAQ:您应该只存储项目的单个副本,根据所使用的哈希算法,它会将您的项目放在某个节点上。

现在,如果您希望在所有节点中都有一个项目,那么唯一的方法就是迭代,就像您现在正在做的那样。

我希望您的代码能够处理在缓存中找不到此项的情况。

答案 1 :(得分:4)

我认为你错过了Memcached的观点。它不适用于可靠的数据存储。这是非常快速访问缓存数据。如果您想要冗余,请尝试使用像MongoDB这样的NOSQL数据库...

此外,创建多个连接会对性能和冗余造成不利影响(需要建立的连接越多,出错的可能性就越大,每个请求需要做的就越多)。

简化,不要复杂......

答案 2 :(得分:1)

我们不得不“扩散”密钥的负载,这些密钥在memcache服务器上非常频繁地受到攻击。我们通过简单地附加一个随机数0-N来实现这一点,其中N是您配置的实例数的倍数。如果你错过,你去源(数据库,无论如何)。我说一个倍数,因为memcache对你的密钥进行哈希处理,你可能会在不知情的情况下发生冲突。

这可能导致从源获取更多读取的前期成本(与N的倍数成比例),但是可以在所有实例中分散一个键的负载,从而使这些框保持开心。

但是,这不是为了冗余,而是用于负载平衡。