對於時間序列資料,隨著時間的積累,資料量會越來越大,您可以通過索引生命週期管理ILM(Index Lifecycle Management)定期將資料滾動到新索引,防止因資料過大影響查詢效率和成本。隨著索引的老化和查詢頻率的降低,您可以將其轉移到價格較低的磁碟上,並減少分區和副本的數量。本文介紹通過ILM管理Heartbeat資料的方法。
背景資訊
本文使用的測試情境如下:
在業務情境中,存在大量的heartbeat-*時序索引,每個索引的大小約為4 MB。隨著資料量的不斷增加,shard的數量也將隨之增多,進而導致叢集負載加重。因此,有必要制定不同的變換策略。在hot階段,對heartbeat-*開頭的歷史監控索引進行變換;在warm階段,對索引實施分區收縮及段合并;在cold階段,將資料從hot節點遷移至warm節點(處理冷資料);在delete階段,定期刪除索引資料。
注意事項
索引必須定義模板和別名之後,才可以設定生命週期管理原則。
如果在變換索引時修改了生命週期管理原則,新策略將在下一次變換時生效。
操作流程
在建立叢集時,應配置叢集中節點的冷熱屬性、啟用自動建立索引功能,並設定公網地址訪問白名單。
在heartbeat.yml中開啟Elasticsearch的生命週期管理功能,並配置其參數。配置完成並啟動後,系統會自動在對應Elasticsearch執行個體中產生Heartbeat索引模板。
通過ilm policy API建立生命週期管理原則,該策略用來定義索引變換和歸檔的條件。
為上一步建立的生命週期管理原則關聯Heartbeat索引模板。
為第一個Heartbeat索引關聯生命週期管理原則,以便將該策略應用到整個Heartbeat索引模板覆蓋的索引下。
查看歸檔在各階段(hot、warm、cold、delete)的索引。
步驟一:建立並配置冷熱叢集
建立冷熱叢集並查看叢集的冷熱節點屬性。
冷熱叢集是指在叢集中包含冷、熱兩種屬性的節點,可以提高Elasticsearch的處理效能和服務穩定性。兩者區別如下。
節點類型
儲存資料要求
讀寫效能要求
規格要求
儲存要求
熱節點(hot)
近期資料,例如最近2天的日誌資料。
高
高,例如32核64 GB
建議使用SSD雲端硬碟儲存資料,儲存空間大小需根據資料大小進行設定。
冷節點(warm)
歷史資料,例如2天之前的日誌資料。
低
低,例如8核32 GB
建議使用高效雲端硬碟儲存資料,儲存空間大小需根據資料大小進行設定。
在購買Elasticsearch執行個體時,啟用冷資料節點,即可建立冷熱叢集。
當您啟用了冷資料節點併購買後,系統會在節點啟動參數中加入-Enode.attr.box_type參數。
熱資料節點:-Enode.attr.box_type=hot
冷資料節點:-Enode.attr.box_type=warm
說明購買執行個體時,只有當啟用了冷資料節點後,資料節點才會變成熱節點。
本文以Elasticsearch 6.7.0版本為例,所涉及的操作及圖片僅適用於該版本,其他版本以實際介面為準。
登入該叢集的Kibana控制台。
登入Kibana控制台的具體操作請參見登入Kibana控制台。
在左側導覽列,單擊Dev Tools。
在Console中,執行如下命令,查看叢集冷熱節點屬性。
GET _cat/nodeattrs?v&h=host,attr,value結果顯示叢集中包含3個hot節點,2個warm節點,支援冷熱架構。

開啟目的地組群的自動建立索引功能。
具體操作步驟請參見配置YML參數。
配置叢集的公網地址訪問白名單,將安裝Heartbeat伺服器的IP地址添加到白名單中。
具體操作步驟請參見配置執行個體公網或私網訪問白名單。
步驟二:在Heartbeat下配置ILM
為了使Heartbeat與Elasticsearch的ILM無縫銜接,可在heartbeat.yml配置中定義Elasticsearch的ILM,詳細配置請參見Set up index lifecycle management。
下載Heartbeat安裝包,並解壓縮。
編輯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.kibana: # Kibana Host # Scheme and port can be left out and will be set to the default (http and 5601) # In case you specify and additional path, the scheme is required: http://localhost:5601/path # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601 host: "https://es-cn-4591jumei00xxxxxx.kibana.elasticsearch.aliyuncs.com:5601" output.elasticsearch: # Array of hosts to connect to. hosts: ["es-cn-4591jumei00xxxxxx.elasticsearch.aliyuncs.com:9200"] ilm.enabled: true setup.template.overwrite: true ilm.rollover_alias: "heartbeat" ilm.pattern: "{now/d}-000001" # Enabled ilm (beta) to use index lifecycle management instead daily indices. #ilm.enabled: false # Optional protocol and basic auth credentials. #protocol: "https" username: "elastic" password: "<your_password>"部分參數說明如下,更多參數說明請參見官方Heartbeat配置文檔。
參數
說明
index.number_of_shards
設定主分區數,預設是1。
index.routing.allocation.require.box_type
設定將索引資料寫入hot節點。
host
需要替換為您Kibana服務的公網訪問地址,可在Kibana的配置頁面擷取。
hosts
需要替換為您Elasticsearch叢集的公網或私網訪問地址,可在叢集的基本資料頁面擷取,詳細資料請參見查看執行個體的基本資料。
說明如果設定為公網地址,需要配置叢集的公網地址訪問白名單,具體操作請參見配置執行個體公網或私網訪問白名單;如果設定為私網地址,需要確保叢集與安裝Heartbeat的伺服器在同一專用網路下。
ilm.enabled
設定為true,表示啟用索引生命週期管理ILM。
setup.template.overwrite
設定是否覆蓋原索引模板。如果您已經將此版本的索引模板載入到Elasticsearch中,則必須將該參數設定為true,使用此版本的索引模板覆蓋原索引模板。
ilm.rollover_alias
設定變換索引時,產生的索引的別名,預設是heartbeat-\{beat.version\}。
ilm.pattern
設定變換索引時,產生的索引的模式。支援date math,預設是{now/d}-000001。當觸發索引變換條件後,新的索引名稱會在最後一位元字上加1。
例如第一次變換產生的索引名稱是heartbeat-2020.04.29-000001,當滿足索引變換條件後觸發滾動,Elasticsearch會建立新的索引,名稱為heartbeat-2020.04.29-000002。
username
使用者名稱預設為elastic。
password
elastic使用者的密碼在建立執行個體時設定,如果忘記可重設。重設密碼的注意事項和操作步驟,請參見重設執行個體訪問密碼。
重要如果在載入索引模板後修改ilm.rollover_alias或ilm.pattern,則必須設定setup.template.overwrite為true,重寫索引模板。
啟動Heartbeat服務。
sudo ./heartbeat -e
步驟三:建立ILM策略
Elasticsearch支援通過API和Kibana控制台兩種方式建立ILM策略。以下樣本以API方式為例,介紹通過ilm policy API建立heartbeat-policy策略。
Heartbeat支援通過./heartbeat setup --ilm-policy命令載入預設的策略並寫入Elasticsearch,預設策略可通過./heartbeat export ilm-policy命令到stdout。您可以修改該預設策略,實現手動建立策略。
在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天、doc數超過100,就會觸發索引變換。此時系統將建立一個新索引,該索引將重新啟動策略,而舊索引將在變換後等待60秒進入warm階段。 重要 目前Elasticsearch支援在rollover中配置三種歸檔策略:max_docs、max_size、max_age,滿足其中任何一個條件都會觸發索引歸檔操作。 |
warm | 索引進入warm階段後,ILM會將索引收縮到1個分區,強制合并為1個段。完成該操作後,索引將在3分鐘(從變換時算起)後進入cold階段。 |
cold | 索引進入cold階段後,ILM將索引從hot節點移動到warm(冷資料)節點。完成操作後,索引將在1小時後進入delete階段。 |
delete | 索引進入delete階段後被刪除。 |
策略名稱建立後將無法更改。
您也可以在Kibana控制台上建立策略,但是Kibana上指定的max_age最小單位為小時,而通過API方式,可指定最小單位為秒。
步驟四:為ILM策略關聯索引模板
啟動Heartbeat後,系統會自動在對應的Elasticsearch中建立Heartbeat索引模板。您需要為步驟三:建立ILM策略中建立的自訂ILM策略關聯該索引模板。
登入目標Elasticsearch執行個體的Kibana控制台。
具體步驟請參見登入Kibana控制台。
在左側導覽列,單擊Management。
在Elasticsearch地區,單擊Index Lifecycle Policies。
在Index lifecycle policies列表中,選擇。

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

單擊Add policy。
步驟五:為索引關聯ILM策略
啟動Heartbeat後,系統會自動在對應的Elasticsearch中建立索引。您需要為第一個索引關聯對應的ILM策略,該ILM策略已經關聯了索引模板(步驟四:為ILM策略關聯索引模板)。
在Management頁面的Elasticsearch地區中,單擊Index Management。
在Index management列表中,找到目標索引,單擊索引名稱。
在Summary頁面,選擇,移除Heartbeat內建的預設策略。

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

關聯成功後,結果如下圖。

步驟六:查看各階段索引
查看hot階段的索引:在Index management頁面,選擇。
您也可以使用同樣的方式,查看其他階段的索引。
常見問題
Q:如何設定ILM策略周期?
A:由於索引生命週期策略預設是10分鐘檢查一次符合策略的索引,因此在這10分鐘內索引中的資料可能會超出指定的閾值。例如在步驟三:建立ILM策略時,設定max_docs為100,但doc數量在超過100後才觸發索引變換,此時可通過修改indices.lifecycle.poll_interval參數來控制檢查頻率,使索引在閾值範圍內變換。
請謹慎修改該參數值,避免時間間隔太短給節點增加不必要的負載,本測試中將其改成了1m。
PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval":"1m"
}
}