全部產品
Search
文件中心

Elasticsearch:使用慢查詢隔離池

更新時間:Jun 30, 2024

在使用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控制台

使用流程

  1. 開啟慢查詢隔離功能。

    PUT _cluster/settings
    {
      "persistent": {   
         "search.isolator.enabled": true
       }
    }
    說明

    如需關閉,將search.isolator.enabled設定為nullfalse即可。

  2. 配置查詢攔截閾值。當查詢請求大小或延時超過定義的閾值時,將其放入慢查詢隔離池。

    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

    查詢請求延遲閾值。當單個查詢任務耗時超過閾值時,系統會將其放入慢查詢隔離池中。

  3. 配置慢查詢隔離池總記憶體閾值。當慢查詢的記憶體佔用達到任一閾值,將觸發熔斷(取消隔離池中資源消耗最大的查詢請求)。

    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時,通過可插拔的優先順序策略,熔斷隔離池中資源消耗最大的查詢。

  4. 查看慢查詢隔離池中的查詢請求列表。

    GET _tasks/isolator?detailed=true
  5. 取消查詢任務。

    POST _tasks/<taskId>/_cancel

    <taskId>需要替換為查詢任務的ID,可在上一步的查詢請求列表中擷取。