2011-05-03 2 views
0

Я столкнулся с нечетной проблемой с кликом pecl/memcached. В моей настройке у меня есть 3 сервера memcached. Когда я останавливаюсь (это экземпляр ec2), один из серверов memcached для имитации полного сбоя, операция «получить» занимает 4 секунды. Как заставить его тайм-аут раньше?failcached server failover

Вот некоторые фрагменты кода:

$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

+0

Данные - это просто нежелательный объект. Я понял. Необходимо использовать Memcached :: OPT_CONNECT_TIMEOUT. Похоже, что соединение происходит при «get» не при добавлении сервера(). –

+0

Да связи устанавливаются только тогда, когда они необходимы (на вызовы «Memcache :: get') – Bil

ответ

0

Попробуйте addserver syntaxe

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

Спасибо, Бил, но мы используем библиотеку pecl/memcached, мы также можем попробовать pecl/memcache. –

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); 
}