引入索引生命周期的作用
在 Elasticsearch的日常管理中,有很多如系統日志,行為數據等方面的應用場景,這些場景的特點是數據量非常大,并且隨著時間的增長索引的數量也會持續增長,然而這些場景基本上只有最近一段時間的數據有使用價值或者會被經常使用(熱數據),而歷史數據幾乎沒有作用或者很少會被使用(冷數據),這個時候就需要對索引進行一定策略的維護管理甚至是刪除清理,否則隨著數據量越來越多除了浪費磁盤與內存空間之外,還會嚴重影響 Elasticsearch 的性能。
在 Elastic Stack 6.6 版本后推出了新功能 Index Lifecycle Management(索引生命周期管理),支持針對索引的全生命周期托管管理,并且在 Kibana 上也提供了一套UI界面來配置策略。
索引生命周期常見的階段
hot: 索引還存在著大量的讀寫操作。
warm:索引不存在寫操作,還有被查詢的需要。
cold:數據不存在寫操作,讀操作也不多。
delete:索引不再需要,可以被安全刪除。
注意:以上只是索引生命周期階段的常見定義,具體策略可以根據實際業務情況來定義。
部署Elasticsearch集群
部署一個由2個hot節點,2個warm節點,2個cold節點組成的Elasticsearch集群,并且部署了Kibana和Cerebro方便調試和觀察。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
執行docker-compose up -d命令即可啟動Elasticsearch集群。(前提安裝好docker和docker-compose)
修改IML刷新時間
將ILM刷新時間設定為1秒,便于實驗演示(默認為10分鐘):
PUT_cluster/settings { "persistent":{ "indices.lifecycle.poll_interval":"1s" } }
設置Index Lifecycle Policies
設置hot/warm/cold和delete四個階段:
hot:超過5個文檔以后rollover。
warm:20s后進入warm階段,將索引設置為只讀。
cold:40s后進入warm階段,將副本分別從1縮小為0。
delete:60s后進入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":{} } } } } }
創建第一個索引
將索引分配到hot節點,并且調用之前設置的IML策略log_ilm_policy,設置rollover的別名為ilm_alias,設置主分片為1,副本分片為1。設置"is_write_index": true在rollover的時候,alias會包含所有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 } } }
創建文檔
連續執行5次POST,創建5個文檔。
POSTilm_alias/_doc { "name":"cr7", "age":15 }
觀察
剛開始可以看到總共有5個doc。
當達索引iml_index-000001到5個doc時,做了rollover操作,新建了新的索引iml_index-000002。
等待20s后,將索引iml_index-000001移動到warm節點。
等待40s后,將索引iml_index-000001移動到cold節點,并且將副本數從1縮小為0。
等待60s后,索引iml_index-000001被刪除。
由于在warm階段設置了readonly,在warm和cold階段如果嘗試往iml_index-000001寫入或修改數據,將會收到以下報錯:
{ "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 }
-
數據
+關注
關注
8文章
7139瀏覽量
89581 -
ui界面
+關注
關注
0文章
11瀏覽量
1584 -
Elasticsearch
+關注
關注
0文章
30瀏覽量
2854
原文標題:Elasticsearch 索引生命周期管理
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論