2011-05-03 114 views
0

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

下面是一些代码片段:

$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); 
+0

是memcached的哪些数据? – Bil 2011-05-03 22:23:59

+0

数据只是一个垃圾对象。 我想通了。需要使用Memcached :: OPT_CONNECT_TIMEOUT。看起来连接发生在“get”而不是在addserver()处。 – 2011-05-03 22:57:34

+0

只有在需要时才建立连接(在'Memcache :: get'调用中) – Bil 2011-05-04 00:25:05

回答

0

试试这个addserver syntaxe

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

感谢Bil,但我们使用的是pecl/memcached库,我们也可以尝试pecl/memcache。 – 2011-05-05 17:50:46

2

我遇到了同样的问题,与所有超时在服务器上设置为50毫秒,一组()没有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值。

0

PECL Memcached优先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); 
}