简介
Elasticsearch包含多个断路器来防止出现内存溢出。每一个断路器都限制了能够使用的内存。除此之外,还有一个父级断路器,限制了所有断路器使用的内存总和。
除非另外注明,这些配置都是可以通过 cluster-update-settings API来实现对运行的集群进行动态配置。
更多断路器错误参见:Circuit breaker errors
正文
父级断路器
父级断路器可以通过以下配置实现
indices.breaker.total.use_real_memory
(静态)是否使用真实内存;如果是 true ,则计算断路器真实使用的内存作为总内存的一部分;如果是 false ,则只考虑断路器配置的预留内存。
indices.breaker.total.limit
(动态)父级断路器所有限制。如果 indices.breaker.total.use_real_memory 配置的是 false (真实使用内存),则默认值为JVM堆内存的70%,如果 indices.breaker.total.use_real_memory 配置的是 true (预留内存),则默认值为JVM堆内存的90%。
域数据断路器
域数据断路器会估算需要加载到 field data cache(域数据缓存)的堆内存,如果加载会超过预先定义的内存限制,则断路器会中断操作并返回错误。
indices.breaker.fielddata.limit
域数据断路器限制;默认是JVM堆内存的40%。
indices.breaker.fielddata.overhead
负载指数。用于和所有域估算值相乘来确定最终的估算,默认是 1.03。
请求断路器
请求断路器用来防止每一个请求数据结构(请求中,用于计算聚合信息的内存)超过指定的内存大小。
indices.breaker.request.limit
(动态)请求断路器的限制值,默认是JVM堆内存的60%。
indices.breaker.request.overhead
(动态)估算负载,默认是 1。
动态请求断路器
动态请求断路器允许Elasticsearch限制一个节点上在传输过程中或者HTTP级别上当前激活的请求进来的所有请求的内存使用量不超过一个具体的内存值。内存使用量取决于请求本身的内容数据大小。该断路器也会考虑到内存不仅用来表现原生的请求,也包括反射的结构化对象的默认开销。
network.breaker.inflight_requests.limit
(动态配置)动态请求断路器限制,默认是JVM堆内存100%,也就是最终根据父级断路器的限制来决定。
network.breaker.inflight_requests.overhead
(动态配置)估算负载,默认值是 2 。
计算请求断路器
用来限制一个请求完成后,在内存中未释放的数据的使用内存。包括类似于 Lucene Segment Memory(完备的Lucene倒排索引)。
indices.breaker.accounting.limit
(动态配置)计算请求断路器内存限制值,默认是堆内存的100%,也就是随父级断路器限制决定。
indices.breaker.accounting.overhead
(动态配置)估算负载,默认是 1。
脚本编译断路器
不同于基于内存的断路器,该断路器是用来限制一段时间内行内脚本的编译数量。更多参见scripting(脚本支持)https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-using.html
script.max_compilations_rate
(动态配置)限制一段时间内允许编译的不同脚本的数量。默认是 150/5m ,每五分钟150。
正则断路器
写的不好的正则表达式会影响集群的稳定和性能。正则断路器用来限制 regex in Painless scripts(无痛脚本里的正则)的复杂度。
频繁运行的脚本中尽量不要使用正则表达式。
script.painless.regex.enabled
(静态配置) 在无痛脚本中开启正则,可以传入的值:
- limited(默认值)
开启,但是使用 script.painless.regex.limit-factor 来限制正则的复杂度。
- true
开启,没有任何限制。
- false
禁止正则表达式,如果脚本中出现正则表达式,则报错。
script.painless.regex.limit-factor
(静态配置)限制脚本中使用的正则表达式的字符数量。Elasticsearch会将这个配置和脚本的输入长度相乘来获取限制值。
For example, the input foobarbaz
has a character length of 9
. If script.painless.regex.limit-factor
is 6
, a regular expression on foobarbaz
can consider up to 54 (9 * 6) characters. If the expression exceeds this limit, it triggers the regex circuit breaker and returns an error。
记住,超过正则限制,则会触发正则断路器,报错。
总结
Elasticsearch为了防止出现内存溢出异常,通过提供多种断路器来来分级限制、分场景限制内存使用。应该根据实际情况,配置这些断路器。