根据索引策略对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

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

相关推荐
公贵买其鹿26 分钟前
List深拷贝后,数据还是被串改
java
xlsw_4 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭5 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫5 小时前
泛型(2)
java
超爱吃士力架5 小时前
邀请逻辑
java·linux·后端
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石5 小时前
12/21java基础
java
李小白666 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp6 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea