天天看點

Elasticsearch 索引生命周期管理

引入索引生命周期的作用

在 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文檔。

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": {
      "is_write_index": true
    }
  }
}      

建立文檔

連續執行5次POST,建立5個文檔。

POST ilm_alias/_doc
{
  "name":"cr7",
  "age": 15
}      

觀察

剛開始可以看到總共有5個doc。

Elasticsearch 索引生命周期管理
Elasticsearch 索引生命周期管理
Elasticsearch 索引生命周期管理
Elasticsearch 索引生命周期管理

繼續閱讀