根据索引策略对elasticsearch中的索引进行管理(附带图文教程)

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱

一. 索引生命周期简介

想要了解更多可以看 :索引生命周期

1.1 索引生命周期五种阶段

(1)Hot:正在积极更新和查询索引。

(2)Warm:索引不再更新,但仍在查询中。

(3)Cold:索引不再更新,很少被查询。信息仍然需要可搜索,但如果查询速度较慢。

(4)Frozen: 索引不再更新并且是查询操作很少。信息还需要可搜索的,但查询速度较慢。

(5)Delete:不再需要索引,可以安全地删除。

1.2 阶段如何执行

ILM 控制每个阶段中策略的执行顺序

官方解释:

  1. 当索引进入某个阶段时,ILM 会在索引元数据中缓存阶段定义。这避免策略更新的时候影响到索引变成永远无法退出该阶段的状态。如果可以安全地应用更改 ,ILM 会更新缓存的阶段定义。如果不能,阶段执行将继续使用缓存的定义

  2. ILM 定期运行,检查索引是否满足策略标准,并执行所需的任何步骤。为了避免竞争条件,ILM 可能需要运行多次才能执行完成操作所需的所有步骤。例如,如果 ILM 确定索引满足滚动条件,它将开始执行完成滚动操作所需的步骤。如果到达无法安全进入下一步的程度,执行就会停止。下次 ILM 运行时,ILM 将从中断处继续执行。这意味着,即使indices.lifecycle.poll_interval设置为 10 分钟并且索引满足展期标准,也可能需要 20 分钟才能完成展期。

我的理解:

  1. 索引中会缓存 下当前阶段定义的策略,如果更新策略,并且索引恰好到达了该阶段,那么当前索引就不会使用最新的策略。
  2. ILM是定期运行的,默认10分钟 执行一次的,我们可以通过indices.lifecycle.poll_interval去设置他的时间,如果在执行的过程中某个阶段受到阻碍,就会停止运行,下次执行时候才会从停止处继续执行。所以ILM完整的执行一次可能需要20分钟或者更多。

二. 需求和问题

您可以配置索引生命周期管理 (ILM) 策略,以根据您的性能、弹性和保留要求自动管理索引。

问题:

  • 我们在使用es存储数据的时候,随着时间推移,数据量比较久远的数据就想删除掉,因此我们就想要定期的清除这些历史数据,所以我们可以通过es的策略去管理索引的生命周期。

需求:

  • 当索引达到100kb时启动新索引
  • 删除满足上面条件并且过了1小时后的旧索引

Elasticsearch 有这些内置 ILM 策略:logs ,metrics,synthetics

我做了以下设计:

三. 使用别名去管理索引

使用索引别名来管理索引并定期rollover到新索引。

3.1 创建生命周期策略

关于策略的api操作

生命周期策略用来指定索引生命周期每个阶段要执行的操作。

根据我上面的需求创建以下策略

json 复制代码
PUT _ilm/policy/test_policy
{
  "policy": {
    "phases": {
      "hot": {                                
        "actions": {
          "rollover": {
            "max_primary_shard_size": "100kb", 
          }
        }
      },
      "delete": {
        "min_age": "1h",                     
        "actions": {
          "delete": {}                        
        }
      }
    }
  }
}

查看创建的策略

json 复制代码
GET _ilm/policy/test_policy

3.2 创建索引模板

我们需要在移动到新索引 (rollover)时候自动将生命周期策略 应用到新的索引 上,需要在创建新索引索引模板指定策略

如下,我创建了一个test_template模板,并应用到名称用 test- 开头的新索引。

为了启用自动翻转,模板配置了两个 ILM 设置:

  • index.lifecycle.name:指定生命周期策略的名称。
  • index.lifecycle.rollover_alias:指定索引的别名。
json 复制代码
PUT _index_template/test_template
{
  "template": {
    "settings": {
      "number_of_shards": 1, 
      "number_of_replicas": 1,
      "index.lifecycle.name": "test_policy",  // 应用到每个新索引的生命周期策略的名称。
      "index.lifecycle.rollover_alias": "test"  // 用于引用这些索引的别名的名称。使用移动操作的策略是必需的。
    }
  },
  "index_patterns": [
    "test-*"  // 如果新索引的名称以 test- 开头,则将模板应用到新索引。
  ]
}

查看创建的模板

json 复制代码
GET /_index_template/test_template

3.3 创建一个带有数字结尾索引

如下,创建一个名为 的索引test-000001 ,将 test-000001 索引指定为别名test的写入索引。

注意:该索引的名称必须与模板的索引模式匹配并以数字结尾,满足策略的条件后,该值会增加1变成 test-000002 索引 。

json 复制代码
PUT test-000001
{
  "aliases": {
    "test": {
      "is_write_index": true
    }
  }
}

当满足翻转条件后:

  • 创建一个名为 test-000002 的新索引。这与test-*模式匹配,因此设置test_template将应用于test-000002
  • test-000002 新索引指定为写入索引 并使test-000001索引变为只读

每次满足策略的条件时都会重复此过程。

四. 测试

4.1 当索引达到100kb时启动新索引

我们往里面添加文档

json 复制代码
PUT  /test/_bulk?refresh
{"index":{}}
{"name": "小狗", "leg": 4, "iswing": false}
{"index":{}}
{"name": "小鸡", "leg": 2, "iswing": true}
{"index":{}}
{"name": "小猫", "leg": 4, "iswing": false}

满足条件后,我们可以通过别名去查看对应的索引

json 复制代码
GET _alias/test

通过查询的结果可以发现,他已经自己创建了新索引test-000002

4.2 删除过了1小时后的索引以执行数据保留标准

过了一小时后,索引test-000001就被删除了

注意:索引生命周期管理(ILM)中有个设置是**indices.lifecycle.poll_interval** ,这是 ILM 检查 索引是否满足策略标准 的频率,默认为十分钟 。所以ILM每十分钟才会去检查索引是否符合策略标准 ,比如我们设定超过100kb就rollover,但是这个过程不是立即实现的。
作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

相关推荐
儿时可乖了32 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol33 分钟前
java基础概念37:正则表达式2-爬虫
java
xmh-sxh-13141 小时前
jdk各个版本介绍
java
天天扭码1 小时前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶1 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺1 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序1 小时前
vue3 封装request请求
java·前端·typescript·vue
陈王卜2 小时前
django+boostrap实现发布博客权限控制
java·前端·django