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