了解 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 配置参数。