对于正确的故障转移机制
$memcached = new Memcached();
$memcached->setOption(Memcached::OPT_CONNECT_TIMEOUT, 10);
$memcached->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$memcached->setOption(Memcached::OPT_SERVER_FAILURE_LIMIT, 2);
$memcached->setOption(Memcached::OPT_REMOVE_FAILED_SERVERS, true);
$memcached->setOption(Memcached::OPT_RETRY_TIMEOUT, 1);
$memcached->addServers($servers);
Memcached::OPT_DISTRIBUTION:将其设置为一致性哈希。如果一个 Memcached 节点已死,它的键(以及仅它的键)将被均匀地分布到其他节点。这就是魔法的实现方式。这与在 ->addServers() 调用中删除一个服务器完全不同。
Memcached::OPT_SERVER_FAILURE_LIMIT:在服务器被标记为 DEAD 并从服务器列表中移除之前,连接问题的次数(默认:5)。
Memcached::OPT_REMOVE_FAILED_SERVERS:将其设置为「true」,以启用移除已死服务器。
Memcached::OPT_RETRY_TIMEOUT:在节点被声明为 DEAD 后,libmemcached 将在这么多秒后再次尝试连接。这里我将其设置为 1 秒,但我正在处理的大多数情况下运行时间不到 100 毫秒的 PHP 脚本。这对于 cron/daemonize 脚本才有用。
Memcached::OPT_CONNECT_TIMEOUT:服务器被视为 DEAD 后的超时时间。由于我的服务器都在同一个 LAN 上,ping 时间约为 0.5 毫秒,因此 10 毫秒足够长以将服务器视为 DEAD。请注意,您必须等待两倍于该时间才能将节点标记为 DEAD,因此如果为 1000 毫秒,您的脚本将锁定 2 秒才能忽略 DEAD 服务器。这可能会严重影响您的响应时间,这就是我将其设置得很低的原因。
作者是 Dugwood 的 Yvan