限流插件
百度智能云Elasticsearch(以下简称为ES)提供了限流插件,目的是为了提高集群的稳定性。该插件能够实现集群级别的读写限流,在关键时刻把指定索引的流量控制在合适范围内。例如当上游业务无法进行流量控制时,尤其对于读请求业务,可根据限速插件设置的规则进行限流,来保护Elasticsearch服务的稳定性。
注意:目前限流插件支持7.4.2、7.10.2版本的Elasticsearch实例。
插件安装
百度智能云ElasticSearch在控制台的集群详情页面,【插件配置】-> 【系统插件】中提供了限流插件,找到限流插件(baidu-rate-limiting),点击安装即可完成插件安装。
注意:需要重启集群后插件才可正常使用
限流规则
用户可先参考如下规则评估限流规则:
限流请求类型
- 查询请求
查询请求的限流阈值 = 客户端查询请求到达Elasticsearch的QPS(Query Per Second)
注意:QPS指查询请求到达ES集群的每秒请求数。
- 写入请求
写入请求的限流阈值的计算规则与查询请求类似,可以限制Bulk每秒写入的总字节数,也可以限制单次写入的最大字节数。
限流级别
- 节点级别
每个节点都会按照当前设定的限流规则进行限流,比如设定查询限流QPS为 100/s,则每个节点可以承受100/s的查询请求。默认限流级别为节点级别
。
- 集群级别
整个集群按照当前设定的限流规则进行限流,比如设定查询限流QPS为 100/s,则所有节点总计可以承受100/s的查询请求。
注意:集群级别限流需要在集群的主节点进行流量统计,而大型在线业务使用集群级别限流会导致主节点计算压力过大。因此大型在线业务限流建议使用节点级别,集群级别限流仅建议测试集群使用。
使用方法
开启限流功能
限流插件的限流功能默认关闭,使用时需要先开启该功能。
PUT _cluster/settings
{
"persistent" : {
"bpack.ratelimit.enabled":"true"
}
}
设置限流级别
- 设置为节点级别(默认为节点级别)
put _cluster/settings
{
"persistent": {
"bpack.ratelimit.level": "NODE"
}
}
- 设置为集群级别
put _cluster/settings
{
"persistent": {
"bpack.ratelimit.level": "CLUSTER"
}
}
设置查询限流
通过定义index_patterns
设置目标索引的查询QPS(Query Per Second),支持索引和索引通配符。
设置单个索引的查询QPS
PUT _bpack/_ratelimit/<limitName>
{
"type" : "search",
"index_patterns" : "twitter",
"max_queries_per_sec" : 1000
}
设置指定名称前缀的索引的查询QPS
PUT _bpack/_ratelimit/<limitName>
{
"type" : "search",
"index_patterns" : "nginx-log-*",
"max_queries_per_sec" : 1000
}
设置所有索引的查询QPS
PUT _bpack/_ratelimit/<limitName>
{
"type" : "search",
"index_patterns" : "*",
"max_queries_per_sec" : 1000
}
限流示例
当设置完成后,如果查询QPS超过max_queries_per_sec
设置的值,系统会显示如下报错信息。请根据报错信息适当减少查询QPS。
{
"error": {
"root_cause": [
{
"type": "rate_limiting_exception",
"reason": "search request indices:data/read/search, limited by [search limiting:aaa:1.0]."
}
],
"type": "rate_limiting_exception",
"reason": "search request indices:data/read/search, limited by [search limiting:aaa:1.0]."
},
"status": 429
}
设置写入限流
设置Bulk每秒写入大小
通过设置Bulk每秒写入的总字节数,限制协调节点每秒接收的写入字节数。
PUT _bpack/_ratelimit/<limitName>
{
"type" : "write",
"index_patterns": "nginx-log-*",
"max_throughput_in_bytes" : 1000000
}
设置Bulk单次请求大小
通过设置Bulk单次请求的最大值,限制ES集群接收单次请求的写入字节数。
PUT _bpack/_ratelimit/<limitName>
{
"type" : "write",
"index_patterns": "nginx-log-*",
"max_request_size_in_bytes" : 1000
}
限流示例
当设置完成后,如果每秒写入的字节数超过max_throughput_in_bytes
的值或单次写入的字节数超过max_request_size_in_bytes
的值,系统会显示如下报错信息。请根据报错信息适当减少每秒写入的字节数。
限制每秒写入大小:
{
"error": {
"root_cause": [
{
"type": "rate_limiting_exception",
"reason": "write request indices:data/write/bulk, limited by [write limiting:nginx-log-1:100.0]."
}
],
"type": "rate_limiting_exception",
"reason": "write request indices:data/write/bulk, limited by [write limiting:nginx-log-1:100.0]."
},
"status": 413
}
限制单次请求大小:
{
"error": {
"root_cause": [
{
"type": "rate_limiting_exception",
"reason": "write request indices:data/write/bulk, limited by [write limiting:nginx-log-1:max_size(10), but 73]."
}
],
"type": "rate_limiting_exception",
"reason": "write request indices:data/write/bulk, limited by [write limiting:nginx-log-1:max_size(10), but 73]."
},
"status": 413
}
查看限流配置
- 获取所有限流配置
GET _bpack/_ratelimit
- 获取单个指定的限流配置
GET _bpack/_ratelimit/<limitName>
- 获取多个指定的限流配置
GET _bpack/_ratelimit/<limitName1,limitName2>
删除限流配置
DELETE _bpack/_ratelimit/<limitName>
关闭限流功能
PUT _cluster/settings
{
"persistent" : {
"bpack.ratelimit.enabled":"false"
}
}
或
PUT _cluster/settings
{
"persistent" : {
"bpack.ratelimit.enabled":null
}
}