对于正确的故障转移机制
$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 秒,但我正在处理的 PHP 脚本大多数情况下运行时间不到 100 毫秒。这仅对 cron/守护进程脚本有用。
Memcached::OPT_CONNECT_TIMEOUT:服务器被认为是 DEAD 后的超时时间。由于我的服务器位于同一个 LAN 上,ping 大约为 0.5 毫秒,因此 10 毫秒足以认为服务器是 DEAD。请注意,您必须等待两倍的时间才能将节点标记为 DEAD,因此如果它是 1000 毫秒,您的脚本将在忽略 DEAD 服务器之前锁定 2 秒。这可能会严重影响您的响应时间,这就是我将其设置得很低的原因。
作者是 Dugwood 的 Yvan