【问题标题】:Couchbase/Membase: Moxi proxy downstream timeout SERVER_ERRORCouchbase/Membase:Moxi 代理下游超时 SERVER_ERROR
【发布时间】:2013-07-17 22:08:28
【问题描述】:

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

检查 moxi 日志(启用 -vvv)后,我在收到 SERVER_ERROR 时注意到以下内容:

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,但这根本没有帮助。错误仍然经常发生。

有人可以建议我找出问题的原因吗?或者是否有一些可能的罪魁祸首?

【问题讨论】:

    标签: couchbase membase


    【解决方案1】:

    SERVER_ERROR 代理下游超时

    在这个错误响应中,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
    

    来自网址:

    http://www.couchbase.com/docs/moxi-manual-1.8/moxi-dataflow.html

    几乎完美地介绍了 moxi 的运作方式。

    了解 moxi 中一些可配置的命令行标志 (并发,downstream_max,downstream_conn_max,downstream_timeout, wait_queue_timeout 等),跟踪请求会很有帮助 通过磨西...

    moxi的正常数据流如下:

    客户端连接

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

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

    客户端发出请求,进入等待队列

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

    此时,moxi 将上游 conn 置于 wait 的尾部 队列。 moxi 的 wait_queue_timeout 参数控制多长时间 在 moxi 超时之前,上游 conn 应该留在等待队列中 并以 SERVER_ERROR 响应响应客户端。

    并发参数

    接下来,有一个可配置的最大限制,即上游连接的数量 请求 moxi 将在等待的头部同时处理 队列。这种可配置的限制称为并发。 (这个以前 曾经被称为downstream_max,也许令人困惑。为了 向后兼容、并发和downstream_max 配置 标志被视为同义词。)

    并发配置是按线程和按桶的。那 就是,moxi进程级并发其实就是并发X num-worker-threads X num-buckets。

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

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

    moxi's 并发增加到 1024 背后的原因 配置(过去要低得多)是由于不断发展的设计 莫西。最初,moxi 仅将等待队列作为其唯一的内部 队列。随着更多,在moxi的历史中增加了后期队列, 我们发现让请求从等待队列中更快地进入 后期排队是更好的方法。我们将讨论这些 下面的后期队列。

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

    密钥散列

    并发处理的客户端请求(取自头部 等待队列)现在需要与下游连接匹配 到 Couchbase 服务器。如果客户端的请求带有密钥 (如 SET、DELETE、ADD、INCR、单键 GET),请求的键是 散列以找到正确的下游服务器“主机:端口:存储桶”信息。 例如,类似“memcache1:11211:default”的内容。如果 客户端的请求是广播式命令(如 FLUSH_ALL,或 multi-key GET), moxi 知道它需要的下游连接 获取。

    下游连接池

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

    downstream_conn_max 参数

    默认情况下,downstream_conn_max 值为 4。值为 0 表示没有限制。

    所以,如果你设置了 4 的下游conn_max,有 4 个工作线程, 并有 1 个桶,你应该看到 moxi 最多创建 4 个 与任何 Couchbase 服务器的 X 4 X 1 或 16 个连接。

    连接到下游服务器

    如果没有可用的下游连接,并且 未达到下游conn_max,moxi创建下游conn为 根据需要执行 connect() 和 SASL 身份验证。

    connect_timeout 和 auth_timeout 参数

    connect() 和 SASL 身份验证有自己的可配置超时 参数,称为 connect_timeout 和 auth_timeout,以及这些 以毫秒为单位。 connect_timeout 的默认值为 400 毫秒,auth_timeout 默认为 100 毫秒。

    下游连接队列

    如果达到了downstream_conn_max,那么请求必须等到一个 下游连接可用;因此请求是 放置在每个线程、每个主机:端口:存储桶队列上,称为 下游连接队列。随着下游 conns 被释放回 下游连接池,它们将被分配给任何请求 等待下游连接队列。

    downstream_conn_queue_timeout 参数

    还有另一个可配置的超时,downstream_conn_queue_timeout, 它定义了请求应该多长时间 在超时之前以毫秒为单位停留在下游 conn 队列中。 默认情况下,downstream_conn_queue_timeout 为 200 毫秒。一种 值为 0 表示没有超时。

    保留下游连接

    最后,在这一点上,下游 conn 匹配到 客户的要求。如果您已将 moxi 配置为跟踪时序直方图 统计一下,moxi现在会得到请求的正式开始时间。 moxi 现在开始异步发送请求消息字节到 下游连接并异步等待响应。

    要开启时序直方图统计,请使用“time_stats=1” 配置标志。默认情况下,time_stats 为 0 或关闭。

    downstream_timeout 参数

    接下来,如果你已经配置了downstream_timeout,moxi会启动一个定时器 对于 moxi 可以限制其花费时间的请求 此时处理请求。如果计时器触发,moxi 将 将“SERVER_ERROR 代理下游超时”返回给客户端。

    downstream_timeout 默认值为 5000 毫秒。如果莫西看到 这段时间过去了,它将关闭任何下游连接 被分配给请求。由于这种简单的关闭行为 超时的下游连接,非常短 不建议使用下游超时。这将有助于避免重复 连接创建、超时、关闭和重新连接。在一个 集群过载,您可能需要增加downstream_timeout 所以 moxi 不会不断尝试在下游超时 已经超载的集群上的连接,或者通过创建更多 服务器已经在尝试处理请求时的新连接 旧的、封闭的连接。如果你看到你的服务器大幅飙升,你 应该考虑做这个调整。

    收到回复

    当从下游服务器收到请求的所有响应时(或 下游连接出错),异步莫西 将这些响应发送到客户端的上游连接。如果你有 配置 moxi 跟踪时序直方图统计,moxi 现在跟踪 请求的正式结束时间。下游 conn 现在是 释放回每个线程的下游 conn 池,另一个 等待客户端请求(如果有)从下游连接队列中取出 并分配使用该下游连接。

    退避/黑名单

    在第 6 步,可能会出现 connect() 尝试失败的情况。磨西 可以配置为计算连接()失败的次数 下游服务器,并且还将跟踪上次失败的时间 connect() 尝试。

    通过 connect() 失败计数,moxi 可以配置为 如果出现过多的 connect() 失败,则将服务器列入黑名单,即 由 connect_max_errors 配置参数定义。当更多 比 connect_max_errors 看到的 connect() 失败次数,moxi 可以配置为暂时停止进行 connect() 尝试 该服务器(或退避)一段配置的时间。退避 时间通过 connect_retry_interval 配置定义,在 毫秒。

    connect_max_errors 的默认值为 5,connect_retry_interval 是 30000 毫秒,即 30 秒。

    如果你使用connect_max_errors参数,它应该设置大于 downstream_conn_max 配置参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2013-01-19
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      相关资源
      最近更新 更多