對於時間序列資料,會隨著時間的積累越來越大,您可以通過索引生命週期管理ILM(Index Lifecycle Management)定期將資料滾動到新索引,防止因資料過大影響查詢效率和成本。隨著索引的老化和查詢頻率的降低,您可以將其轉移到價格較低的磁碟上,並減少分區和副本的數量。本文介紹通過ILM管理Heartbeat資料的方法。
背景資訊
本文使用的測試情境如下:業務情境中存在大量的heartbeat-*時序索引,並且每天單個索引大小都為4 MB左右。當資料越來越多時,shard數量也會越來越多,導致叢集負載增加。所以需要指定不同的變換策略,在hot階段變換heartbeat-*開頭的歷史監控索引,warm階段對索引進行分區收縮及段合并,cold階段將資料從hot節點遷移到warm(冷資料)節點,delete階段定期刪除索引資料。
注意事項
- 索引必須定義模板和別名後,才可以設定生命週期管理原則。
- 如果在變換索引時修改了生命週期管理原則,新策略將在下一次變換時生效。
操作流程
- 步驟一:建立並配置冷熱叢集在建立叢集時配置叢集中節點的冷熱屬性、開啟自動建立索引功能、配置公網地址訪問白名單。
- 步驟二:在Heartbeat下配置ILM在heartbeat.yml中開啟Elasticsearch的生命週期管理功能,並配置其參數。配置完成並啟動後,系統會自動在對應Elasticsearch執行個體中產生Heartbeat索引模板。
- 步驟三:建立ILM策略通過ilm policy API建立生命週期管理原則,該策略用來定義索引變換和歸檔的條件。
- 步驟四:為ILM策略關聯索引模板為上一步建立的生命週期管理原則關聯Heartbeat索引模板。
- 步驟五:為索引關聯ILM策略為第一個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控制台,在左側導覽列,單擊Dev Tools。登入Kibana控制台的具體操作請參見登入Kibana控制台。
- 在左側導覽列,單擊Dev Tools。
- 在Console中,執行如下命令,查看叢集冷熱節點屬性。
GET _cat/nodeattrs?v&h=host,attr,value
結果顯示叢集中包含3個hot節點,2個warm節點,支援冷熱架構。
- 在購買Elasticsearch執行個體時,啟用冷資料節點,即可建立冷熱叢集。
- 開啟目的地組群的自動建立索引功能。具體操作步驟請參見配置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策略
./heartbeat setup --ilm-policy
命令載入預設的策略並寫入Elasticsearch,預設策略可通過./heartbeat export ilm-policy
命令到stdout。您可以修改該預設策略,實現手動建立策略。在Kibana控制台中,執行以下命令,建立ILM策略。
PUT /_ilm/policy/hearbeat-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。關聯成功後,結果如下圖。
步驟六:查看各階段索引
您也可以使用同樣的方式,查看其他階段的索引。
常見問題
Q:如何設定ILM策略周期?
PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval":"1m"
}
}