восстановление после отказа сервера memcached - PullRequest
0 голосов
/ 04 мая 2011

У меня странная проблема с клиентом 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 ]

2 голосов
/ 08 июля 2011

У меня возникла та же проблема: все тайм-ауты установлены на 50 мс, set () на сервере без memcached (или memcached остановлен), set () или get () занимают 21 секунду.

Кажется, это ошибка в libmemcached, как мы можем видеть здесь: https://bugs.launchpad.net/libmemcached/+bug/778777 (и многие другие сайты)

Я работаю над Debian, libmemcached равен 0,40, и ошибка, по-видимому, по крайней мере до 0,49 (для автоматического удаления плохих серверов).

Debian нестабильный имеет 0,44, что правильно отвечает на значение CONNECT_TIMEOUT.

0 голосов
/ 27 июля 2011

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);
}
0 голосов
/ 04 мая 2011

Попробуйте этот addserver синтаксис

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