全部產品
Search
文件中心

Elasticsearch:通過索引生命週期管理Heartbeat資料

更新時間:Mar 26, 2026

Heartbeat產生的時序監控資料會隨時間持續增長,導致shard數量增多和叢集負載加重。通過索引生命週期管理ILM(Index Lifecycle Management),可以對heartbeat-*索引制定變換策略:在hot階段變換索引,在warm階段收縮分區併合並段,在cold階段將資料移轉到冷資料節點,在delete階段定期刪除到期資料。

操作流程

  1. 步驟一:建立並配置冷熱叢集

    建立包含冷、熱屬性節點的叢集,啟用自動建立索引功能,並配置公網地址訪問白名單。

  2. 步驟二:在Heartbeat下配置ILM

    在heartbeat.yml中啟用ILM功能並配置參數,啟動後系統自動在Elasticsearch中產生Heartbeat索引模板。

  3. 步驟三:建立ILM策略

    通過ilm policy API建立生命週期管理原則,定義索引變換和歸檔的條件。

  4. 步驟四:為ILM策略關聯索引模板

    將ILM策略關聯到Heartbeat索引模板。

  5. 步驟五:為索引關聯ILM策略

    為第一個Heartbeat索引關聯ILM策略,使策略應用到索引模板覆蓋的所有索引。

  6. 步驟六:查看各階段索引

    查看歸檔在各階段(hot、warm、cold、delete)的索引。

步驟一:建立並配置冷熱叢集

  1. 建立冷熱叢集並查看節點的冷熱屬性。冷熱叢集包含冷、熱兩種屬性的節點,兩者區別如下:

    節點類型

    儲存資料要求

    讀寫效能要求

    規格要求

    儲存要求

    熱節點(hot)

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

    高,例如32核64 GB

    建議使用SSD雲端硬碟。

    冷節點(warm)

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

    低,例如8核32 GB

    建議使用高效雲端硬碟,或使用OpenStore實現海量冷資料Serverless儲存。

    Elasticsearch中,冷資料節點的box_type值為warm(非cold),這是因為冷資料節點在Elasticsearch原生架構中對應warm tier。
    1. 建立Elasticsearch執行個體時,啟用冷資料節點,即可建立冷熱叢集。

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

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

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

      只有啟用冷資料節點後,資料節點才會變成熱節點。
    2. 登入該叢集的Kibana控制台,具體操作請參見通過Kibana串連叢集

    3. 在左側導覽列,單擊Dev Tools

    4. Console 中,執行如下命令,查看叢集冷熱節點屬性。

      GET _cat/nodeattrs?v&h=host,attr,value

      返回結果中包含hot和warm節點,表示叢集已支援冷熱架構。

  2. 開啟目的地組群的自動建立索引功能,具體操作步驟請參見通過配置YML參數開啟自動建立索引

  3. 配置叢集的公網地址訪問白名單,將安裝Heartbeat伺服器的IP地址添加到白名單中,具體操作步驟請參見設定IP白名單

步驟二:在Heartbeat下配置ILM

詳細的ILM配置說明請參見Set up index lifecycle management

  1. 下載Heartbeat安裝包,並解壓縮。

  2. 編輯heartbeat.yml,分別定義heartbeat.monitors、setup.template.settings、setup.kibana和output.elasticsearch。

    配置樣本如下。

    heartbeat.monitors:
    - type: icmp
      schedule: '*/5 * * * * * *'
      hosts: ["47.111.xx.xx"]
    
    setup.template.settings:
      index.number_of_shards: 3
      index.codec: best_compression
      index.routing.allocation.require.box_type: "hot"
    
    setup.template.overwrite: true
    
    setup.kibana:
      host: "https://es-cn-4591jumei00xxxxxx.kibana.elasticsearch.aliyuncs.com:5601"
    
    output.elasticsearch:
      hosts: ["es-cn-4591jumei00xxxxxx.elasticsearch.aliyuncs.com:9200"]
      ilm.enabled: true
      ilm.rollover_alias: "heartbeat"
      ilm.pattern: "{now/d}-000001"
      username: "elastic"
      password: "<your_password>"

    部分參數說明如下,更多參數說明請參見Heartbeat配置文檔

    參數

    說明

    index.number_of_shards

    設定主分區數,預設是1。

    index.routing.allocation.require.box_type

    設定將索引資料寫入hot節點。

    setup.template.overwrite

    設定是否覆蓋原索引模板。如果已將此版本的索引模板載入到Elasticsearch中,必須設定為true以覆蓋原模板。該參數為頂級配置項,與setup.template.settings同級。

    host

    替換為Kibana服務的公網訪問地址,可在Kibana的配置頁面擷取。

    hosts

    替換為Elasticsearch叢集的公網或私網訪問地址,可在叢集的基本資料頁面擷取,詳細資料請參見查看執行個體基本資料。如果設定為公網地址,需要配置叢集的公網地址訪問白名單,具體操作請參見設定IP白名單;如果設定為私網地址,需要確保叢集與安裝Heartbeat的伺服器在同一專用網路下。

    ilm.enabled

    設定為true,表示啟用索引生命週期管理ILM。

    ilm.rollover_alias

    設定變換索引時產生的索引別名,預設是heartbeat-\{beat.version\}。

    ilm.pattern

    設定變換索引時產生的索引模式。支援date math,預設是{now/d}-000001。當觸發索引變換條件後,新的索引名稱會在最後一位元字上加1。例如第一次變換產生的索引名稱是heartbeat-2020.04.29-000001,觸發滾動後新索引名稱為heartbeat-2020.04.29-000002。

    username

    使用者名稱預設為elastic。

    password

    elastic使用者的密碼在建立執行個體時設定,如果忘記可重設。重設密碼的操作步驟請參見重設執行個體訪問密碼

    重要

    如果在載入索引模板後修改ilm.rollover_alias或ilm.pattern,則必須設定setup.template.overwrite為true,重寫索引模板。

  3. 啟動Heartbeat服務。

    sudo ./heartbeat -e

步驟三:建立ILM策略

Elasticsearch支援通過API和Kibana控制台兩種方式建立ILM策略。以下以API方式為例,建立heartbeat-policy策略。

Heartbeat支援通過./heartbeat setup --ilm-policy命令載入預設的策略並寫入Elasticsearch,預設策略可通過./heartbeat export ilm-policy命令匯出。可以修改該預設策略,實現手動建立策略。

在Kibana控制台中,執行以下命令,建立ILM策略。

PUT /_ilm/policy/heartbeat-policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "5mb",
            "max_age": "1d",
            "max_docs": 100
          }
        }
      },
      "warm": {
        "min_age": "60s",
        "actions": {
          "forcemerge": {
                "max_num_segments":1
              },
          "shrink": {
                "number_of_shards":1
              }
        }
      },
      "cold": {
        "min_age": "3m",
        "actions": {
          "allocate": {
            "require": {
              "box_type": "warm"
            }
          }
        }
      },
      "delete": {
        "min_age": "1h",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

參數

說明

hot

索引滿足任一條件(資料達到5 MB、使用超過1天、文檔數超過100)時觸發變換。舊索引在變換後等待60秒進入warm階段。rollover支援max_docs、max_size、max_age三種條件,滿足任一即觸發。

warm

將索引收縮到1個分區,強制合并為1個段。完成後,索引在3分鐘(從變換時算起)後進入cold階段。

cold

將索引從hot節點遷移到warm(冷資料)節點。完成後,索引在1小時後進入delete階段。

delete

索引被刪除。

策略名稱建立後無法更改。通過Kibana控制台也可以建立策略,但Kibana上max_age最小單位為小時,API方式最小單位為秒。

步驟四:為ILM策略關聯索引模板

啟動Heartbeat後,系統會自動在Elasticsearch中建立Heartbeat索引模板。將步驟三:建立ILM策略中建立的heartbeat-policy策略關聯該索引模板。

  1. 登入目標Elasticsearch執行個體的Kibana控制台,具體步驟請參見通過Kibana串連叢集

  2. 在左側導覽列,單擊 Management

  3. Elasticsearch 地區,單擊 Index Lifecycle Policies

  4. Index lifecycle policies 列表中,找到heartbeat-policy策略,單擊該策略行對應的 Actions > Add policy to index template

  5. 在彈出的對話方塊中,從 Index template 列表中選擇索引模板,並在 Alias for rollover index 文字框中輸入索引別名。

  6. 單擊 Add policy

步驟五:為索引關聯ILM策略

啟動Heartbeat後,系統會自動在Elasticsearch中建立索引。為第一個索引關聯ILM策略,該策略已在步驟四:為ILM策略關聯索引模板中關聯了索引模板。

  1. Management 頁面的 Elasticsearch 地區中,單擊 Index Management

  2. Index management列表中,找到目標索引,單擊索引名稱。

  3. Summary 頁面,選擇 Manage > Remove lifecycle policy ,移除Heartbeat內建的預設策略。

  4. 在彈出的對話方塊中,單擊 Remove policy

  5. 再選擇 Manage > Add lifecycle policy

  6. 在彈出的對話方塊中,從 Lifecycle policy 列表中選擇步驟三:建立ILM策略中建立的heartbeat-policy策略,並在 Index rollover alias 輸入框中輸入步驟四:為ILM策略關聯索引模板中定義的索引別名,單擊 Add policy

步驟六:查看各階段索引

Index management 頁面,單擊 Lifecycle phase 下拉式清單,選擇生命週期階段(如Hot、Warm、Cold)過濾查看對應階段的索引。

常見問題

如何調整ILM策略檢查頻率?

ILM預設每10分鐘檢查一次符合策略的索引,在此期間資料量可能超出設定閾值。例如在步驟三:建立ILM策略中設定max_docs為100,實際文檔數可能在超過100後才觸發變換。

通過修改indices.lifecycle.poll_interval參數可控制檢查頻率:

重要

檢查頻率過高會增加節點負載,建議根據業務需求謹慎設定。

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