全部產品
Search
文件中心

Elasticsearch:叢集磁碟使用率過高和read_only問題的排查與處理方法

更新時間:Jul 10, 2026

本文介紹當您遇到磁碟使用率超過85%,甚至達到100%,導致Elasticsearch叢集或Kibana無法正常提供服務時,採用的排查方式。

重要

免責聲明:本文檔可能包含第三方產品資訊,該資訊僅供參考。阿里雲對第三方產品的效能、可靠性以及操作可能帶來的潛在影響,不進行任何暗示或其他形式的承諾。

問題一:叢集磁碟使用率過高,並且報錯index read_only

問題描述

  • 在進行索引請求時,返回類似index read_only的報錯。例如FORBIDDEN/12/index read-only / allow delete (api)];]

  • 叢集處於Red狀態,嚴重情況下存在節點未加入叢集的情況(可通過GET _cat/nodes?查看),並且存在未分配的分區(可通過GET _cat/allocation?v查看)。

    說明

    Red狀態代表部分主分區不可用,可能已經遺失資料。

  • 通過Kibana控制台建立管道、註冊Beats時報錯:internal server error

  • 通過Elasticsearch控制台的叢集監控頁面,或者登入Kibana控制台進入監控頁面,動態查看近一段時間的叢集負載,磁碟使用率曾達到100%。

問題原因

上述問題是由於磁碟使用率過高導致的。資料節點的磁碟使用率存在以下三個水位線,超過水位線可能會影響Elasticsearch或Kibana服務:

  • 超過85%,會導致新的分區無法分配。

  • 超過90%,Elasticsearch會嘗試將對應節點中的分區遷移到其他磁碟使用率比較低的資料節點中。

  • 超過95%,系統會對Elasticsearch叢集中的每個索引強制設定read_only_allow_delete屬性,此時索引將無法寫入資料,只能讀取和刪除對應索引。磁碟使用率

除資料節點磁碟水位線外,以下情況也可能導致寫入失敗或警示,需一併排查:

  • 分區數達到上限:ES 叢集資料節點預設單節點支援 1000 個分區。當分區數超限時,會導致 Logstash 無法寫入日誌或無法建立新索引。

    執行以下命令查看當前分區數上限:

    GET /_cluster/settings?include_defaults=true&flat_settings=true

    查看返回結果中的cluster.max_shards_per_node參數值。

    臨時解決方案:執行以下命令將分區數上限調整為 2000。

    PUT /_cluster/settings
    {
      "transient": {
        "cluster": {
          "max_shards_per_node": 2000
        }
      }
    }
    說明

    PUT與路徑之間需加空格。此為臨時方案,長期建議清理到期無用索引或擴容資料節點數量。

  • 系統索引生命週期策略:若磁碟使用率頻繁波動但未配置自訂 ILM 策略,可能是由系統索引(如.monitoring-es-*.monitoring-kibana-*)的預設生命週期策略導致。這些索引每天會自動建立並刪除舊索引,屬於正常現象,無需額外處理。

  • 資源關聯影響:磁碟使用率過高可能伴隨 JVM 記憶體使用量率升高(如達 90%)及節點異常,進而導致 Kibana 無法串連。此時需同時擴容磁碟和記憶體資源。若叢集狀態不健康,升配時需開啟強制變更,且建議在業務低峰期操作以避免重啟影響業務。

解決方案

  1. 執行以下命令刪除資料。

    警告

    資料刪除後將無法恢複,請謹慎操作。您也可以選擇保留資料,但需進行磁碟擴容,詳情請參見升配叢集

    curl -u <username>:<password> -XDELETE http://<host>:<port>/<index-name>
    • <host>表示Elasticsearch執行個體的公網或私網地址,建議使用前先確認相關白名單是否開啟。

    • 執行命令後,如果叢集無法響應,建議觸發強制重啟,在重啟階段嘗試執行刪除命令。

  2. 檢測叢集索引是否依然為read_only狀態,如果是,執行以下命令,將叢集中所有索引的index.blocks.read_only_allow_delete屬性設定為null,使叢集中不再存在read_only狀態的索引。

    PUT _settings
    {  
       "index.blocks.read_only_allow_delete": null
    }
  3. 檢測叢集是否依然為Red狀態,如果是,可使用_cat/allocation?v命令查看叢集中是否存在未分配的分區。

  4. 如果存在未分配的分區,可執行GET _cluster/allocation/explain命令查看未分配分區的原因。如果原因如下圖,請手動執行POST /_cluster/reroute?retry_failed=true命令。未分配分區的原因

  5. 等待分區下發完成後,查看叢集狀態。如果叢集狀態依然為Red,請聯絡阿里雲支援人員工程師解決。

問題二:磁碟

常見問題

為什麼 Elasticsearch 控制台顯示叢集狀態正常,但仍收到磁碟使用率警示?

控制台顯示的叢集狀態(Green/Yellow/Red)反映叢集的可用性和分區健康情況,與磁碟使用率屬於不同維度指標。叢集狀態正常僅表示當前所有分區已正常分配、叢集可以提供服務,但磁碟使用率可能已達到警示閾值(如 91%)。

高磁碟使用率雖未立即觸發 read_only 模式,但已接近危險水位(95% 將強制唯讀),隨時可能導致寫入業務中斷。建議立即採取以下措施:

  1. 通過阿里雲 Elasticsearch 控制台的叢集監控頁面核實具體磁碟使用率數值。

  2. 及時擴容磁碟或清理無用索引以消除隱患。

更多資訊

為避免磁碟使用率過高影響Elasticsearch服務,建議開啟磁碟使用率監控警示,及時查收警示簡訊,提前做好防禦措施,詳情請參見配置叢集警示