在使用Elasticsearch進行查詢時,您可能經常遇到這種問題:向叢集發送了一條慢查詢,佔滿了所有的節點資源,導致CPU佔滿或者記憶體溢出,影響線上業務。針對這類問題,Elasticsearch開發了慢查詢隔離池功能,實現對單條查詢請求進行開銷追蹤及邏輯隔離,超過資源安全閾值後,自動熔斷異常查詢,避免單條異常查詢導致叢集異常,提高叢集的穩定性。本文介紹慢查詢隔離池的使用方法。
背景資訊
慢查詢隔離池(Slow Query Isolation Pool)功能的原理是,配置固定大小的資源隔離池(記憶體維度),當單條查詢運行時申請的記憶體大小超過設定的閾值時,將該查詢任務放到隔離池中管理。當隔離池的記憶體總量超過設定閾值時,通過可插拔的優先順序策略熔斷資源消耗最大的查詢。
注意事項
慢查詢隔離是Elasticsearch執行個體6.7.0版本且核心1.3.0版本、執行個體7.10.0版本的特性。
說明在使用慢查詢隔離功能前,6.7.0版本執行個體需要將核心版本升級至1.3.0版本,支援升級的版本包括:通用商業版0.3.0、1.0.2和1.2.0,不支援1.0.1。7.10.0版本執行個體可以直接使用該功能。
慢查詢隔離池預設為關閉(false)狀態,使用前需要手動開啟。
本文中的命令,均可在Kibana控制台上執行。登入Kibana控制台的具體操作步驟,請參見登入Kibana控制台。
使用流程
開啟慢查詢隔離功能。
PUT _cluster/settings { "persistent": { "search.isolator.enabled": true } }
說明如需關閉,將search.isolator.enabled設定為null或false即可。
配置查詢攔截閾值。當查詢請求大小或延時超過定義的閾值時,將其放入慢查詢隔離池。
PUT _cluster/settings { "persistent": { "search.isolator.trigger.task.mem_cost": "500mb", "search.isolator.trigger.task.latency": "10s" } }
參數
預設值
說明
search.isolator.trigger.task.mem_cost
100mb
查詢請求記憶體使用量閾值。當單個查詢任務使用記憶體超過閾值時,系統會將其放入慢查詢隔離池中。
search.isolator.trigger.task.latency
10s
查詢請求延遲閾值。當單個查詢任務耗時超過閾值時,系統會將其放入慢查詢隔離池中。
配置慢查詢隔離池總記憶體閾值。當慢查詢的記憶體佔用達到任一閾值,將觸發熔斷(取消隔離池中資源消耗最大的查詢請求)。
PUT _cluster/settings { "persistent": { "search.isolator.total.mem.limit": "60%", "search.isolator.total.heap.usage.limit": "75%", "search.isolator.total.tasks.limit": 1000 } }
參數
預設值
說明
search.isolator.total.mem.limit
60%
慢查詢隔離池堆記憶體佔用整個叢集的比例閾值。預設為60%,表示當佔用率達到60%時,通過可插拔的優先順序策略,熔斷隔離池中資源消耗最大的查詢。
search.isolator.total.heap.usage.limit
75%
整體堆記憶體使用量率閾值。預設為75%,表示當堆記憶體整體使用率達到75%時,通過可插拔的優先順序策略,熔斷隔離池中資源消耗最大的查詢。
search.isolator.total.tasks.limit
1000
慢查詢隔離池最多允許處理的任務數。預設為1000,表示隔離池中同時處理的查詢數超過1000時,通過可插拔的優先順序策略,熔斷隔離池中資源消耗最大的查詢。
查看慢查詢隔離池中的查詢請求列表。
GET _tasks/isolator?detailed=true
取消查詢任務。
POST _tasks/<taskId>/_cancel
<taskId>需要替換為查詢任務的ID,可在上一步的查詢請求列表中擷取。