2012-12-03 52 views
0

我使用php memcached(而不是memcache),但我有一個關於故障轉移的問題。Memcached lib故障轉移像memcache lib

例如,我有兩臺memcached服務器,但是當服務器崩潰時,我希望memcached繼續以一個操作。

使用lib memcache可以工作,但不能使用memcached。 我想類似的東西

<?php 

$m = new Memcached(); 
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT); 

$m->addServer('server1', 11211); 
$m->addServer('server2', 11211); 

var_dump($m->set('1234','test')); 
var_dump($m->get('1234')); 

$m->flush(); 

$m = new Memcache(); 

$m->addServer('server1', 11211); 
$m->addServer('server2', 11211); 

var_dump($m->set('1234','test')); 
var_dump($m->get('1234')); 

$m->flush(); 

?> 

當兩個memcached的是高達:

bool(true) 
string(4) "test" 
bool(true) 
string(4) "test" 

但是,當我停止服務器2:

bool(false) 
bool(false) 

Notice: MemcachePool::set(): Server server2 (tcp 11211, udp 0) failed with: Connection refused (111) in /root/memcached.php on line 22 

Call Stack: 
    0.0013  637584 1. {main}() /root/memcached.php:0 
    0.0220  653104 2. MemcachePool->set() /root/memcached.php:22 

bool(true) 
string(4) "test" 

上的memcached的IO直接封鎖,返回false而在memcache上有一個通知,但IO的作品。

PS:我試過setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);但不工作

回答

1

選項$m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);允許:)

+0

這似乎工作,但我不完全確定爲什麼,http://us2.php.net/manual/en/memcached.constants.php。 「強烈建議您啓用此選項,如果您想要使用一致性散列,並且它可能會在未來版本中默認啓用。」 –

0

你缺乏一個選項:

$m->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT); 
$m->setOption(Memcached::OPT_REMOVE_FAILED_SERVERS, true); 

否則«集()»調用將導致「服務器失敗並且直到定時重試才被禁用」,但是由於服務器並未從列表中刪除,所以在同一臺服務器上的每個set()都會失敗。請注意,使用此配置時,如果您在壞服務器上設置(),則會將其刪除,並且數據在正確的服務器上正確設置()(錯誤服務器的密鑰分佈在所有剩餘的服務器上)。