一、前言
在 Elasticsearch
的日常中,有很多如儲存 系統日誌、行為資料等方面的應用場景,這些場景的特點是資料量非常大,並且隨著時間的增長 索引
的數量也會持續增長,然而這些場景基本上只有最近一段時間的資料有使用價值或者會被經常使用(熱資料),而歷史資料幾乎沒有作用或者很少會被使用(冷資料),這個時候就需要對 索引
進行一定策略的維護管理甚至是刪除清理,否則隨著資料量越來越多除了浪費磁碟與記憶體空間之外,還會嚴重影響 Elasticsearch
的效能;
在 Elastic Stack 6.6
版本後推出了新功能 Index Lifecycle Management(索引生命週期管理)
,支援針對索引的全生命週期託管管理,並且在 Kibana
上也提供了一套 UI 介面來配置策略。本文主要介紹 Elasticsearch
索引生命週期管理如何配置和使用。
二、生命週期
2.1. 階段介紹
索引生命週期分為4個階段:hot、warm、cold、delete,其中hot主要負責對索引進行rollover操作。
rollover:滾動更新建立的新索引將新增到索引別名,並被指定為寫索引。
PS:4個階段中只有hot階段是必須的
索引根據時間引數min_age進入生命週期階段,若未設定,預設是0ms。min_age通常是從建立索引的時間開始計算,如果索引被設定為滾動索引,那麼min_age是從索引滾動開始計算。注意,在檢查min_age引數並進入下一個階段前,當前階段的操作必須完成。
2.2. 階段動作
階段/action | 優先順序設定 | 取消跟隨 | 滾動索引 | 分片分配 | 只讀 | 強制段合併 | 收縮索引 | 凍結索引 | 刪除 |
---|---|---|---|---|---|---|---|---|---|
hot | √ | √ | √ | × | × | × | × | × | × |
warm | √ | √ | × | √ | √ | √ | √ | × | × |
cold | √ | √ | × | √ | × | × | × | √ | × |
delete | × | × | × | × | × | × | × | × | √ |
2.3. 例子
下面以索引 syslog-2020.10.01
為例子,在索引建立 1 天后轉為 Warm 階段,30 天后轉為 Cold 階段,30 天后刪除
日期 | 動作 | 階段 |
---|---|---|
2020-10-01 | 建立索引 syslog-2020.10.01 ,處理讀寫請求 | hot階段 |
2020-10-02 | syslog-2020.10.01 改為只讀 | warm階段 |
2020-11-01 | syslog-2020.10.01 為只讀,並遷移到冷節點儲存 | cold階段 |
2020-12-01 | 刪除索引 syslog-2020.10.01 | delete階段 |
三、模擬過程
3.1. 建立索引生命週期策略
假設 Policy
設定如下:
- 索引以每10個文件做一次
Rollover
Rollover
後 5 秒轉為Warm
階段Rollover
後 20 秒轉為Cold
階段Rollover
後 40 秒刪除
curl -XPUT "http://$IP:9200/_ilm/policy/my_ilm_policy" \
-H 'Content-Type: application/json' \
-u elastic:changeme \
-d '{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_docs": "10"
}
}
},
"warm": {
"min_age": "5s",
"actions": {
"allocate": {
"include": {
"box_type": "warm"
}
}
}
},
"cold": {
"min_age": "20s",
"actions": {
"allocate": {
"include": {
"box_type": "cold"
}
}
}
},
"delete": {
"min_age": "40s",
"actions": {
"delete": {}
}
}
}
}
}'
ip、使用者名稱和密碼按實際情況修改
3.2. 關聯策略
關聯策略有兩種方式,分別是使用索引模板關聯和索引直接關聯
3.2.1. 索引模板關聯
索引模板來建立所需的索引,並關聯ilm策略
curl -XPUT "http://$IP:9200/_template/my_test_template" \
-H 'Content-Type: application/json' \
-u elastic:changeme \
-d '{
"index_patterns": ["my-test-*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index.lifecycle.name": "my_ilm_policy",
"index.lifecycle.rollover_alias": "my-test",
"index.routing.allocation.include.box_type": "hot"
}
}'
ip、使用者名稱和密碼按實際情況修改index.lifecycle.name:指明該索引應用的 ILM Policy
index.lifecycle.rollover_alias:指明在 Rollover 的時候使用的 alias
index.routing.allocation.include.box_type:指明新建的索引都分配在 hot 節點上
3.2.2. 索引直接關聯
為現有的索引單獨關聯策略
curl -XPUT "http://$IP:9200/my-test-*/_settings" \
-H 'Content-Type: application/json' \
-u elastic:changeme \
-d '{
"index": {
"lifecycle": {
"name": "my_ilm_policy"
}
}
}'
ip、使用者名稱和密碼按實際情況修改
3.3. 檢視索引所處階段
http://$IP:9200/my-test-*/_ilm/explain
3.4. 更新策略
- 如果沒有index應用這份策略,那麼我們可以直接更新該策略。
- 如果有index應用了這份策略,那麼當前正在執行的階段不會同步修改,噹噹前階段結束後,會進入新版本策略的下個階段。
- 如果更換了策略,當前正在執行的階段不會變化,在結束當前階段後,將會由新的策略管理下一個生命週期。
3.5. kibana圖形化操作
上述的步驟,大部分都可以在 Kibana
中以圖形化介面的方式進行操作
注意:如果使用圖形化介面來建立策略,刪除階段會缺失 actions
內容而導致無法刪除
四、修改輪詢間隔(可選)
ILM Service 會在後臺輪詢執行 Policy,預設間隔時間為 10 分鐘,為了測試更快地看到效果,可將其修改為1秒。
curl -XPUT "http://$IP:9200/_cluster/settings" \
-H 'Content-Type: application/json' \
-u elastic:changeme \
-d '{
"persistent": {
"indices.lifecycle.poll_interval":"1s"
}
}'
ip、使用者名稱和密碼按實際情況修改
五、啟動和停止索引生命週期管理
ILM 預設開啟
由ILM管理的所有索引將繼續執行其策略。有時可能不需要某些索引,甚至叢集中的所有索引都不需要。例如,當需要叢集拓撲更改時,可能會有計劃的維護視窗,這可能會影響正在執行的ILM操作。因此,ILM有兩種禁用操作的方法。
停止ILM時,快照生命週期管理操作也會停止,這意味著不會建立計劃的快照(當前正在進行的快照不受影響)。
通常,ILM將預設執行。要檢視ILM的當前執行狀態,請使用Get Status API 來檢視ILM的當前狀態。
GET _ilm/status
如果請求沒有遇到錯誤,您將收到以下結果:
{
"operation_mode": "RUNNING"
}
ILM的操作模式:
階段/action | 優先順序設定 |
---|---|
正在執行 | 正常執行,所有策略均正常執行 |
停止 | ILM已收到停止請求,但仍在處理某些策略 |
已停止 | 這表示沒有執行任何策略的狀態 |
5.1. 停止ILM
可以暫停ILM服務,以便使用Stop API不再執行其他步驟。
POST _ilm/stop
停止後,所有其他政策措施都將停止。這將反映在狀態API中
{
"operation_mode": "STOPPING"
}
然後,ILM服務將非同步地將所有策略執行到可以安全停止的位置。在ILM確認它是安全的之後,它將移至該STOPPED
模式
{
"operation_mode": "STOPPED"
}
5.2. 啟動ILM
要啟動ILM並繼續執行策略,請使用Start API。
POST _ilm/start
Start API將向ILM服務傳送請求,以立即開始正常操作。
{
"operation_mode": "RUNNING"
}
六、API清單
可以使用以下API來管理索引策略。可參考官方文件 管理索引生命週期。
掃碼關注有驚喜!