Twitter - Twemproxy - Memcached - 重试未按预期工作

26

简单设置:

  • 1个运行twemproxy(vcache:22122)的节点
  • 2个运行memcached(vcache-1、vcache-2)的节点,均监听11211端口

我有以下twemproxy配置:

default:
  auto_eject_hosts: true
  distribution: ketama
  hash: fnv1a_64
  listen: 0.0.0.0:22122
  server_failure_limit: 1
  server_retry_timeout: 600000 # 600sec, 10m
  timeout: 100
  servers:
    - vcache-1:11211:1
    - vcache-2:11211:1

twemproxy节点可以解析所有主机名。作为测试的一部分,我关闭了vcache-2。理论上,对于每次与vcache:22122接口的尝试,twemproxy将联系池中的服务器来促进尝试。但是,如果其中一个缓存节点宕机,则twemproxy应该将其从池中"自动弹出",以便后续请求不会失败。

由应用层确定与vcache:22122的接口尝试是否由基础设施问题导致,如果是,则再次尝试。然而,我发现在重试时,仍然使用相同的失败服务器,因此除了将后续尝试传递给已知的良好缓存节点(在这种情况下为vcache-1)外,它们仍然被传递给已弹出的缓存节点(vcache-2)。

以下是PHP代码片段,用于尝试重试:

....

// $this is a Memcached object with vcache:22122 in the server list

$retryCount = 0;

do {

    $status = $this->set($key, $value, $expiry);

    if (Memcached::RES_SUCCESS === $this->getResultCode()) {

        return true;
    }


} while (++$retryCount < 3);

return false;

-- 更新 --

有关更多信息,请查看在Github上开放的问题链接: 问题#427

2个回答

1

我看不出你的配置有任何问题。正如你所知道的,重要的设置已经就位:

default:
  auto_eject_hosts: true
  server_failure_limit: 1

文档建议连接超时可能是一个问题。

仅依赖客户端超时会产生负面影响,原始请求在客户端到代理服务器的连接上超时,但在代理服务器到目标服务器的连接上仍然悬而未决。当客户端重试原始请求时,这种情况会进一步恶化。

你的 PHP 脚本是否在 twemproxy 失败第一次尝试并将服务器从池中移除之前关闭连接并重试?也许在 twemproxy 中添加一个 timeout 值,该值比 PHP 中使用的连接超时时间更短,可以解决此问题。

然而,从你在 Github 上的讨论中可以看出,twemproxy 对于健康检查和自动剔除的支持似乎并不稳定。如果你正在构建旧软件包,则最好找到一款已经稳定了一段时间的软件包。mcrouter(附带有趣的文章)是否适合你?


我尝试了各种排列组合。我取消了memcached对象,添加了一个睡眠,然后重新实例化了该对象。但仍然没有成功。我相当确定我调整了超时设置,但它不在操作手册中,我需要检查我的笔记。我会更新的。 - Mike Purcell
我在 OP 中更新了配置,超时设置为 100 毫秒。这应该至少在第三次尝试时通过。 - Mike Purcell

0

太棒了,我会去看看的。 - Mike Purcell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接