全部產品
Search
文件中心

Elasticsearch:通過索引生命週期管理實現冷熱資料分離

更新時間:Jun 30, 2024

本文介紹在Elasticsearch叢集上,通過生命週期管理ILM(Index Lifecycle Management)功能,實現冷熱資料分離的實踐流程。通過本實踐,您既可以實現在保證叢集讀寫效能的基礎上,自動維護叢集上的冷熱資料,又能通過最佳化叢集架構,降低企業生產成本。

背景資訊

當今巨量資料時代,資料時刻在更新變化。尤其是隨著時間的積累,儲存在Elasticsearch中的資料會越來越多,當資料達到一定量時,必然會造成服務的記憶體、CPU、IO等指標上漲,影響Elasticsearch的全文檢索索引能力。為此Elasticsearch 6.6.0及以上版本提供了索引生命週期管理ILM功能,將索引生命週期分為4個階段:hot、warm、cold、delete。其中hot階段主要負責對索引進行變換操作,warm、cold、delete階段主要負責進一步處理索引資料,詳細說明如下。
階段描述
hot熱資料階段。主要處理時序資料的即時寫入,可根據索引的文檔數、大小、時間長度決定是否調用rollover API來變換索引。
warmwarm階段。索引不再寫入,主要用來提供查詢。
cold冷資料階段。索引不再更新,查詢很少,查詢速度會變慢。
delete刪除資料階段。索引將被刪除。
您可以通過兩種方式為索引添加生命週期管理原則:
  • 為索引模板添加生命週期管理原則:將策略應用到整個別名覆蓋的索引下,本文以此為例。
  • 為單個索引添加生命週期管理原則:只能覆蓋當前索引,新滾動的索引不再受策略影響。
在時序和冷熱資料情境上應用ILM,可以大幅度節約儲存成本。本文以冷熱資料情境為例,介紹如何使用ILM功能。配置情境如下:
  1. 將索引資料即時寫入Elasticsearch。當索引資料增加到一定量時,資料自動寫入新索引。
  2. 舊索引在hot階段停留30分鐘,進入warm階段。
  3. warm階段完成Merge及Shrink操作後,索引等待1小時(從變換時算起),進入cold階段。
  4. cold階段將熱節點資料移轉到冷節點,實現冷熱資料分離後,索引會在2個小時(從變換時算起)後被刪除。

注意事項

  • Elasticsearch索引生命週期策略需密切貼近業務模型。例如,對多個不同結構的索引進行生命週期管理,建議各個索引配置獨立的別名和生命週期策略,以便於管理。
  • 使用rollover滾動索引,初始索引應以自增數字結尾(-000001),否則策略不生效,長度要求為6。例如,定義初始索引為myindex-000001,則rollover後的索引是myindex-000002,以此類推進行遞增。如果叢集中索引名不符合規範,建議進行索引重建。
  • hot階段主要處理資料寫入。業務中需保證資料是按照時間順序寫入的,處於warm和cold階段的索引不建議進行資料寫入。例如,在warm階段配置actionsshrinkread only,那麼索引進入warm階段後將處於唯讀狀態,資料無法寫入。

操作流程

  1. 步驟一:建立冷熱叢集並查看節點的冷熱屬性
    在建立叢集時設定節點的冷熱屬性。
  2. 步驟二:為索引配置生命週期管理原則
    定義ILM策略,並將該策略應用到別名覆蓋的所有索引下。
  3. 步驟三:驗證資料分布
    驗證cold階段索引的shard是否分布在冷資料節點上。
  4. 步驟四:更新ILM策略
    更新已有策略。
  5. 步驟五:切換ILM策略
    在不同策略間實現滾動切換。

步驟一:建立冷熱叢集並查看節點的冷熱屬性

冷熱叢集是指在叢集中包含冷、熱兩種屬性的節點,可以提高Elasticsearch的處理效能和服務穩定性。兩者區別如下。

節點類型

儲存資料要求

讀寫效能要求

規格要求

儲存要求

熱節點(hot)

近期資料,例如最近2天的日誌資料。

高,例如32核64 GB

建議使用SSD雲端硬碟儲存資料,儲存空間大小需根據資料大小進行設定。

冷節點(warm)

歷史資料,例如2天之前的日誌資料。

低,例如8核32 GB

建議使用高效雲端硬碟儲存資料,儲存空間大小需根據資料大小進行設定。

  1. 購買Elasticsearch執行個體時,啟用冷資料節點,即可建立冷熱叢集。

    當您啟用了冷資料節點併購買後,系統會在節點啟動參數中加入-Enode.attr.box_type參數。

    • 熱資料節點:-Enode.attr.box_type=hot

    • 冷資料節點:-Enode.attr.box_type=warm

    說明
    • 購買執行個體時,只有當啟用了冷資料節點後,資料節點才會變成熱節點。

    • 本文以Elasticsearch 6.7.0版本為例,所涉及的操作及圖片僅適用於該版本,其他版本以實際介面為準。

  2. 登入該叢集的Kibana控制台,在左側導覽列,單擊Dev Tools

    登入Kibana控制台的具體操作請參見登入Kibana控制台

  3. Console中,執行如下命令,查看叢集冷熱節點屬性。
    GET _cat/nodeattrs?v&h=host,attr,value

    結果顯示叢集中包含3個hot節點,2個warm節點,支援冷熱架構。冷熱架構叢集

步驟二:為索引配置生命週期管理原則

  1. 在Kibana控制台中,執行如下命令,通過API方式定義ILM策略。
    PUT /_ilm/policy/game-policy
    {
      "policy": {
        "phases": {
          "hot": {
            "actions": {
              "rollover": {
                "max_size": "1GB",
                "max_age": "1d",
                "max_docs": 1000
              }
            }
          },
          "warm": {
            "min_age": "30m",
            "actions": {
              "forcemerge": {
                    "max_num_segments":1
                  },
              "shrink": {
                    "number_of_shards":1
                  }
            }
          },
          "cold": {
            "min_age": "1h",
            "actions": {
              "allocate": {
                "require": {
                  "box_type": "warm"
                }
              }
            }
          },
          "delete": {
            "min_age": "2h",
            "actions": {
              "delete": {}
            }
          }
        }
      }
    }
    參數說明
    hot該原則設定索引只要滿足其中任一條件:資料寫入達到1 GB、使用超過1天、doc數超過1000,就會觸發索引變換。此時系統將建立一個新索引,該索引將重新啟動策略,而舊索引將在變換後等待30分鐘進入warm階段。
    重要

    目前Elasticsearch支援在rollover中配置三種歸檔策略:max_docs、max_size、max_age,滿足其中任何一個條件都會觸發索引歸檔操作。

    warm索引進入warm階段後,ILM會將索引收縮到1個分區,強制合并為1個段。完成該操作後,索引將在1小時(從變換時算起)後進入cold階段。
    cold索引進入cold階段後,ILM將索引從hot節點移動到warm(冷資料)節點。完成操作後,索引將在2小時後進入delete階段。
    delete索引進入delete階段後被刪除。
    說明
    • 策略名稱建立後將無法更改。

    • 您也可以在Kibana控制台上建立策略,但是Kibana上指定的max_age最小單位為小時,而通過API方式,可指定最小單位為秒。

  2. 建立索引模板。
    settings中指定冷熱屬性,資料寫入後儲存在hot節點上。
    PUT _template/gamestabes_template
    {
      "index_patterns" : ["gamestabes-*"],
      "settings": {
        "index.number_of_shards": 5,
        "index.number_of_replicas": 1,
        "index.routing.allocation.require.box_type":"hot",
        "index.lifecycle.name": "game-policy", 
        "index.lifecycle.rollover_alias": "gamestabes"
      }
    }
    參數說明
    index.routing.allocation.require.box_type指定索引建立時所分配的節點。
    index.lifecycle.name指定生命週期策略名稱稱。
    index.lifecycle.rollover_alias指定rollover別名。
  3. 基於序號建立初始索引。
    PUT gamestabes-000001
    {
    "aliases": {
        "gamestabes":{
           "is_write_index": true
            }
          }
    }

    您也可以基於時間建立索引,詳情請參見using date math

  4. 通過別名寫入資料。
    當資料達到rollover條件,並觸發ILM檢測周期後,索引將進行變換。
    PUT gamestabes/_doc/1
    {
        "EU_Sales" : 3.58,
        "Genre" : "Platform",
        "Global_Sales" : 40.24,
        "JP_Sales" : 6.81,
        "Name" : "Super Mario Bros.",
        "Other_Sales" : 0.77,
        "Platform" : "NES",
        "Publisher" : "Nintendo",
        "Year_of_Release" : "1985",
        "na_Sales" : 29.08
    }
    說明 ILM預設10分鐘檢測一次符合策略標準的索引,當達到rollover條件後,索引將滾動到下一階段,同時配置indices.lifecycle.poll_interval參數,修改檢測周期
  5. 根據生命週期階段過濾索引,並查看索引詳細配置。
    1. 在左側導覽列,單擊Management
    2. Elasticsearch地區中,單擊Index Management
    3. Index management中,單擊Lifecycle status右側的Lifecycle phase,從下拉式清單中選擇生命週期階段進行過濾。
      根據生命週期過濾索引
    4. 單擊過濾後的索引,查看索引詳細資料。
      查看索引詳細資料

步驟三:驗證資料分布

  1. 查詢進入cold階段的索引,並查看其配置資訊。
    查詢進入cold階段的索引
  2. 查詢處於cold階段索引的shard分布。
    GET _cat/shards?shrink-gamestables-000012
    返回結果如下。根據返回結果可知,cold階段的索引資料主要分布在冷資料節點上。返回結果

步驟四:更新ILM策略

  1. 更新正在啟動並執行ILM策略。
    更新ILM策略
  2. 查看更新後的策略版本。
    1. 在左側導覽列,單擊Management
    2. Elasticsearch地區中,單擊Index Lifecycle Policies
    3. Index lifecycle policies中,查看更新後的策略版本。
      更新後策略的版本號碼增加1,此時正在滾動寫入的索引依舊使用舊策略,新策略將在下次變換時生效。查看更新後的ILM策略版本

步驟五:切換ILM策略

  1. 建立新策略。
    PUT /_ilm/policy/game-new
    {
      "policy": {
        "phases": {
          "hot": {
            "actions": {
              "rollover": {
                "max_size": "3GB",
                "max_age": "1d",
                "max_docs": 1000
              }
            }
          },
          "warm": {
            "min_age": "30m",
            "actions": {
              "forcemerge": {
                    "max_num_segments":1
                  },
              "shrink": {
                    "number_of_shards":1
                  }
            }
          },
          "cold": {
            "min_age": "1h",
            "actions": {
              "allocate": {
                "require": {
                  "box_type": "warm"
                }
              }
            }
          },
          "delete": {
            "min_age": "2h",
            "actions": {
              "delete": {}
            }
          }
        }
      }
    }
  2. 為模板綁定新策略。
    PUT _template/gamestabes_template
    {
      "index_patterns" : ["gamestabes-*"],
      "settings": {
        "index.number_of_shards": 5,
        "index.number_of_replicas": 1,
        "index.routing.allocation.require.box_type":"hot",
        "index.lifecycle.name": "game-new", 
        "index.lifecycle.rollover_alias": "gamestabes"
      }
    }
    重要
    • 切換策略後,新策略不會立即生效。當前正在滾動寫入的索引依舊使用舊策略,直到當前索引rollover產生新索引,新策略才會生效。
    • 應用舊策略建立的索引,依舊綁定舊策略。如果您需要為這些索引綁定新策略,可執行PUT gamestabes-*/_settings命令,詳情請參見switching policies for an index

常見問題

Q:如何設定ILM策略周期?

A:由於索引生命週期策略預設是10分鐘檢查一次符合策略的索引,因此在這10分鐘內索引中的資料可能會超出指定的閾值。例如在步驟二:為索引配置生命週期管理原則時,設定max_docs為1000,但doc數量在超過1000後才觸發索引變換,此時可通過修改indices.lifecycle.poll_interval參數來控制檢查頻率,使索引在閾值範圍內變換。
重要

請謹慎修改該參數值,避免時間間隔太短給節點增加不必要的負載,本測試中將其改成了1m

PUT _cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval":"1m"
  }
}