Couchbase/Membase:Moxi代理下游超时服务器\u错误

Couchbase/Membase:Moxi代理下游超时服务器\u错误,couchbase,membase,Couchbase,Membase,我在两个AmazonEC2实例(版本1.8.0)和大约5个应用服务器上有一个实时Couchbase集群,每个服务器上都运行PHP和moxi客户端。在尝试访问数据时,Moxi偶尔会返回一个SERVER\u错误。这种情况平均每几分钟发生一次。集群每秒处理大约500次操作 在检查了moxi日志(启用了-vvv)之后,我注意到大约在我得到服务器\u错误时发生了以下情况: 2013-07-16 03:07:22: (cproxy.c.2680) downstream_timeout 2013-07-16

我在两个AmazonEC2实例(版本1.8.0)和大约5个应用服务器上有一个实时Couchbase集群,每个服务器上都运行PHP和moxi客户端。在尝试访问数据时,Moxi偶尔会返回一个
SERVER\u错误
。这种情况平均每几分钟发生一次。集群每秒处理大约500次操作

在检查了moxi日志(启用了-vvv)之后,我注意到大约在我得到
服务器\u错误时发生了以下情况:

2013-07-16 03:07:22: (cproxy.c.2680) downstream_timeout
2013-07-16 03:07:22: (cproxy.c.1911) 56: could not forward upstream to downstream
2013-07-16 03:07:22: (cproxy.c.2004) 56: upstream_error: SERVER_ERROR proxy downstream timeout^M
我尝试将moxi配置中的下游超时从5000增加到25000,但这根本没有帮助。错误仍然频繁发生

有人能给我一些建议来找出问题的原因吗?或者是否有可能的罪犯

服务器\u错误代理下游超时

在该错误响应中,moxi在等待响应时达到超时 下游服务器响应请求。也就是说,莫希没有看到 任何显式错误,如连接中断,但响应 只是时间太长了。下游连接也将关闭 通过moxi而不是将下游连接放回 连接池。默认下游_超时配置为5000 (毫秒)

相当直接的错误,但它可能是由一些可能的事情引起的

尝试从moxi获取“stats proxy”的输出:

echo stats proxy | nc HOST 11211
显然,您已经了解到您关心这些设置:

STAT 11211:default:pstd_stats:tot_downstream_timeout xxxx
STAT 11211:default:pstd_stats:tot_wait_queue_timeout nnnnn
正如您所说,您的下游超时应该显示为5000

但也要看看:

STAT 11211:default:pstd_stats:tot_downstream_conn_queue_timeout 0
从URL:

这几乎是对莫希运作方式的完美体验

了解moxi中的一些可配置命令行标志 (并发、下游连接最大、下游连接最大、下游超时、, 等待(队列)(超时等),跟踪请求可能会有帮助 通过磨溪

moxi的正常数据流如下所示:

客户端连接

客户端创建到moxi的连接(上游连接)。 moxi的-c命令行参数最终控制 最大连接数

在这个-c参数中,moxi继承了与memcached相同的行为, 并将停止接受()客户端连接,直到 现有连接已关闭。当现有的 连接下降到-c定义的级别以下,moxi将接受()更多 客户端连接

客户机发出一个请求,该请求进入等待队列

接下来,客户机发出一个请求,比如简单的单键 命令(如set、add、append或单键get)

此时,moxi将上游conn放置在等待的尾部 队列moxi的等待队列超时参数控制 上游conn应在moxi超时之前保持在等待队列上 并用服务器错误响应响应客户端

并发参数

接下来,有一个可配置的最大限制,限制上游连接的数量 莫希将在等待过程中同时处理请求 队列这种可配置的限制称为并发性。(这以前是 过去被称为“下游最大值”,也许令人困惑 向后兼容性、并发性和下游_max配置 标志被视为同义词。)

并发配置为每个线程和每个存储桶。那个 是的,moxi进程级并发实际上是并发X num个工作线程X num个存储桶

默认并发配置值为1024。这意味着莫希 将同时处理来自的1024个上游连接请求 等待队列的头。(然而,磨溪的排队人数更多, 在moxi实际转发请求之前。这将在后面讨论 部分。)

以并发值1024为例,如果有4 工作线程(默认值,由moxi的-t参数控制)和1 bucket(大多数人一开始就使用的,比如“默认”bucket), 您将有1024x4x1或4096个并发处理的限制 在单个moxi进程中的客户端请求

moxi的并发性增加到1024的基本原理 配置(过去要低得多)是由于不断发展的设计 莫西的。最初,moxi只有等待队列作为其唯一的内部队列 队列随着时间的推移,在莫西的历史中增加了后期队列, 我们发现,更快地将请求从等待队列中取出并放到 后期排队是一种更好的方法。我们将讨论这些问题 下面是后期队列

接下来,让我们讨论如何将客户端请求与下游连接匹配

密钥散列

并发处理的客户机请求(取自主机) 现在需要与下游连接匹配 到Couchbase服务器。如果客户端的请求带有密钥 (像SET、DELETE、ADD、INCR、single key GET)请求的键是 散列以查找右下游服务器“主机:端口:bucket”信息。 例如,类似于“memcache1:11211:default”的内容。如果 客户端的请求是广播式命令(如FLUSH_ALL或 多键GET),moxi知道它需要的下游连接 获得

下游控制池

接下来,将使用这些host:port:bucket标识符进行查找 下游控制池,用于获取或保留 适当的下游接头。每个月有一个下游控制池 线每个下游conn池只是一个hashmap,由 host:port:bucket,具有可用数据链接列表的哈希值 下游康涅狄格州。任何下游连接链表的最大长度为 由moxi的下游连接最大配置参数控制

下游连接最大参数