文章目錄
- 背景
- 介紹
- 環境
- 限制索引大小
- 創建 ILM(索引生命周期管理)策略
- 創建 ILM 策略
- 創建索引模板并關聯 ILM 策略
- 使用索引模板應用 ILM 策略
- 解決索引模板匹配沖突
- ? 解決方案
- 🔹 方案 1:修改 `index_patterns`(推薦)
- 🔹 方案 2:提高 `priority`(這個更符合我的方案,但不推薦)
- 🔹 方案 3:刪除已有沖突模板
- 1?? 查看所有索引模板
- 2?? 刪除不需要的 `metrics` 和 `logs` 模板
- 結論
背景
ES 集群每天都會 觸發磁盤報警,讓人 非常頭疼。
為了控制磁盤使用量,我 編寫了一個 Shell 腳本,當磁盤 使用率超過 75% 時,就會 自動刪除前一天的索引。
然而,問題出現了:
- 這些索引 都是當天新產生的,導致 腳本無法提前清理,磁盤空間依然告急。
于是,我開始思考:
🔍 Elasticsearch 是否有參數可以直接限制索引大小? 🤔
介紹
在使用 Elasticsearch 時,我們可能需要 限制索引大小,以防止磁盤占用過多。通常,我們會使用 索引生命周期管理(ILM)策略 來控制索引的大小,同時需要通過 索引模板(Index Template) 來確保新創建的索引符合規則。
然而,在設置索引模板時,可能會遇到 索引匹配沖突 的問題,導致模板無法生效。本文將介紹 如何限制索引大小,并提供 索引模板沖突的解決方案。
環境
es集群三臺機器
192.168.1.1
192.168.1.2
192.168.1.3
限制索引大小
創建 ILM(索引生命周期管理)策略
ILM 策略允許我們設置 索引的最大大小,并在超出限制時自動滾動到新的索引。
創建 ILM 策略
curl -X PUT "192.168.1.1:9200/_ilm/policy/my_policy" -H "Content-Type: application/json" -d '
{"policy": {"phases": {"hot": {"actions": {"rollover": {"max_size": "50gb", # 單個索引最大 50GB"max_age": "7d" # 或者 7 天后滾動}}}}}
}'
這個策略的作用:
- 當索引達到 50GB 或 存活超過 7 天,會自動 滾動(rollover) 到新索引。
創建索引模板并關聯 ILM 策略
使用索引模板應用 ILM 策略
curl -X PUT "192.168.1.1:9200/_index_template/my_template" -H "Content-Type: application/json" -d '
{"index_patterns": ["my_index-*"], # 只匹配 "my_index-" 開頭的索引"priority": 100,"template": {"settings": {"index.lifecycle.name": "my_policy"}}
}'
? 這樣,所有匹配 my_index-*
的索引都會自動遵循 my_policy
策略!
解決索引模板匹配沖突
在上面的操作中,你可能會遇到以下錯誤:
index template [my_template] has index patterns [*] matching patterns from existing templates [metrics,logs]
這個錯誤的意思是:
- 你的
index_patterns: ["*"]
匹配了所有索引,而你的集群里已經有metrics
和logs
模板,并且它們的priority: 100
,導致沖突。
? 解決方案
我們可以通過 以下三種方式 解決沖突:
🔹 方案 1:修改 index_patterns
(推薦)
最好的做法是 讓模板只作用于你需要的索引,而不是所有索引:
curl -X PUT "192.168.1.1:9200/_index_template/my_template" -H "Content-Type: application/json" -d '
{"index_patterns": ["my_index-*"], # 只匹配 "my_index-" 開頭的索引"priority": 100,"template": {"settings": {"index.lifecycle.name": "my_policy"}}
}'
? 這樣不會影響 metrics
和 logs
索引,避免沖突!
🔹 方案 2:提高 priority
(這個更符合我的方案,但不推薦)
如果你仍想讓你的模板覆蓋所有索引(index_patterns: ["*"]
),可以 提高 priority
,比如改成 200
:
curl -X PUT "192.168.1.1:9200/_index_template/my_template" -H "Content-Type: application/json" -d '
{"index_patterns": ["*"],"priority": 200, # 提高優先級,覆蓋已有模板"template": {"settings": {"index.lifecycle.name": "my_policy"}}
}'
?? 注意
- 如果
metrics
和logs
需要保留原配置,慎用此方法! - 推薦方案 1,限制
index_patterns
,只作用于部分索引。
🔹 方案 3:刪除已有沖突模板
如果 metrics
和 logs
模板不是必須的,可以 先查看模板列表,然后刪除:
1?? 查看所有索引模板
curl -X GET "192.168.1.1:9200/_index_template?pretty"
2?? 刪除不需要的 metrics
和 logs
模板
curl -X DELETE "192.168.1.1:9200/_index_template/metrics"
curl -X DELETE "192.168.1.1:9200/_index_template/logs"
然后再創建 my_template
模板。
?? 僅適用于 metrics
和 logs
不是你需要的情況下!
結論
方案 | 適用場景 | 風險 |
---|---|---|
修改 index_patterns (推薦) | 只影響特定索引 | ? 最安全 |
提高 priority | 需要全局覆蓋 | ?? 可能影響現有模板 |
刪除沖突模板 | 舊模板不再需要 | ?? 需確保不會影響系統索引 |
? 推薦方案 1:修改 index_patterns
,確保只影響特定索引,避免影響 metrics
和 logs
這些已有模板。
你可以根據自己的需求選擇最合適的方案,確保 Elasticsearch 集群穩定運行! 🚀