一、为什么需要滚动索引

当索引时间序列数据(如日志或指标)时,您不能无限期地写入单个索引。为了满足索引和搜索性能要求并管理资源使用,您可以写入一个索引,直到达到某个阈值,然后创建一个新的索引并开始写入该索引。

滚动索引的作用:

  • 在高性能热节点上优化高摄取率的活动指标。
  • 优化暖节点的搜索性能
  • 将较旧、较少访问的数据转移到较便宜的冷节点
  • 通过删除整个索引来根据保留策略删除数据。

二、如何使用滚动索引

ILM 使您能够根据索引大小、文档数量或年龄自动转移到新的索引。触发滚动时,创建一个新索引,更新写别名以指向新索引,并将所有后续更新写入新索引。

通常建议使用数据流来管理时间序列数据,数据流自动跟踪写索引,同时将配置保持在最低限度。

每个数据流都需要一个索引模板,其中包含:

  • 数据流的名称或通配符(*)模式。
  • 数据流的时间戳字段
  • 映射mappings和设置settings

ILM 允许您根据索引大小、文档数量或年龄自动转移到新的索引。触发滚动时,创建一个新索引,更新写别名以指向新索引,并将所有后续更新写入新索引。

滚动的触发条件:
“max_primary_shard_size”: “50GB” 依据主分片大小
“max_age”: “30d” 依据索引数据年龄
“max_docs”:3 索引记录数
“max_size”: “5gb” 索引大小

TIP:
滚动到基于索引大小、文档数量或年龄的新索引比基于时间的滚动更可取。在任意时间滚动通常会导致许多小的索引,这可能会对性能和资源使用产生负面影响。

为了创建一个滚动索引,你需要:

  1. 创建生命周期策略
  2. 创建一个索引模板
  3. 验证索引生命周期阶段的转变

官网说明文档: Rollover

三、实战

1、创建生命周期策略

方式一:通过Kibana定义

通过 Kibana 或使用 create 或 update policy API 创建策略。要从 Kibana 创建策略,打开菜单,进入堆栈管理 > 索引生命周期策略。点击创建策略。

在这里插入图片描述

方式二:通过API定义
说明:定义一个包含两个阶段的索引生命周期管理策略 timeseries_policy。
1、在hot阶段,定义了翻转动作,该阶段指定当索引的主分片的最大存储容量到达50g 或者最大年龄到达30天进行滚动。
2、delete阶段,定义滚动后90天删除索引。

PUT _ilm/policy/timeseries_policy
{
  "policy": {
    "phases": {
      "hot": {                                
        "actions": {
          "rollover": {
            "max_primary_shard_size": "50GB", 
            "max_age": "30d"
          }
        }
      },
      "delete": {
        "min_age": "90d",                     
        "actions": {
          "delete": {}                        
        }
      }
    }
  }
}

参数介绍:
1、rollover 设置索引滚动的触发条件
2、max_primary_shard_size 最大主分片数
3、max_age 索引最多保留多少时间
4、min_age多长时间后,进入下一个阶段
5、actions滚动到该阶段后需要执行的动作

注意⚠️:
1、滚动动作只有在hot阶段才能配置。
2、min_age时间是从执行滚动后开始算起,而不是创建索引开始算起。

例如,下列策略在索引滚动一天后删除该索引。它不会在创建索引后一天删除索引。

PUT /_ilm/policy/rollover_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "50G"
          }
        }
      },
      "delete": {
        "min_age": "1d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

2、创建索引模板

要设置数据流,首先创建一个索引模板来指定生命周期策略。因为模板是用于数据流的,所以它还必须包含数据流定义。

例如,您可以创建一个 timeseries _ template,用于将来名为 timeseries 的数据流。

为了使 ILM 能够管理数据流,模板配置了一个 ILM 设置:

  • 指定要应用于数据流的生命周期策略的名称

方式一:通过Kibana创建索引模板
您可以使用 Kibana Create 模板向导添加模板。从 Kibana 打开菜单,进入 Stack Management > Index Management。在 Index Templates 选项卡中,单击 Create template。
在这里插入图片描述

方式二:通过API创建索引模板

PUT _index_template/timeseries_template
{
  "index_patterns": ["timeseries"],                   
  "data_stream": { },
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "index.lifecycle.name": "timeseries_policy"     
    }
  }
}

说明:
创建名称为timeseries_template的索引模板。

  • index_patterns 用于设置索引名称的匹配模式,当索引名称与 timeseries 目标匹配时应用该模板
  • index.lifecycle.name 用于管理数据流的 ILM 策略的名称。
  • 通过data_stream声明是一个数据流模板。

3、创建数据流

如果索引名称与索引模板的 index _ patterns 中定义的名称或通配符模式匹配,只要现有的数据流、索引或索引别名尚未使用该名称,索引请求就会自动创建带有单个后备索引的对应数据流。Elasticsearch 自动将请求的文档索引到这个支持索引中,该索引也充当流的写索引。

例如,下面的请求将创建 timeseries 数据流和名为. ds-timeseries-2099.03.08-00001的第一代支持索引。

POST timeseries/_doc
{
  "message": "logged the request",
  "@timestamp": "1591890611"
}

当满足生命周期策略中的滚动条件时,滚动操作:

  • 创建名为 .ds-timeseries-2099.03.08-000002 的第二代后备索引。 因为它是 timeseries 数据流的后备索引,所以来自 timeseries_template 索引模板的配置将应用于新索引。
  • 由于是timeseries数据流的最新一代索引,新创建的backing index .ds-timeseries-2099.03.08-000002成为数据流的写索引。

每次满足滚动条件时,这个过程都会重复。你可以搜索所有数据流的支持索引,这些索引由 timeseries_ policy 管理,并带有时间串数据流名称。写操作被路由到当前的写索引。读操作将由所有支持索引处理。

注意⚠️:
1、数据流是缩放和管理时间序列数据的一种方便方式,但是它们仅用于附加。很多场景下数据需要更新或删除的用例,而数据流不支持直接删除和更新请求,因此索引 api 将需要直接用于数据流的支持索引。
2、如果索引数据需要支持直接删除、更新那么就不能采用数据流了,这时可以使用索引别名来管理包含时间序列数据的索引,并定期转移到新的索引

4、检索生命周期的进度

要获取托管索引的状态信息,可以使用 ILM 解释 API:

  • 索引处于什么阶段以及何时进入这个阶段
  • 当前操作和正在执行的步骤
  • 如果发生任何错误或进度被阻塞

例如,下面的请求获取有关 timeseries 数据流的支持索引的信息:

GET .ds-timeseries-*/_ilm/explain

总结

1、滚动索引使用场景
2、如何使用滚动索引,配置策略(policy)、创建索引模版(template)、创建索引(index)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐