您好,登錄后才能下訂單哦!
本篇內容介紹了“Elasticsearch索引生命周期如何管理”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在 Elasticsearch的日常管理中,有很多如系統日志,行為數據等方面的應用場景,這些場景的特點是數據量非常大,并且隨著時間的增長索引的數量也會持續增長,然而這些場景基本上只有最近一段時間的數據有使用價值或者會被經常使用(熱數據),而歷史數據幾乎沒有作用或者很少會被使用(冷數據),這個時候就需要對索引進行一定策略的維護管理甚至是刪除清理,否則隨著數據量越來越多除了浪費磁盤與內存空間之外,還會嚴重影響 Elasticsearch 的性能。
在 Elastic Stack 6.6 版本后推出了新功能 Index Lifecycle Management(索引生命周期管理),支持針對索引的全生命周期托管管理,并且在 Kibana 上也提供了一套UI界面來配置策略。
hot: 索引還存在著大量的讀寫操作。
warm:索引不存在寫操作,還有被查詢的需要。
cold:數據不存在寫操作,讀操作也不多。
delete:索引不再需要,可以被安全刪除。
注意:以上只是索引生命周期階段的常見定義,具體策略可以根據實際業務情況來定義。
部署一個由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 elasticsearch3: 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 elasticsearch4: 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 elasticsearch5: 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 elasticsearch6: 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 elasticsearch7: 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)
將ILM刷新時間設定為1秒,便于實驗演示(默認為10分鐘):
PUT _cluster/settings { "persistent": { "indices.lifecycle.poll_interval":"1s" } }
設置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": {} } } } } }
設置索引模板是為了新 rollover 出來的索引能夠應用 iml 的配置:
PUT /_template/log_ilm_template { "index_patterns" : [ "ilm_index-*" ], "settings" : { "index" : { "lifecycle" : { "name" : "log_ilm_policy", "rollover_alias" : "ilm_alias" }, "routing" : { "allocation" : { "include" : { "box_type" : "hot" } } }, "number_of_shards" : "1", "number_of_replicas" : "1" } } }
將索引分配到hot節點,并且調用之前設置的IML策略log_ilm_policy,設置rollover的別名為ilm_alias,設置主分片為1,副本分片為1。 索引必須后面要帶有數字,否則 rollover 策略不會生效。
PUT ilm_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": { #在rollover的時候,alias會包含所有rollover的索引,并且會自動將 is_write_index": #true 設置到最新rollover的索引上,也就是說寫操作會到最新的索引上。 "is_write_index": true } } }
連續執行5次POST,創建5個文檔。
POST ilm_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": "blocked by: [FORBIDDEN/8/index write (api)];" } ], "type": "cluster_block_exception", "reason": "blocked by: [FORBIDDEN/8/index write (api)];" }, "status": 403 }
“Elasticsearch索引生命周期如何管理”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。