0

我正在使用 php memcached(不是 memcache),但我遇到了故障转移问题。

例如,我有两台 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"

但是当我停止 server2 时:

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);,还是不行

4

2 回答 2

1

选项$m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);允许:)

于 2012-12-03T14:30:04.980 回答
0

您缺少一种选择:

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

否则,«set()» 调用将导致 «SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY»,但由于服务器未从列表中删除,因此同一服务器上的每个 set() 都会失败。

请注意,使用此配置时,当您在坏服务器上 set() 时,它会被删除,并且数据会在好服务器上正确 set()(坏服务器的密钥分布在所有剩余的服务器上)。

于 2013-12-12T14:43:56.870 回答