Elasticsearch索引生命周期管理方案
- 2020 年 12 月 30 日
- 筆記
- elasticsearch, ELK, 微服務
一、前言
在 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 "//$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 "//$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 "//$IP:9200/my-test-*/_settings" \
-H 'Content-Type: application/json' \
-u elastic:changeme \
-d '{
"index": {
"lifecycle": {
"name": "my_ilm_policy"
}
}
}'
ip、用戶名和密碼按實際情況修改
3.3. 查看索引所處階段
//$IP:9200/my-test-*/_ilm/explain
3.4. 更新策略
- 如果沒有index應用這份策略,那麼我們可以直接更新該策略。
- 如果有index應用了這份策略,那麼當前正在執行的階段不會同步修改,噹噹前階段結束後,會進入新版本策略的下個階段。
- 如果更換了策略,當前正在執行的階段不會變化,在結束當前階段後,將會由新的策略管理下一個生命周期。
3.5. kibana圖形化操作
上述的步驟,大部分都可以在 Kibana
中以圖形化介面的方式進行操作
注意:如果使用圖形化介面來創建策略,刪除階段會缺失
actions
內容而導致無法刪除
四、修改輪詢間隔(可選)
ILM Service 會在後台輪詢執行 Policy,默認間隔時間為 10 分鐘,為了測試更快地看到效果,可將其修改為1秒。
curl -XPUT "//$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來管理索引策略。可參考官方文檔 管理索引生命周期。
-
政策管理API
-
索引管理API
-
運營管理API
掃碼關注有驚喜!