Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php memcached服务器故障切换_Php_Memcached_Amazon Ec2_Pecl - Fatal编程技术网

Php memcached服务器故障切换

Php memcached服务器故障切换,php,memcached,amazon-ec2,pecl,Php,Memcached,Amazon Ec2,Pecl,我在使用pecl/memcached客户端时遇到了一个奇怪的问题。在我的设置中,我有3个memcached服务器。当我停止其中一个memcached服务器(这是一个ec2实例)以模拟完全故障时,“get”操作需要4秒钟才能完成。如何强制它提前超时 以下是一些代码片段: $this->memcache = new Memcached; $this->memcache->setOption(Memcached::OPT_DISTRIBUTION ,Memcached::DISTRI

我在使用pecl/memcached客户端时遇到了一个奇怪的问题。在我的设置中,我有3个memcached服务器。当我停止其中一个memcached服务器(这是一个ec2实例)以模拟完全故障时,“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);

试试这个
addserver
syntax

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

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

这似乎是libmemcached中的一个bug,我们可以在这里看到: (和许多其他网站)

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


Debian不稳定版本有0.44,它正确响应CONNECT_超时值。

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

数据只是一个垃圾对象。我想出来了。需要使用Memcached::OPT_CONNECT_TIMEOUT。连接似乎发生在“get”而不是addserver()。是的,连接仅在需要时建立(在
Memcache::get
调用上)。谢谢Bil,但我们使用的是pecl/memcached库,我们也可以尝试pecl/Memcache。