memcached服务器故障转移

时间:2011-05-03 21:00:18

标签: php memcached amazon-ec2 pecl

我遇到了pecl / memcached客户端的奇怪问题。在我的设置中,我有3个memcached服务器。当我停止(这是一个ec2实例)其中一个memcached服务器来模拟完全失败时,“get”操作需要4秒才能完成。如何强制它提前超时?

以下是一些代码段:

$this->memcache = new Memcached;
$this->memcache->setOption(Memcached::OPT_DISTRIBUTION ,Memcached::DISTRIBUTION_CONSISTENT);
$this->memcache->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE ,TRUE);
...
foreach($CFG->data_memcache_servers as $server){
  if (!$this->memcache->addserver($server,11211)){
    throw new Exception('Unable to connect to memcache server');    
  }
}
...
$data = $this->memcache->get($key);

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,所有超时都设置为50毫秒,服务器上的set()没有memcached(或memcached停止),set()或get()需要21秒。

这似乎是libmemcached中的一个错误,我们可以在这里看到: https://bugs.launchpad.net/libmemcached/+bug/778777 (和许多其他网站)

我正在使用Debian,libmemcached是0.40,并且该错误似乎至少达到0.49(用于自动驱逐坏服务器)。

Debian unstable有0.44,它正确响应CONNECT_TIMEOUT值。

答案 1 :(得分:0)

试试这个addserver语法

addserver($server, 11211, true, 10, 1, -1, false);

答案 2 :(得分:0)

PECL Memcached before 2.0不支持addServer()中的故障转移/超时相关参数。如果您遇到版本1.0.x(例如Ubuntu 10.04 LTS中提供),这是一种从单个主服务器向单个故障转移服务器提供故障转移支持的简单方法:

$m = new Memcached();
$m->addServer(MEMBASE_HOST, MEMBASE_PORT);

// Immediately check server connection
$m->get('onlinecheck_' . uniqid());

if (in_array($m->getResultCode(), array(Memcached::RES_ERRNO, Memcached::RES_UNKNOWN_READ_FAILURE)))
{
    // Main server not available - Failing over
    $m = new Memcached();
    $m->addServer(MEMBASE_FAILOVER_HOST, MEMBASE_FAILOVER_PORT);
}