Couchbase/Membase:Moxi代理下游超时服务器\u错误
我在两个AmazonEC2实例(版本1.8.0)和大约5个应用服务器上有一个实时Couchbase集群,每个服务器上都运行PHP和moxi客户端。在尝试访问数据时,Moxi偶尔会返回一个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
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的下游连接最大配置参数控制
下游连接最大参数