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)的伺服器支撐。
1 2 3 4 5 6 7 |
#配置方法
vim /data/app/elasticsearch/config/elasticsearch .yml
#每個熱節點加入如下配置並重啟服務
node.attr.box_type: hot
node.attr.rack: rack1
#這兩項配置是為節點增加標籤,具體名稱並不是寫死的,與後面模板和策略配置有關
|
溫節點
1 2 3 4 5 6 |
#配置方法
vim /data/app/elasticsearch/config/elasticsearch .yml
#每個溫節點加入如下配置並重啟服務
node.attr.box_type: warm
node.attr.rack: rack1
|
冷節點
冷節點資料適合作為歸檔使用,比溫節點查詢還要少(比如半月以上的歸檔日誌),這種型別資料一般很少查詢,並不會消耗CPU效能及IO,但是儲存容量會很大,需要更低成本的儲存,例如OSS或S3;ES可以使用經過fuse協議掛載的物件儲存作為後端儲存。
1 2 3 4 5 6 |
#配置方法
vim /data/app/elasticsearch/config/elasticsearch .yml
#每個溫節點加入如下配置並重啟服務
node.attr.box_type: cold
node.attr.rack: rack1
|
4.2、生命週期策略
配置方法:
1、利用Kibana新建策略並指定到模板
開啟Kibana--->管理--->索引生命週期策略
建立策略
儲存策略並在建立模板後新增到模板中
2、呼叫ESApi將策略寫入ES
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
curl -XPUT -H "content-type:application/json" http: //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等請參考官方文件
1 2 3 4 5 6 7 8 9 10 11 |
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指定所以的別名寫入