Elasticsearch 集群自我保护配置
Elasticsearch 集群集群自我保护配置
配置调试原因主要是为了保护ES 集群能够自我保护,避免业务人员写暴力查询语句,大量的占用内存或者CPU最终将es集群直接查挂。文档所有值均为参考值,具体设置多少合适需要根据集群规模、index分片数量、节点配置等等。。因素进行考量,设置合理阈值。
调试环境
ES 版本 :elasticsearch-6.2.4-1.noarch
OS:centos7.X
全局超时 search.default_search_timeout
除了在每个请求中设置超时之外,ES还支持全局性的搜索超时search.default_search_timeout,此设置没有默认值,设置为-1可以取消先前设置的值。
设置方法:
persistent :重启后依然有效
transient :重启后无效
PUT /_cluster/settings{ "persistent" : { "search.default_search_timeout" : "35s" }}
取消查询 earch.low_level_cancellation
搜索可以通过标准的任务取消机制来取消。默认情况下ES仅仅在段边界(segment boundaries)来检查请求是否已经被取消,因此取消操作可能由于大段而延迟。要降低取消操作的响应时间,可以设置search.low_level_cancellation=true,但是要注意此设置会导致更加频繁的检查。定期检查自己是否被取消,如果是则退出查询。
设置方法:
PUT /_cluster/settings{ "persistent" : { "search.low_level_cancellation" :true }}
设置此参数之后可以使用api接口手动取消任务;
#查询正在运行的taskGET _tasks?detailed=true&actions=*indices:data/read/search#取消任务POST _tasks/CdoilmnzRVyllc0PbRbB2w:7280/_cancel
search 并发和并行
action.search.shard_count.limit
这个参数主要用于限制一次操作过多的分片,防止过多的占用内存和CPU资源。默认情况下ES不限制搜索请求牵涉到的分片数量,你可以设置软限制 action.search.shard_count.limit 来拒绝命中太多分片的请求。
如果看到错误日志如下,修改此参数可以解决问题。
"reason" : "Trying to query 1344 shards, which is over the limit of 1000. This limit exists because querying many shards at the same time can make the job of the coordinating node very CPU and/or memory intensive. It is usually a better idea to have a smaller number of larger shards. Update [action.search.shard_count.limit] to a greater value if you really want to query that many shards at the same time."
PUT /_cluster/settings{ "persistent" : { "action.search.shard_count.limit" :"1000" }}orcurl -u admin:admin -XPUT 'https://localhost:9200/_cluster/settings' -H 'Content-Type: application/json' -d' { "persistent" : { "action.search.shard_count.limit" : "1000" }}
max_concurrent_shard_requests (貌似新版本已经放弃此参数,确认中。。)参数可以限制搜索请求最多同时在多少个分片上执行,可以防止单个搜索请求消耗整个集群的资源。此参数的默认值取决于集群中数据节点的数量,最多256。###### 设置方法:PUT /_cluster/settings{ "persistent" : { "max_concurrent_shard_requests : "80" }}
index.max_result_window
默认大小:10000
就是from+size,from:决定要返回的文档从哪里开始,size:决定返回多少条。假如from+size很大的话,将会消耗很多的内存和时间;这个设置就是为了防止内存不够用的情况。
这个设置是索引层的,即便是使用_all设置了,看日志也是对逐个索引加这个配置,后续新加的索引,max_result_window默认还是1w。
使用Elasticsearch进行search查询的过程中,出现了Result window is too large问题。一般是这个参数设置过小导致的。
可通过如下方式修改:
配置单个索引
#查看单个索引设置GET /27_hot_v1/_settings#修改配置PUT /27_hot_v1/_settings{ "index.max_result_window":"10000"}orPUT /27_hot_v1/_settings{ "index.max_result_window":"10000"}curl -XPUT 192.168.40.31:9200/$(Index-name)/_settings -d '{ "index.max_result_window" :"1000000"}'
设置所有索引生效
curl -XPUT 192.168.40.31:9200/_all/_settings -d '{ "index.max_result_window" :"1000000"}'
验证配置结果
curl -XGET 172.20.7.22:9200/$(index-name)/_settings
index.max_inner_result_window:
默认是:100。这个设置限制的是 返回 结果中的 结果!
index.max_inner_result_window:和index.max_result_window原理差不多,这个设置限制的是返回结果中的结果。
配置单个索引
#查看单个索引设置GET /27_hot_v1/_settings#修改配置PUT /27_hot_v1/_settings{ "max_inner_result_window":"5000"}orPUT /27_hot_v1/_settings{ "index.max_inner_result_window":"100"}
index.max_docvalue_fields_search
默认最多请求100字段,Doc-value 字段成本很高,因为它们可能会导致每个字段的每个文档搜索。可以通过使用index.max_docvalue_fields_search索引设定覆盖.
PUT /27_hot_v1/_settings{ "index.max_docvalue_fields_search":"100"}
index.max_docvalue_fields_search
默认为32。ndex.max_script_fields:查询中允许的最大script_field数。
PUT /27_hot_v1/_settings{ "ndex.max_script_fields":"32"}
参考文档:
https://www.elastic.co/guide/en/elasticsearch/reference/6.5/search.html#global-search-cancellation
https://mp.weixin.qq.com/s/mKL2PJuNUJTl71Axv4-Rcw
https://www.cnblogs.com/huangpeng1990/p/4364341.html
https://kionf.com/2019/01/22/errornote-elk/
https://www.elastic.co/guide/en/elasticsearch/reference/6.6/modules-threadpool.html#_literal_fixed_literal