本文介紹在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來變換索引。 |
warm | warm階段。索引不再寫入,主要用來提供查詢。 |
cold | 冷資料階段。索引不再更新,查詢很少,查詢速度會變慢。 |
delete | 刪除資料階段。索引將被刪除。 |
- 為索引模板添加生命週期管理原則:將策略應用到整個別名覆蓋的索引下,本文以此為例。
- 為單個索引添加生命週期管理原則:只能覆蓋當前索引,新滾動的索引不再受策略影響。
- 將索引資料即時寫入Elasticsearch。當索引資料增加到一定量時,資料自動寫入新索引。
- 舊索引在hot階段停留30分鐘,進入warm階段。
- warm階段完成Merge及Shrink操作後,索引等待1小時(從變換時算起),進入cold階段。
- cold階段將熱節點資料移轉到冷節點,實現冷熱資料分離後,索引會在2個小時(從變換時算起)後被刪除。
注意事項
- Elasticsearch索引生命週期策略需密切貼近業務模型。例如,對多個不同結構的索引進行生命週期管理,建議各個索引配置獨立的別名和生命週期策略,以便於管理。
- 使用rollover滾動索引,初始索引應以自增數字結尾(-000001),否則策略不生效,長度要求為6。例如,定義初始索引為myindex-000001,則rollover後的索引是myindex-000002,以此類推進行遞增。如果叢集中索引名不符合規範,建議進行索引重建。
- hot階段主要處理資料寫入。業務中需保證資料是按照時間順序寫入的,處於warm和cold階段的索引不建議進行資料寫入。例如,在warm階段配置actions為shrink或read only,那麼索引進入warm階段後將處於唯讀狀態,資料無法寫入。
操作流程
- 步驟一:建立冷熱叢集並查看節點的冷熱屬性在建立叢集時設定節點的冷熱屬性。
- 步驟二:為索引配置生命週期管理原則定義ILM策略,並將該策略應用到別名覆蓋的所有索引下。
- 步驟三:驗證資料分布驗證cold階段索引的shard是否分布在冷資料節點上。
- 步驟四:更新ILM策略更新已有策略。
- 步驟五:切換ILM策略在不同策略間實現滾動切換。
步驟一:建立冷熱叢集並查看節點的冷熱屬性
節點類型 | 儲存資料要求 | 讀寫效能要求 | 規格要求 | 儲存要求 |
熱節點(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控制台。
- 在Console中,執行如下命令,查看叢集冷熱節點屬性。
GET _cat/nodeattrs?v&h=host,attr,value
結果顯示叢集中包含3個hot節點,2個warm節點,支援冷熱架構。
步驟二:為索引配置生命週期管理原則
- 在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方式,可指定最小單位為秒。
- 建立索引模板。在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別名。 - 基於序號建立初始索引。
PUT gamestabes-000001 { "aliases": { "gamestabes":{ "is_write_index": true } } }
您也可以基於時間建立索引,詳情請參見using date math。
- 通過別名寫入資料。當資料達到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參數,修改檢測周期。 - 根據生命週期階段過濾索引,並查看索引詳細配置。
- 在左側導覽列,單擊Management。
- 在Elasticsearch地區中,單擊Index Management。
- 在Index management中,單擊Lifecycle status右側的Lifecycle phase,從下拉式清單中選擇生命週期階段進行過濾。
- 單擊過濾後的索引,查看索引詳細資料。
步驟三:驗證資料分布
- 查詢進入cold階段的索引,並查看其配置資訊。
- 查詢處於cold階段索引的shard分布。
GET _cat/shards?shrink-gamestables-000012
返回結果如下。根據返回結果可知,cold階段的索引資料主要分布在冷資料節點上。
步驟四:更新ILM策略
- 更新正在啟動並執行ILM策略。
- 查看更新後的策略版本。
- 在左側導覽列,單擊Management。
- 在Elasticsearch地區中,單擊Index Lifecycle Policies。
- 在Index lifecycle policies中,查看更新後的策略版本。更新後策略的版本號碼增加1,此時正在滾動寫入的索引依舊使用舊策略,新策略將在下次變換時生效。
步驟五:切換ILM策略
- 建立新策略。
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": {} } } } } }
- 為模板綁定新策略。
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策略周期?
請謹慎修改該參數值,避免時間間隔太短給節點增加不必要的負載,本測試中將其改成了1m。
PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval":"1m"
}
}