神的孩子都在歌唱

神的孩子都在歌唱

一. 索引生命周期简介

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

1.1 索引生命周期五种阶段

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

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

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

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

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

1.2 阶段如何执行

官方解释:

  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分钟或者更多。

二. 需求和问题

问题:

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

需求:

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

我做了以下设计:

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

三. 使用别名去管理索引

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

3.1 创建生命周期策略

关于策略的api操作

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

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

查看创建的策略

GET _ilm/policy/test_policy

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

3.2 创建索引模板

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

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

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

  • index.lifecycle.name:指定生命周期策略的名称。
  • index.lifecycle.rollover_alias:指定索引的别名。
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- 开头,则将模板应用到新索引。
  ]
}

查看创建的模板

GET /_index_template/test_template

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

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

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

PUT test-000001
{
  "aliases": {
    "test": {
      "is_write_index": true
    }
  }
}

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

当满足翻转条件后:

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

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

四. 测试

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

我们往里面添加文档

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

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

GET _alias/test

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

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

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

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

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

03-13 05:53