0

我在使用 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);
4

3 回答 3

2

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

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

我在 Debian 上工作,libmemcached 是 0.40,而且这个 bug 似乎至少要到 0.49(用于自动驱逐坏服务器)。

Debian 不稳定有 0.44,它正确响应 CONNECT_TIMEOUT 值。

于 2011-07-08T18:45:51.480 回答
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);
}
于 2011-07-27T14:07:37.617 回答
0

试试这个addserver语法

addserver($server, 11211, true, 10, 1, -1, false);
于 2011-05-04T00:21:46.627 回答