對(duì)于日志或指標(biāo)(metric)類時(shí)序性強(qiáng)的ES索引潦匈,因?yàn)閿?shù)據(jù)量大阱高,并且寫入和查詢大多都是近期時(shí)間內(nèi)的數(shù)據(jù)。我們可以采用hot-warm-cold架構(gòu)將索引數(shù)據(jù)切分成hot/warm/cold的索引茬缩。
hot索引
負(fù)責(zé)最新數(shù)據(jù)的讀寫赤惊,可使用內(nèi)存存儲(chǔ);warm索引
負(fù)責(zé)較舊數(shù)據(jù)的讀取凰锡,可使用內(nèi)存或SSD存儲(chǔ)未舟;cold索引
很少被讀取,可使用大容量磁盤存儲(chǔ)掂为。隨著時(shí)間的推移裕膀,數(shù)據(jù)不斷從hot索引->warm索引->cold索引遷移。針對(duì)不同階段的索引我們還可以調(diào)整索引的主分片數(shù)勇哗,副本數(shù)昼扛,單分片的segment數(shù)等等,更好的利用機(jī)器資源。這一切ES都幫我們實(shí)現(xiàn)了抄谐。ES從6.7版本推出了索引生命周期管理(Index Lifecycle Management 渺鹦,簡(jiǎn)稱ILM)機(jī)制,能幫我們自動(dòng)管理一個(gè)索引策略(Policy)
下索引集群的生命周期蛹含。索引策略將一個(gè)索引的生命周期定義為四個(gè)階段:
- Hot:索引可寫入毅厚,也可查詢。
- Warm:索引不可寫入浦箱,但可查詢吸耿。
- Cold:索引不可寫入,但很少被查詢酷窥,查詢的慢點(diǎn)也可接受咽安。
- Delete:索引可被安全的刪除。
索引策略控制這一個(gè)索引的生命從Hot -> Warm -> Cold -> Delete 階段蓬推,每個(gè)階段都可以配置不同的轉(zhuǎn)化行為(Action)
板乙。下面我們看下幾個(gè)常用的Action:
-
Rollover
當(dāng)寫入索引達(dá)到了一定的大小,文檔數(shù)量或創(chuàng)建時(shí)間時(shí)拳氢,Rollover可創(chuàng)建一個(gè)新的寫入索引,將舊的寫入索引的別名去掉蛋铆,并把別名賦給新的寫入索引馋评。所以便可以通過切換別名
控制寫入的索引是誰。它可用于Hot
階段刺啦。 -
Shrink
減少一個(gè)索引的主分片數(shù)留特,可用于Warm
階段。需要注意的是當(dāng)shink完成后索引名會(huì)由原來的<origin-index-name>
變?yōu)?code>shrink-<origin-index-name>. -
Force merge
可觸發(fā)一個(gè)索引分片的segment merge玛瘸,同時(shí)釋放掉被刪除文檔的占用空間蜕青。用于Warm
階段。 -
Allocate
可指定一個(gè)索引的副本數(shù)糊渊,用于warm, cold
階段右核。
好了現(xiàn)在我們知道一個(gè)索引策略是由配置不同的階段和每個(gè)階段對(duì)應(yīng)的Action組成,那怎么設(shè)置一個(gè)索引的索引策略呢渺绒?把冰箱裝進(jìn)大象分為三部:
設(shè)置一個(gè)索引的索引策略
1.創(chuàng)建一個(gè)索引策略
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
//rollover前距離索引的創(chuàng)建時(shí)間最大為7天
"max_age": "7d",
//rollover前索引的最大大小不超過50G
"max_size": "50G",
//rollover前索引的最大文檔數(shù)不超過1個(gè)(測(cè)試用)
"max_docs": 1,
}
}
},
"warm": {
//rollover之后進(jìn)入warm階段的時(shí)間不小于30天
"min_age": "30d",
"actions": {
"forcemerge": {
//強(qiáng)制分片merge到segment為1
"max_num_segments": 1
},
"shrink": {
//收縮分片數(shù)為1
"number_of_shards": 1
},
"allocate": {
//副本數(shù)為2
"number_of_replicas": 2
}
}
},
"cold": {
//rollover之后進(jìn)入cold階段的時(shí)間不小于60天
"min_age": "60d",
"actions": {
"allocate": {
"require": {
//分配到cold 節(jié)點(diǎn)贺喝,ES可根據(jù)機(jī)器資源配置不同類型的節(jié)點(diǎn)
"type": "cold"
}
}
}
},
"delete": {
//rollover之后進(jìn)入cold階段的時(shí)間不小于60天
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
2.創(chuàng)建一個(gè)索引模版,指定使用的索引策略
PUT _template/my_template
{
//模版匹配的索引名以"index-"開頭
"index_patterns": ["myindex-*"],
"settings": {
//索引分片數(shù)為2
"number_of_shards":2 ,
//索引副本數(shù)為1
"number_of_replicas": 1,
//索引使用的索引策略為my_policy
"index.lifecycle.name": "full_policy",
//索引rollover后切換的索引別名為 test-alias
"index.lifecycle.rollover_alias": "myindex"
}
}
3.創(chuàng)建一個(gè)符合上述索引模版的索引
PUT index-000001
{
"aliases": {
"myindex":{ //別名為 myindex
//允許索引被寫入數(shù)據(jù)
"is_write_index": true
}
}
}
當(dāng)發(fā)生rollover時(shí)宗兼,老索引的別名myindex將被去掉躏鱼,新創(chuàng)建的索引別名為myidex,同時(shí)索引名自動(dòng)在索引名上自增殷绍,變?yōu)閙yindex-0002染苛。此外對(duì)應(yīng)的配置信息我已注釋上了,大家慢慢看吧主到。
小貼士
:部署ES集群節(jié)點(diǎn)的版本要統(tǒng)一茶行,不然ILM可能出現(xiàn)意想不到的錯(cuò)誤躯概。
這里為啥要用索引模版來關(guān)聯(lián)索引和索引策略呢?因?yàn)槿绻趧?chuàng)建索引時(shí)不通過模版指定索引策略拢军,當(dāng)發(fā)生rollover時(shí)楞陷,新的索引并不會(huì)繼承原來索引的索引策略。
小伙伴將嘗試了之后發(fā)現(xiàn)不對(duì)啊茉唉,我插入里兩條數(shù)據(jù)并沒有自動(dòng)rollover啊固蛾。不慌,小姐姐是不會(huì)騙人的度陆。ES檢測(cè)索引的索引策略是否該生效的時(shí)間默認(rèn)為10min艾凯,可通過修改以下配置:
PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval": "3s"
}
}
3秒中檢測(cè)一下是否可執(zhí)行索引策略,應(yīng)該夠了懂傀。
Logstash使用ILM
問題來了趾诗,當(dāng)我們使用ELK搭建索引日志系統(tǒng)時(shí),咋讓Logstash和ES的ILM無縫連接呢蹬蚁?
Logstash的Elasticsearch output plugin
插件自從9.3.1版本之后就支持ILM了恃泪,我們只需要在Logstash的配置文件中簡(jiǎn)單配置下就可以全部托管給ES ILM了。
output {
elasticsearch {
//發(fā)生rollover時(shí)的寫入索引的別名
ilm_rollover_alias => "myindex"
//將會(huì)附在ilm_rollover_alias的值后面共同構(gòu)成索引名犀斋,myindex-00001
ilm_pattern => "00001"
//使用的索引策略
ilm_policy => "my_policy"
//使用的索引模版名稱
template_name => "my_template"
}
}
如果我們一直愉快的使用一個(gè)索引策略贝乎,當(dāng)然很好。但是總有意外發(fā)生叽粹。览效。索引策略執(zhí)行失敗了怎么辦,中途想改變索引策略換車怎么辦虫几?這都是問題锤灿。
索引策略執(zhí)行失敗
首先我們先看一下失敗的原因是什么,可以用API查看一下:
GET /myindex/_ilm/explain
返回信息中step_info
就是失敗原因辆脸,假設(shè)是索引策略設(shè)置的有問題但校,比如說Shrink的主分片數(shù)設(shè)置的比模版的都大,我們只需要更新索引策略每强,解決問題始腾。然后在重試讓ILM繼續(xù)執(zhí)行下一步就好。
POST /myindex/_ilm/retry
索引策略的更新
我們可使用以下API更新索引策略空执,
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "25GB"
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
查看索引策略發(fā)現(xiàn)浪箭,每次更新索引策略的版本都會(huì)增加。
對(duì)于還沒有開始創(chuàng)建的索引辨绊,更新索引策略顯然能夠生效奶栖。對(duì)于已經(jīng)存在的策略生效的索引,當(dāng)前階段是不會(huì)按照最新版本的策略執(zhí)行的,必須等到變?yōu)橄乱粋€(gè)階段了宣鄙,才會(huì)按照最新版本的策略執(zhí)行袍镀。
如果想切換索引使用的索引策略,可以使用API進(jìn)行修改:
PUT myindex/_settings
{
"lifecycle.name": "my_other_policy"
}
此外冻晤,在老版本使用ILM機(jī)制時(shí)苇羡,可能還涉及到將原來的索引納入索引策略管理中,將原來ES的curator索引滾動(dòng)方案升級(jí)到ILM等問題鼻弧。本文主要結(jié)合官方文檔介紹了ILM的開箱使用设江,Logstash使用ILM,索引策略執(zhí)行失敗和索引策略的更新的使用攘轩。更多問題還請(qǐng)閱讀官方文檔叉存,獲得更好的體驗(yàn)。
感謝您的閱讀度帮,我是Monica23334 || Monica2333 歼捏。立下每周寫一篇原創(chuàng)文章flag的小姐姐,關(guān)注我并期待打臉吧~