引入索引生命周期的作用
在 Elasticsearch的日常管理中,有很多如系統(tǒng)日志,行為數(shù)據(jù)等方面的應(yīng)用場(chǎng)景,這些場(chǎng)景的特點(diǎn)是數(shù)據(jù)量非常大,并且隨著時(shí)間的增長(zhǎng)索引的數(shù)量也會(huì)持續(xù)增長(zhǎng),然而這些場(chǎng)景基本上只有最近一段時(shí)間的數(shù)據(jù)有使用價(jià)值或者會(huì)被經(jīng)常使用(熱數(shù)據(jù)),而歷史數(shù)據(jù)幾乎沒(méi)有作用或者很少會(huì)被使用(冷數(shù)據(jù)),這個(gè)時(shí)候就需要對(duì)索引進(jìn)行一定策略的維護(hù)管理甚至是刪除清理,否則隨著數(shù)據(jù)量越來(lái)越多除了浪費(fèi)磁盤與內(nèi)存空間之外,還會(huì)嚴(yán)重影響 Elasticsearch 的性能。
在 Elastic Stack 6.6 版本后推出了新功能 Index Lifecycle Management(索引生命周期管理),支持針對(duì)索引的全生命周期托管管理,并且在 Kibana 上也提供了一套UI界面來(lái)配置策略。
索引生命周期常見(jiàn)的階段
hot: 索引還存在著大量的讀寫操作。
warm:索引不存在寫操作,還有被查詢的需要。
cold:數(shù)據(jù)不存在寫操作,讀操作也不多。
delete:索引不再需要,可以被安全刪除。
注意:以上只是索引生命周期階段的常見(jiàn)定義,具體策略可以根據(jù)實(shí)際業(yè)務(wù)情況來(lái)定義。
部署Elasticsearch集群
部署一個(gè)由2個(gè)hot節(jié)點(diǎn),2個(gè)warm節(jié)點(diǎn),2個(gè)cold節(jié)點(diǎn)組成的Elasticsearch集群,并且部署了Kibana和Cerebro方便調(diào)試和觀察。docker-compose.yaml文件如下:
version:'2.2' services: cerebro: image:lmenezes/cerebro:0.8.3 container_name:hwc_cerebro ports: -"9000:9000" command: --Dhosts.0.host=http://elasticsearch:9200 networks: -hwc_es7net kibana: image:docker.elastic.co/kibana/kibana:7.1.0 container_name:hwc_kibana7 environment: #-I18N_LOCALE=zh-CN -XPACK_GRAPH_ENABLED=true -TIMELION_ENABLED=true -XPACK_MONITORING_COLLECTION_ENABLED="true" ports: -"5601:5601" networks: -hwc_es7net elasticsearch: image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0 container_name:es7_hot1 environment: -cluster.name=cr7-hwc -node.name=es7_hot1 -node.attr.box_type=hot -bootstrap.memory_lock=true -"ES_JAVA_OPTS=-Xms512m-Xmx512m" -discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 -cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 ulimits: memlock: soft:-1 hard:-1 volumes: -hwc_es7data_hot1:/usr/share/elasticsearch/data ports: -9200:9200 networks: -hwc_es7net elasticsearch2: image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0 container_name:es7_warm1 environment: -cluster.name=cr7-hwc -node.name=es7_warm1 -node.attr.box_type=warm -bootstrap.memory_lock=true -"ES_JAVA_OPTS=-Xms512m-Xmx512m" -discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 -cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 ulimits: memlock: soft:-1 hard:-1 volumes: -hwc_es7data_warm1:/usr/share/elasticsearch/data networks: -hwc_es7net elasticsearch3: image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0 container_name:es7_cold1 environment: -cluster.name=cr7-hwc -node.name=es7_cold1 -node.attr.box_type=cold -bootstrap.memory_lock=true -"ES_JAVA_OPTS=-Xms512m-Xmx512m" -discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 -cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 ulimits: memlock: soft:-1 hard:-1 volumes: -hwc_es7data_cold1:/usr/share/elasticsearch/data networks: -hwc_es7net elasticsearch4: image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0 container_name:es7_hot2 environment: -cluster.name=cr7-hwc -node.name=es7_hot2 -node.attr.box_type=hot -bootstrap.memory_lock=true -"ES_JAVA_OPTS=-Xms512m-Xmx512m" -discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 -cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 ulimits: memlock: soft:-1 hard:-1 volumes: -hwc_es7data_hot2:/usr/share/elasticsearch/data networks: -hwc_es7net elasticsearch5: image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0 container_name:es7_warm2 environment: -cluster.name=cr7-hwc -node.name=es7_warm2 -node.attr.box_type=warm -bootstrap.memory_lock=true -"ES_JAVA_OPTS=-Xms512m-Xmx512m" -discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 -cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 ulimits: memlock: soft:-1 hard:-1 volumes: -hwc_es7data_warm2:/usr/share/elasticsearch/data networks: -hwc_es7net elasticsearch6: image:docker.elastic.co/elasticsearch/elasticsearch:7.1.0 container_name:es7_cold2 environment: -cluster.name=cr7-hwc -node.name=es7_cold2 -node.attr.box_type=cold -bootstrap.memory_lock=true -"ES_JAVA_OPTS=-Xms512m-Xmx512m" -discovery.seed_hosts=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 -cluster.initial_master_nodes=es7_hot1,es7_warm1,es7_cold1,es7_hot2,es7_warm2,es7_cold2 ulimits: memlock: soft:-1 hard:-1 volumes: -hwc_es7data_cold2:/usr/share/elasticsearch/data networks: -hwc_es7net volumes: hwc_es7data_hot1: driver:local hwc_es7data_warm1: driver:local hwc_es7data_cold1: driver:local hwc_es7data_hot2: driver:local hwc_es7data_warm2: driver:local hwc_es7data_cold2: driver:local networks: hwc_es7net: driver:bridge
執(zhí)行docker-compose up -d命令即可啟動(dòng)Elasticsearch集群。(前提安裝好docker和docker-compose)
修改IML刷新時(shí)間
將ILM刷新時(shí)間設(shè)定為1秒,便于實(shí)驗(yàn)演示(默認(rèn)為10分鐘):
PUT_cluster/settings { "persistent":{ "indices.lifecycle.poll_interval":"1s" } }
設(shè)置Index Lifecycle Policies
設(shè)置hot/warm/cold和delete四個(gè)階段:
hot:超過(guò)5個(gè)文檔以后rollover。
warm:20s后進(jìn)入warm階段,將索引設(shè)置為只讀。
cold:40s后進(jìn)入warm階段,將副本分別從1縮小為0。
delete:60s后進(jìn)入delete階段,刪除索引。
PUT/_ilm/policy/log_ilm_policy { "policy":{ "phases":{ "hot":{ "actions":{ "rollover":{ "max_docs":5 } } }, "warm":{ "min_age":"20s", "actions":{ "allocate":{ "include":{ "box_type":"warm" } }, "readonly":{} } }, "cold":{ "min_age":"40s", "actions":{ "allocate":{ "include":{ "box_type":"cold" }, "number_of_replicas":0 } } }, "delete":{ "min_age":"60s", "actions":{ "delete":{} } } } } }
創(chuàng)建第一個(gè)索引
將索引分配到hot節(jié)點(diǎn),并且調(diào)用之前設(shè)置的IML策略log_ilm_policy,設(shè)置rollover的別名為ilm_alias,設(shè)置主分片為1,副本分片為1。設(shè)置"is_write_index": true在rollover的時(shí)候,alias會(huì)包含所有rollover文檔。
PUTilm_index-000001 { "settings":{ "number_of_shards":1, "number_of_replicas":1, "index.lifecycle.name":"log_ilm_policy", "index.lifecycle.rollover_alias":"ilm_alias", "index.routing.allocation.include.box_type":"hot" }, "aliases":{ "ilm_alias":{ "is_write_index":true } } }
創(chuàng)建文檔
連續(xù)執(zhí)行5次POST,創(chuàng)建5個(gè)文檔。
POSTilm_alias/_doc { "name":"cr7", "age":15 }
觀察
剛開(kāi)始可以看到總共有5個(gè)doc。
當(dāng)達(dá)索引iml_index-000001到5個(gè)doc時(shí),做了rollover操作,新建了新的索引iml_index-000002。
等待20s后,將索引iml_index-000001移動(dòng)到warm節(jié)點(diǎn)。
等待40s后,將索引iml_index-000001移動(dòng)到cold節(jié)點(diǎn),并且將副本數(shù)從1縮小為0。
等待60s后,索引iml_index-000001被刪除。
由于在warm階段設(shè)置了readonly,在warm和cold階段如果嘗試往iml_index-000001寫入或修改數(shù)據(jù),將會(huì)收到以下報(bào)錯(cuò):
{ "error":{ "root_cause":[ { "type":"cluster_block_exception", "reason":"blockedby:[FORBIDDEN/8/indexwrite(api)];" } ], "type":"cluster_block_exception", "reason":"blockedby:[FORBIDDEN/8/indexwrite(api)];" }, "status":403 }
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7030瀏覽量
89038 -
ui界面
+關(guān)注
關(guān)注
0文章
11瀏覽量
1574 -
Elasticsearch
+關(guān)注
關(guān)注
0文章
29瀏覽量
2834
原文標(biāo)題:Elasticsearch 索引生命周期管理
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論