一、Circuit Breaker 簡介
Elasticsearch 是基于 JVM 的搜索引擎,其內存管理十分重要。為了避免單個操作或查詢耗費過多內存導致節點不可用,Elasticsearch 引入了 Circuit Breaker(熔斷器)機制。當內存使用達到熔斷器預設閾值時,相應操作會立即被中止,并返回明確的錯誤信息。
注意:
Circuit Breaker 并不能完全跟蹤 Elasticsearch 所有內存使用情況,因此并不能提供 100% 完整的內存保護。
二、Elasticsearch 中的 Circuit Breaker 類型與配置
Elasticsearch 提供了多個類型的熔斷器,以限制不同場景的內存使用:
1. 父級熔斷器(Parent Circuit Breaker)
父級熔斷器用于控制整體內存使用,設定所有子熔斷器的整體上限:
-
indices.breaker.total.use_real_memory(靜態)
是否使用真實內存,默認為true
。 -
indices.breaker.total.limit(動態)
總體熔斷器內存上限:- 若
use_real_memory=false
,默認值為 JVM Heap 的 70%; - 若
use_real_memory=true
,默認值為 JVM Heap 的 95%。
- 若
推薦配置:
PUT _cluster/settings
{"persistent": {"indices.breaker.total.limit": "90%"}
}
2. Field Data 熔斷器
控制字段數據緩存加載時的內存使用:
-
indices.breaker.fielddata.limit(動態)
默認為 JVM Heap 的 40%。 -
indices.breaker.fielddata.overhead(動態)
內存預估系數,默認為1.03
。
推薦配置(默認即可):
PUT _cluster/settings
{"persistent": {"indices.breaker.fielddata.limit": "40%","indices.breaker.fielddata.overhead": 1.03}
}
3. 請求熔斷器(Request Circuit Breaker)
用于控制單個請求期間數據結構內存:
-
indices.breaker.request.limit(動態)
默認 JVM Heap 的 60%。 -
indices.breaker.request.overhead(動態)
默認1
。
推薦配置:
PUT _cluster/settings
{"persistent": {"indices.breaker.request.limit": "60%"}
}
4. 在途請求熔斷器(In-flight Requests Circuit Breaker)
限制傳輸層與 HTTP 請求的內存使用:
-
network.breaker.inflight_requests.limit(動態)
默認為 JVM Heap 的 100%。 -
network.breaker.inflight_requests.overhead(動態)
默認系數為2
。
推薦配置:
PUT _cluster/settings
{"persistent": {"network.breaker.inflight_requests.limit": "90%","network.breaker.inflight_requests.overhead": 2}
}
5. 腳本編譯熔斷器(Script Compilation Circuit Breaker)
限制單位時間內內聯腳本的編譯數量:
- script.max_compilations_rate(動態)
默認每 5 分鐘 150 次。
當腳本緩存頻繁淘汰(cache_evictions)時,應擴大腳本緩存:
PUT _cluster/settings
{"persistent": {"script.cache.max_size": "2000"}
}
6. 正則表達式熔斷器(Regex Circuit Breaker)
限制 Painless 腳本中正則表達式的復雜性:
-
script.painless.regex.enabled(靜態)
可選值:limited
(默認):啟用,但限制復雜度。true
:完全啟用,無復雜度限制。false
:禁用正則。
-
script.painless.regex.limit-factor(靜態)
默認值為 6,表示腳本輸入長度的倍數作為最大匹配長度限制。
推薦配置:
script.painless.regex.enabled: limited
script.painless.regex.limit-factor: 6
7. EQL 查詢熔斷器(EQL Circuit Breaker)
針對序列查詢的內存控制:
-
breaker.eql_sequence.limit(動態)
默認 JVM Heap 的 50%。 -
breaker.eql_sequence.overhead(動態)
默認為1
。 -
breaker.eql_sequence.type(靜態)
熔斷器類型:memory
(默認):啟用。noop
:禁用。
推薦配置:
PUT _cluster/settings
{"persistent": {"breaker.eql_sequence.limit": "40%","breaker.eql_sequence.overhead": 1}
}
8. 機器學習熔斷器(Machine Learning Circuit Breaker)
控制機器學習模型推理的內存使用:
-
breaker.model_inference.limit(動態)
默認 JVM Heap 的 50%。 -
breaker.model_inference.overhead(動態)
默認1
。 -
breaker.model_inference.type(靜態)
熔斷器類型:memory
(默認):啟用。noop
:禁用。
推薦配置(默認即可):
PUT _cluster/settings
{"persistent": {"breaker.model_inference.limit": "50%"}
}
三、最佳實踐和建議
-
避免設置過高:
熔斷器的閾值設置過高,可能導致節點 OOM 崩潰。 -
合理分配熔斷器比例:
父級熔斷器一般不超過 JVM Heap 的 90%。各子熔斷器在此基礎上再進行分配。 -
動態調整與監控:
Elasticsearch 支持大部分熔斷器動態修改,實時監控并按需調整是維護集群穩定性的關鍵。 -
關注日志與監控系統:
使用 Elasticsearch 的日志系統及監控工具,及時發現并分析 Circuit Breaker 錯誤,合理調整內存閾值。
四、總結
Circuit Breaker 是 Elasticsearch 集群運行中的重要保護機制。深入理解各類熔斷器的作用及配置方法,合理設置各項閾值,能有效防止 Elasticsearch 由于內存資源耗盡而宕機,從而提升整個集群的穩定性和性能表現。
運維人員應結合業務場景,動態監控并適時調整熔斷器配置,以保持 Elasticsearch 集群穩定高效地運行。