我正在使用php memcached(不是内存缓存),但我遇到了有关故障转移的问题。
例如,我有两个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);
但无效
答案 0 :(得分:1)
选项$m->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
允许:)
答案 1 :(得分:0)
你缺少一个选择:
$m->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);
$m->setOption(Memcached::OPT_REMOVE_FAILED_SERVERS, true);
否则«set()»调用将导致«服务器失败并且在定时重试期间被禁用»,但由于服务器未从列表中删除,因此它将在同一服务器上的每个set()失败
请注意,使用此配置时,如果在错误的服务器上设置(),它将被删除并且数据在正常服务器上正确设置()(错误服务器的密钥分布在所有剩余的服务器上)。