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

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

相关推荐
夏天的味道٥1 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
冰糖码奇朵3 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
郝开3 小时前
ElasticSearch 分词器介绍及测试:Standard(标准分词器)、English(英文分词器)、Chinese(中文分词器)、IK(IK 分词器)
elasticsearch·中文分词·ik·ik analyzer
好教员好3 小时前
【Spring】整合【SpringMVC】
java·spring
浪九天4 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
堕落年代4 小时前
Maven匹配机制和仓库库设置
java·maven
功德+n4 小时前
Maven 使用指南:基础 + 进阶 + 高级用法
java·开发语言·maven
kngines5 小时前
【实战ES】实战 Elasticsearch:快速上手与深度实践-3.2.3 案例:新闻搜索引擎的相关性优化
大数据·elasticsearch·搜索引擎
香精煎鱼香翅捞饭5 小时前
java通用自研接口限流组件
java·开发语言
ChinaRainbowSea5 小时前
Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案
java·linux·运维·服务器·docker·架构