前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch ILM 索引生命周期管理 - ES 必备技能

Elasticsearch ILM 索引生命周期管理 - ES 必备技能

原创
作者头像
sir5kong
修改2023-08-29 19:12:14
7230
修改2023-08-29 19:12:14
举报

Elasticsearch ILM 主要有三个用途:

  1. 控制单个索引容量
  2. 优雅删除历史数据
  3. 冷热分离,将访问频率低的历史数据放到价格低廉的存储上

本篇文章主要介绍前 2 个用途,冷热架构请参考 下一篇

索引别名

要理解 ILM,必须先学习一下索引别名。

假设有三个索引,my-index-001, my-index-002, my-index-003, 全部绑定到别名 my-alias, 并且 my-index-003 设置了 "is_write_index": true。这意味着对 my-alias 查询可以查询到以上所有三个索引的数据,而对 my-alias 写入数据只会写入到 my-index-003

上述案例,my-alias 扮演代理的角色,它把数据读写请求调度到真实的索引。

假设每个索引存储一个月的数据,my-index-001 是第一个月的数据,到了第三个月创建 my-index-003

  1. 这实现了索引滚动,单个索引只存储一个月的数据,其容量得到了限制,性能有保障。
  2. 如果要删除一个月前的数据只需要删除 my-index-001 即可,删除操作变得简洁,并且不影响服务器性能。

实战案例

这里使用 Kibana Dev Tools 快速完成全部操作。

docker compose 部署

代码语言:yaml
复制
version: "3"

volumes:
  es-data: {}

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.9.0
    # restart: always
    ports:
      - 9200:9200
    volumes:
      - es-data:/usr/share/elasticsearch/data
    environment:
      discovery.type: "single-node"
      xpack.security.enabled: "false"
      ES_JAVA_OPTS: "-Xms512m -Xmx512m"
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s http://localhost:9200",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  kibana:
    image: docker.elastic.co/kibana/kibana:8.9.0
    # restart: always
    ports:
      - 5601:5601
    depends_on:
      elasticsearch:
        condition: service_healthy
    environment:
      ELASTICSEARCH_HOSTS: '["http://elasticsearch:9200"]'

Kibana 需要在 Elasticsearch 启动完成后再启动,所以这里增加了 healthcheck 依赖

创建 ILM policy

代码语言:json
复制
PUT /_ilm/policy/my-ilm-test-policy
{
  "policy" : {
    "phases" : {
      "hot" : {
        "actions" : {
          "rollover" : {
            "max_size" : "50gb",
            "max_age" : "30d"
          },
          "set_priority" : {
            "priority" : 100
          }
        }
      },
      "delete" : {
        "min_age" : "100d",
        "actions" : {
          "delete" : {
            "delete_searchable_snapshot" : true
          }
        }
      }
    }
  }
}

当索引容量达到 50gb 或者 age 达到 30 天则触发索引滚动,滚动后继续保留 100 天,然后会被删除。如果不需要删除把上面 delete 属性去掉即可。

创建索引模板

代码语言:json
复制
PUT /_index_template/my-ilm-test-template
{
  "index_patterns" : ["my-ilm-test-idx-*"],
  "priority" : 1,
  "template": {
    "settings" : {
      "index.lifecycle.name": "my-ilm-test-policy",
      "index.lifecycle.rollover_alias": "my-ilm-test-index",
      "index.number_of_replicas" : 2
    }
  }
}

创建第一个索引

代码语言:json
复制
PUT my-ilm-test-idx-000001
{
  "aliases": {
    "my-ilm-test-index": {
      "is_write_index": true 
    }
  },
  "settings" : {
    "index" : {
      "number_of_shards" : "1",
      "number_of_replicas" : "2"
    }
  }
}

别名的名称以 index 结尾,索引名是 my-ilm-test-idx-*, 这样一眼就能看出哪个是索引哪个是别名。

到这里整个 ILM 流程就能工作了。

  • my-ilm-test-idx-000001 这是第一个索引,30天后会自动创建第二个索引 my-ilm-test-idx-000002,并且 is_write_index 会绑定到新创建的索引。
  • my-ilm-test-index 是索引别名,通过这个别名可以读取所有索引,但是只能写入最新的索引。

案例说明

以上三段全部拷贝到 Kibana Dev Tolls 执行一次即可,完整内容可以从 Gitee 拷贝。

如果你按照以上案例在自己的集群使用 ILM,请注意以下几点:

  • 本案例适合 Elasticsearch 7.10 以上版本。
  • 案例中 my-ilm-test-policy my-ilm-test-template my-ilm-test-idx my-ilm-test-index 需要修改成你自己的资源名称,把 my-ilm-test- 这个前缀整体替换掉即可。
  • 集群内需要有 data_contentdata_hot 角色的节点,默认情况下节点具有所有角色,如果你按角色分组部署了集群,则需要关注一下。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 索引别名
  • 实战案例
    • docker compose 部署
      • 创建 ILM policy
        • 创建索引模板
          • 创建第一个索引
            • 案例说明
            相关产品与服务
            Elasticsearch Service
            腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档