云搜索实例经常会遇到因为业务上量导致 QPS 激增的情况。如果实例资源不变,QPS 激增会导致 Latency 上升、集群 Pending、Node 被打挂等情况。为了预防这一情况,云搜索服务团队开发了限流功能的插件,以减轻云搜索实例受到业务 QPS/写入吞吐突增的影响。
适用场景
从 QPS/吞吐的维度对特定索引的访问进行限制,以避免突发的 QPS 大幅增加导致集群崩溃,或者某些索引 QPS 的增加影响存量业务的 Latency 或其他性能指标的情况。
不适用场景
不适用于大查询将集群打挂的场景,例如一个极大数据量的 Agg 查询。限流插件无法在该情况下保护云搜索实例。
适用版本
目前仅支持 ES 7.10.2 版本。
前提条件
Byte-throttler 插件默认未安装,如果需要使用,请提前自行安装。如何安装,请参见安装系统内置插件。
步骤一:打开限流插件开关
默认处于关闭状态,使用前需要更新配置打开。
# 查看集群所有默认配置
# GET _cluster/settings?include_defaults&flat_settings
PUT _cluster/settings
{
"transient" : {
"index.ratelimit.enabled" : "true"
}
}
步骤二:增加限流规则
限流器主要由两部分组成,limiters 定义和 tags 定义。通过 tags 定义资源限制,通过 limiters 定义具体的限流类型和限流阈值。
- tags 中的索引名称支持 * 通配符。
- 每一条限流规则下可以配置多种限流类型。同一个limiter name下支持对
search.qps/writer.qps/write.throughput
的一项或多项设置限流阈值。 - 如果一次读写请求有多条限流规则命中,只要有一条触发限流,则会拒绝请求。
当请求超过限流值之后,ES 会拒绝之后发送的请求。返回的 http code 为429,内容为触发限制的规则及其名称。
查询操作 | Rest request |
---|
设置单个索引的查询 QPS 限流 | PUT _ratelimit/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "test_index"
}
}
{"limiters": {"search.qps": "1"}, "tags": {"index": "test_index"}}
|
设置指定名称前缀的索引的查询 QPS 限流 | PUT _ratelimit/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "test_index-*"
}
}
|
设置所有索引的查询总 QPS 限流 | PUT _ratelimit/<limiterName>
{
"limiters": {
"search.qps": "1000"
},
"tags": {
"index": "test_index-*"
}
}
|
写入操作 | Rest request |
设置单个索引的写入 QPS 限流 | PUT _ratelimit/<limiterName>
{
"limiters": {
"write.qps": "1000"
},
"tags": {
"index": "test_index"
}
}
|
设置单个索引的写入吞吐限流 | PUT _ratelimit/<limiterName>
{
"limiters": {
"write.throughput": "1024 * 1024"
},
"tags": {
"index": "test_index"
}
}
|
设置多个限流器配置 |
PUT _ratelimit/<limiterName>
{
"limiters": {
"search.qps": "1000",
"write.qps": "1000",
"write.throughput": "1024 * 1024"
},
"tags": {
"index": "test_index"
}
}
|
步骤三:查看限流规则
操作 | Rest request |
---|
获取所有限流配置 | GET _ratelimit/
|
获取单个指定的限流配置 | GET _ratelimit/<limiterName>
|
步骤四:删除限流规则
操作 | Rest request |
---|
删除单个指定的限流配置 | DELET _ratelimit/<limiterName>
|
步骤五:获取监控信息
操作 | Rest request |
---|
获得所有限流器的指标数据 | GET _ratelimit/metric
|
获得指定限流器的指标数据 | GET _ratelimit/metric/{limitName}
|
获得指定节点上所有限流器的指标数据 | GET _ratelimit/nodes/{nodeId}/metric
|
获得指定节点上指定限流器的指标数据 | GET _ratelimit/nodes/{nodeId}/metric/{limitName}
|