【ES实战】索引生命周期管理(一)

索引生命周期管理ILM(index lifecycle management)

在这里插入图片描述

概述

索引生命周期管理(ILM)API使你能够自动处理你希望随着时间推移管理索引的方式。你可以根据其他因素(如分片大小、性能要求、弹性、数据保存时长)来采取行动,而不是简单地按照设定的时间表对你的索引进行管理行动。

你可以通过将生命周期策略附加到用于创建索引的模板上,来控制如何处理过时的索引。你可以更新该策略,以修改新的和现有的索引的生命周期。

生命周期策略管理着索引如何在这些阶段过渡,以及在每个阶段对索引进行的操作。该策略可以指定。

  • 你想翻转到一个新索引的最大存储或时限。
  • 索引不再被更新的时间点,主分片的数量可以减少。
  • 当强制合并以永久删除标明要删除的文件的时候。
  • 索引可以被转移到性能较差的硬件上的时机。
  • 可用性不那么关键的时候,可以减少副本分片的数量。
  • 索引可以被安全删除的时机。

例如,如果你在Elasticsearch中索引来自ATM的指标数据,你可以定义一个策略说。

  • 当索引达到50GB时,翻转到一个新的索引。
  • 将旧的索引移到温暖阶段,标记为只读,并将其缩减为一个分片。
  • 7天后,将该索引移到冷阶段,并将其移到较便宜的硬件上。
  • 一旦达到规定的30天保留期,就删除该索引。

索引生命周期管理不支持混合版本的集群使用。尽管有可能针对较新版本的节点创建这样的新策略,但不能保证它们能按预期工作。使用不存在于最旧版本的节点中的新动作的新策略将导致错误。

版本矩阵

关键版本号说明
6.6此版本的生命周期管理是实验功能
6.7-7.10此期间版本的生命周期管理是X-pack模式下的
7.11从此版本开始生命周期管理功能开始免费,并入数据管理下。
7.12生命周期阶段增加Frozen阶段

主要概念

索引生命周期

将索引分为5个阶段(版本7.12之前为4个阶段)

  1. Hot:索引正在频繁地被更新和查询。
  2. Warm:索引不再被更新,但仍然被查询。
  3. Cold:索引不再被更新,并且不经常被查询。这些信息仍然需要被搜索,但是如果这些查询比较慢也没关系。
  4. Frozen:该索引不再被更新,并且很少被查询。这些信息仍然需要可以被搜索到,但是如果这些查询非常慢也没关系。–7.12时新增的阶段
  5. Delete:索引不再需要了,可以安全地被删除。
阶段的过渡

ILM根据索引的时长在生命周期中移动指数。为了控制这些转换的时间,你为每个阶段设置一个最小时限。要使一个索引进入下一阶段,当前阶段的所有操作必须完成,并且该索引必须比下一阶段的最小年龄大。配置的最小时限必须在后续阶段之间增加,例如,一个最小时限为10天的 "Warm"阶段之后,只能是一个最小时限未设定或>=10天的 "Cold"阶段。

最小年龄默认为0,这使得ILM在当前阶段的所有操作完成后,立即将指数转移到下一个阶段。

如果一个索引有未分配的分片,并且集群健康状态为黄色,该索引仍然可以根据其索引生命周期管理策略过渡到下一个阶段。然而,由于Elasticsearch只能在绿色集群上执行某些清理任务,可能会有意想不到的副作用。

为了避免磁盘使用量增加和可靠性问题,请及时解决任何集群健康问题

阶段的执行

ILM控制一个阶段中的行动的执行顺序,以及执行哪些步骤来为每个行动执行必要的索引操作。

当一个索引进入一个阶段时,ILM在索引元数据中缓存了阶段定义。这确保了策略更新不会使索引进入一个永远无法退出阶段的状态。如果变化可以被安全地应用,ILM会更新缓存的阶段定义。如果不能,则使用缓存的定义继续执行阶段。

ILM定期运行,检查一个索引是否符合策略标准,并执行任何需要的步骤。为了避免竞赛条件,ILM可能需要运行一次以上来执行完成一个动作所需的所有步骤。例如,如果ILM确定一个索引符合滚动标准,它就开始执行完成滚动动作所需的步骤。如果它到达一个点,不能安全地推进到下一个步骤,则停止执行。下一次ILM运行时,ILM会从它停止的地方继续执行。这意味着即使indices.lifecycle.poll_interval被设置为10分钟,并且一个索引符合翻转标准,也可能在20分钟后翻转完成。

生命周期中的操作

ILM在各阶段支持的操作如下:详细见生命周期中的操作

HOTWarmColdFrozenDelete
Set Priority
Unfollow
Rollover
Read-Only
Shrink
Force Merge
Searchable Snapshot
Downsample
Allocate
Migrate
Wait For Snapshot
Delete
生命周期策略

一个索引的生命周期策略指定了哪些阶段是适用的,在每个阶段执行什么操作,以及何时在各阶段之间转换。

当你创建一个索引时,你可以手动应用一个生命周期策略。对于时间序列索引,你需要将生命周期策略与用于在该系列中创建新索引的索引模板联系起来。当一个索引翻转时,手动应用的策略不会自动应用到新的索引上。

如果你使用Elasticsearch的安全功能,ILM会以最后更新策略的用户身份执行操作。ILM只拥有在最后一次策略更新时分配给用户的角色。

索引翻滚

当对像日志或指标这样的时间序列数据进行索引时,你不能无限期地写到一个索引。为了满足你的索引和搜索性能要求并管理资源的使用,你向一个索引写入,直到达到某个阈值,然后创建一个新的索引并开始向它写入。使用滚动索引使你能够。

  • 优化活动索引,以便在高性能的节点上实现高摄入率。
  • 优化节点上的搜索性能。
  • 将旧的、不经常访问的数据转移到成本较低的节点上。
  • 根据你的保留政策,通过删除整个索引来删除数据。

我们建议使用data streams来管理时间序列数据。数据流自动跟踪写索引,同时将配置保持在最低水平。

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

  • 数据流的名称或通配符(*)模式。
  • 数据流的时间戳字段。这个字段必须被映射为datedate_nanos字段的数据类型,并且必须包含在每个索引到数据流的文档中。
  • 创建时应用于每个支持索引的映射和设置。

数据流是为仅有的附加数据而设计的,数据流名称可以作为操作(读、写、翻转、收缩等)目标。如果你的用例要求数据就地更新,你可以改用index aliases管理你的时间序列数据。然而,还有一些配置步骤和概念。

  • 一个索引模板,指定了系列中每个新索引的设置。你要优化这个配置,以便摄取,通常使用与你有热节点一样多的分片。
  • 一个索引别名,引用整个索引集。
  • 一个被指定为写索引的单一索引。这是处理所有写入请求的活动索引。在每次翻转时,新的索引会成为写入索引。
自动翻转

ILM使你能够根据索引大小、文件数或年龄等条件,自动翻转到一个新的索引。当翻转被触发时,一个新的索引被创建,写别名被更新以指向新的索引,并且所有后续的更新都被写入新的索引中。

基于大小、文档数量或时长的翻转到一个新的索引比基于时间的翻转更可取。在一个任意的时间翻转往往会导致许多小的索引,这可能会对性能和资源的使用产生负面影响。

生命周期策略配置

为了让ILM管理一个索引,必须在index.lifecycle.name索引设置中指定一个有效的策略。

要为滚动索引配置一个生命周期策略,你要创建策略并将其添加到索引模板中。

要使用策略来管理一个不滚动的索引,你可以在创建索引时指定一个生命周期策略,或者直接将策略应用到一个现有的索引。

ILM策略被存储在全局集群状态中,并且可以通过在拍摄快照时将include_global_state设置为true来包含在快照中。当快照被恢复时,全局状态下的所有策略被恢复,任何具有相同名称的本地策略被覆盖。

当你为Beats或Logstash Elasticsearch输出插件启用索引生命周期管理时,必要的策略和配置变化会自动应用。你可以修改默认策略,但你不需要明确配置策略或引导初始索引。

策略API

创建或者更新策略

新建一个名称为policy_1的策略。

PUT _ilm/policy/policy_1
{
  "policy": {
    "_meta": {
      "description": "主要使用说明",
      "project": {
        "name": "系统或项目名称",
        "department": "所属部门"
      }
    },
    "phases": {
      "warm": {
        "min_age": "10d",
        "actions": {
          "forcemerge": {
            "max_num_segments": 1
          }
        }
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}
  • _meta参数是可选的,Elasticsearch不会自动生成或使用。要取消_meta,请替换策略,不要指定一个。要检查_meta,你可以使用Get lifecycle policy API。从版本7.14开始明确支持此参数。
查询策略
# 查询所有的策略
GET _ilm/policy
# 查询名称为policy_1的策略
PUT _ilm/policy/policy_1

结果

{
  "policy_1": {
    "version": 1, 
    "modified_date": 82392349, 
    "policy": {
      "phases": {
        "warm": {
          "min_age": "10d",
          "actions": {
            "forcemerge": {
              "max_num_segments": 1
            }
          }
        },
        "delete": {
          "min_age": "30d",
          "actions": {
            "delete": {
              "delete_searchable_snapshot": true
            }
          }
        }
      }
    },
    "in_use_by" : { 
      "indices" : [],
      "data_streams" : [],
      "composable_templates" : []
    }
  }
}
  • version代表策略的版本号
  • in_use_by,代表策略应用到哪些地方了。从版本7.14开始明确支持此参数。
移除策略
POST my-index-000001/_ilm/remove
删除策略
DELETE _ilm/policy/policy_1

应用策略

将策略应用到索引模板
PUT _index_template/my_template
{
  "index_patterns": ["test-*"], 
  "template": {
    "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "index.lifecycle.name": "my_policy", 
      "index.lifecycle.rollover_alias": "test-alias" 
    }
  }
}
  • index.lifecycle.rollover_alias:定义一个索引别名,用于引用my_policy管理的索引。
创建一个初始管理的索引

当你为自己的滚动索引设置策略时,你需要手动创建第一个由策略管理的索引,并将其指定为写索引。

索引的名称必须符合索引模板中定义的模式,并以数字结尾。这个数字会被递增,以生成由滚动动作创建的索引的名称。

例如,下面这个请求创建了test-00001索引。因为它与my_template中指定的索引模式相匹配,Elasticsearch自动应用该模板中的设置。

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

现在你可以开始向生命周期策略中指定的滚动别名索引数据了。在my_policy策略样本中,一旦初始索引超过25GB,就会触发翻转动作。然后ILM创建一个新的索引,成为测试别名的写索引。

手动应用生命周期策略

不要手动应用使用翻转动作的策略。使用翻转的策略必须由索引模板应用。否则,当翻转动作创建一个新的索引时,该策略不会被转发。

创建式

PUT test-index
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "my_policy" 
  }
}

更新式

PUT mylogs-pre-ilm*/_settings 
{
  "index": {
    "lifecycle": {
      "name": "mylogs_policy_existing"
    }
  }
}

更改策略

你可以通过修改当前策略或切换到不同的策略来改变索引或滚动索引集合的生命周期的管理方式。

为了确保策略更新不会使索引进入不能退出当前阶段的状态,当它进入阶段时,阶段定义被缓存在索引元数据中。如果变化可以被安全地应用,ILM会更新缓存的阶段定义。如果不能,则使用缓存的定义继续执行阶段。

当索引进入下一个阶段时,它使用更新后的策略中的阶段定义。

要切换一个索引的生命周期策略,请遵循这些步骤:

  1. 使用移除策略API移除现有策略。针对一个数据流或别名,删除其所有索引的策略。

    POST logs-my_app-default/_ilm/remove
    
  2. 删除策略API会从索引中删除所有ILM元数据,并且不考虑索引的生命周期状态。这可能会使索引处于一个不希望的状态。

    例如,Forcemerge动作在重新打开一个索引之前暂时关闭了它。在forcemerge过程中移除索引的ILM策略会使索引无限期地关闭。

    在策略移除之后,使用get index API来检查一个索引的状态。以一个数据流或别名为目标,获取其所有索引的状态。

    GET logs-my_app-default
    

    然后你可以根据需要改变索引。例如,你可以使用打开索引API重新打开任何关闭的索引。

    POST logs-my_app-default/_open
    
  3. 使用更新设置API分配一个新的策略。以一个数据流或别名为目标,为其所有索引分配一个策略。

    PUT logs-my_app-default/_settings
    {
      "index": {
        "lifecycle": {
          "name": "new-lifecycle-policy"
        }
      }
    }
    

    不要在没有删除现有策略的情况下分配一个新的策略。这可能导致阶段性执行失败。

更改是如何应用的

当一个策略最初应用于一个索引时,该索引会得到该策略的最新版本。如果你更新策略,策略的版本会被撞开,ILM可以检测到索引正在使用一个需要更新的早期版本。

min_age的改变不会传播到缓存的定义。改变一个阶段的min_age不会影响当前正在执行该阶段的索引。

例如,如果你创建的策略有一个热阶段,但没有指定min_age,当策略被应用时,指数立即进入热阶段。如果你更新策略,指定热阶段的 "最小时限"为1天,这对已经处于热阶段的指数没有影响。在政策更新后创建的指数直到一天后才会进入热阶段。

如何应用新策略

当你将不同的策略应用于被管理的索引时,该索引使用先前策略的缓存定义完成当前阶段的工作。当索引进入下一阶段时,它开始使用新的策略。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顧棟

若对你有帮助,望对作者鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值