Elasticsearch7.X ILM索引生命周期管理(冷熱分離)
一、「索引生命周期管理」概述
二、為什麼要使用「索引生命周期管理」
1、ELK集群之前的索引模式,通過app_name和日期區分,隨著時間累積,索引數量逐漸增多,造成伺服器記憶體、CPU、IO等指標上漲;
2、需要創建額外定時任務執行索引刪除腳本,這種方式無法避免kafka重複消費造成的大量已刪除索引重建,並無法用腳本按日期刪除;
3、根據日誌查詢和存儲的特點,將數據冷熱分離,熱數據使用高性能磁碟提高寫入與查詢效率,溫數據只做查詢不影響數據寫入性能,冷數據用OSS等低價存儲作為歸檔節約存儲成本。
三、面臨的問題
1、ES生命周期策略要緊密貼合業務模型
2、數據冷熱節點和生命周期策略需要合理規劃
3、數據高可用性規劃(單純日誌場景對數據可用性並不高,可以規劃0副本索引,減小系統開銷)
四、配置方法及原理
1、生命周期管理的本質–RollOver
當現有索引被認為太大或太舊時,滾動索引API將別名滾動到新索引。該API接受一個別名和一個條件列表。別名必須只指向一個索引。如果索引滿足指定條件,則創建一個新索引,並將別名切換到指向新索引的位置
2、使用場景
RollOver適合存放日誌數據、索引非常大、索引實時導入數據等場景
在索引模板配置好索引的setting、mapping等參數,然後配置好_rollover規則,es會幫助你處理剩餘的事情
索引生命周期管理使用了rollover的特性,將rollover分成四個階段。
3、四個階段
ES索引生命周期管理分為4個階段:hot、warm、cold、delete,其中hot主要負責對索引進行rollover操作,warm、cold、delete分別對rollover後的數據進一步處理
描述 | |
---|---|
hot | 主要處理時序數據的實時寫入 |
warm | 可以用來查詢,但是不再寫入 |
cold | 索引不再有更新操作,並且查詢也會很少 |
delete |
4、配置方法
實現索引生命周期,必須同時存在如下要素,缺一不可,上述四個階段可以根據實際情況配置,並為ES數據節點添加相應的標籤。
配置項 | 描述 |
---|---|
節點標籤 | 配置數據節點標籤,區分熱節點、溫節點以及冷節點 |
生命周期策略 | 定義熱階段的大小、最大文檔數或最大時長,溫階段是否縮小索引、冷階段存在時長及刪除周期 |
索引模板引用生命周期策略 | 模板中指定引用的生命周期策略,按模板規則創建索引後,載入生命周期策略 |
索引模板指定調度節點 | 將新建索引分片都分配到熱節點 |
4.1、節點
熱節點
這種類型的數據節點執行集群內所有的操作,節點存儲的數據經常被查詢,屬於IO、CPU密集型操作,因而需要CPU比較空閑和裝有高性能IO讀寫的磁碟(如SSD)的伺服器支撐。
#配置方法 vim /data/app/elasticsearch/config/elasticsearch.yml #每個熱節點加入如下配置並重啟服務 node.attr.box_type: hot node.attr.rack: rack1 #這兩項配置是為節點增加標籤,具體名稱並不是寫死的,與後面模板和策略配置有關
溫節點
#配置方法 vim /data/app/elasticsearch/config/elasticsearch.yml #每個溫節點加入如下配置並重啟服務 node.attr.box_type: warm node.attr.rack: rack1
冷節點
冷節點數據適合作為歸檔使用,比溫節點查詢還要少(比如半月以上的歸檔日誌),這種類型數據一般很少查詢,並不會消耗CPU性能及IO,但是存儲容量會很大,需要更低成本的存儲,例如OSS或S3;ES可以使用經過fuse協議掛載的對象存儲作為後端存儲。
#配置方法 vim /data/app/elasticsearch/config/elasticsearch.yml #每個溫節點加入如下配置並重啟服務 node.attr.box_type: cold node.attr.rack: rack1
4.2、生命周期策略
配置方法:
1、利用Kibana新建策略並指定到模板
打開Kibana—>管理—>索引生命周期策略
創建策略
保存策略並在創建模板後添加到模板中
2、調用ESApi將策略寫入ES
curl -XPUT -H "content-type:application/json" //es_addr:9200/_ilm/policy/test_policy \ -d "{ "policy": { "phases": { "hot": { "min_age": "0ms", "actions": { "rollover": { "max_age": "1h", "max_size": "10mb", "max_docs": 50000 }, "set_priority": { "priority": 100 } } }, "warm": { "min_age": "0ms", "actions": { "allocate": { "number_of_replicas": 0, "include": {}, "exclude": {}, "require": { "box_type": "warm" } }, "shrink": { "number_of_shards": 3 }, "set_priority": { "priority": 50 } } }, "cold": { "min_age": "1h", "actions": { "freeze": {}, "allocate": { "include": {}, "exclude": {}, "require": { "box_type": "cold" } }, "set_priority": { "priority": 0 } } }, "delete": { "min_age": "2h", "actions": { "delete": {} } } } }"
4.3、索引模板
以下為索引模板配置,要有以下配置項策略才會生效,其他選項如欄位mapping等請參考官方文檔
PUT _template/my_template { "index_patterns": ["test-*"], "settings": { "number_of_shards": 5, "number_of_replicas": 0, "index.lifecycle.name": "test_policy", #指定索引生命周期策略名稱 "index.lifecycle.rollover_alias": "test-alias", #指定rollover別名(索引寫入與讀取時所用的名稱) "routing.allocation.require.box_type": "hot" #指定索引新建時所分配的節點(此項不指定會默認分配到所有節點) } }
注意:索引創建的名稱應該是以 「-00001」等可自增長的欄位結尾,否則策略不生效,es指定所以的別名寫入