索引生命周期操作
edit索引生命周期操作
edit- Allocate
- 将分片移动到具有不同性能特征的节点,并减少副本数量。
- Delete
- 永久删除索引。
- Force merge
- 减少索引段的数量并清除已删除的文档。
- Migrate
- 将索引分片移动到与当前ILM阶段对应的数据层。
- Read only
- 阻止对索引的写操作。
- Rollover
- 移除索引作为翻转别名的写入索引,并开始索引到新的索引。
- Downsample
- 聚合一个索引的时间序列数据,并将结果存储在一个新的只读索引中。例如,您可以将每小时的数据降采样为每日或每周的摘要。
- Searchable snapshot
- 在配置的存储库中获取托管索引的快照,并将其挂载为可搜索的快照。
- Set priority
- 降低索引在其生命周期中的优先级,以确保首先恢复热索引。
- Shrink
- 通过将索引收缩到一个新索引中来减少主分片的数量。
- Unfollow
- 将追随者索引转换为常规索引。 在执行翻转、收缩或可搜索快照操作之前自动执行。
- Wait for snapshot
- 确保在删除索引之前存在快照。
分配
edit允许的阶段:温暖,寒冷。
更新索引设置以更改允许托管索引分片的节点,并更改副本数量。
在热阶段不允许进行分配操作。 索引的初始分配必须手动完成或通过 索引模板完成。
您可以配置此操作来修改分配规则和副本数量,仅修改分配规则,或仅修改副本数量。 有关Elasticsearch如何使用副本进行扩展的更多信息,请参阅 准备生产环境。有关控制Elasticsearch在何处分配特定索引的分片的更多信息,请参阅 索引级分片分配过滤。
选项
edit您必须指定副本数量或至少一个include、exclude或require选项。空的分配操作是无效的。
有关使用自定义属性进行分片分配的更多信息,请参阅索引级别分片分配过滤。
-
number_of_replicas - (可选, 整数) 分配给索引的副本数量。
-
total_shards_per_node -
(可选, 整数)
单个 Elasticsearch 节点上索引的最大分片数。值为
-1表示无限制。请参阅 每个节点的总分片数。 -
include - (可选, 对象) 为至少具有指定自定义属性之一的节点分配一个索引。
-
exclude - (可选, 对象) 将索引分配给没有任何指定自定义属性的节点。
-
require - (可选, 对象) 将索引分配给具有所有指定自定义属性的节点。
示例
edit以下策略中的分配操作将索引的副本数量更改为2。
任何单个节点上放置的索引分片数量不会超过200个。否则,索引分配规则不会更改。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"allocate" : {
"number_of_replicas" : 2,
"total_shards_per_node" : 200
}
}
}
}
}
}
使用自定义属性将索引分配给节点
edit以下策略中的分配操作将索引分配给具有box_type为热或温的节点。
要指定节点的 box_type,您可以在节点配置中设置一个自定义属性。
例如,在 elasticsearch.yml 中设置 node.attr.box_type: hot。
有关更多信息,请参阅 启用索引级分片分配过滤。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"allocate" : {
"include" : {
"box_type": "hot,warm"
}
}
}
}
}
}
}
根据多个属性将索引分配给节点
edit分配操作还可以根据多个节点属性为节点分配索引。以下操作根据box_type和storage节点属性分配索引。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"cold": {
"actions": {
"allocate" : {
"require" : {
"box_type": "cold",
"storage": "high"
}
}
}
}
}
}
}
将索引分配到特定节点并更新副本设置
edit在以下策略中,分配操作将索引更新为每个分片有一个副本,并分配到具有box_type为冷的节点。
要指定节点的box_type,您可以在节点配置中设置一个自定义属性。
例如,在elasticsearch.yml中设置node.attr.box_type: cold。
有关更多信息,请参阅启用索引级分片分配过滤。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"allocate" : {
"number_of_replicas": 1,
"require" : {
"box_type": "cold"
}
}
}
}
}
}
}
删除
edit允许的阶段:删除。
永久删除索引。
选项
edit示例
editPUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"delete": {
"actions": {
"delete" : { }
}
}
}
}
}
强制合并
edit允许的阶段:热,暖。
在执行forcemerge期间正在重新定位的分片将不会被合并。
要在hot阶段使用forcemerge操作,rollover操作必须存在。
如果没有配置rollover操作,ILM将拒绝该策略。
选项
edit示例
editPUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"forcemerge" : {
"max_num_segments": 1
}
}
}
}
}
}
迁移
edit允许的阶段:温暖,寒冷。
通过更新 index.routing.allocation.include._tier_preference 索引设置,将索引移动到与当前阶段对应的 数据层。
ILM 会自动在 warm 和 cold 阶段注入 migrate 操作。要防止自动迁移,您可以显式包含 migrate 操作并将 enabled 选项设置为 false。
如果冷阶段定义了一个可搜索快照操作,迁移操作将不会自动注入到冷阶段,因为托管索引将直接挂载在目标层级上,使用与迁移操作配置相同的_tier_preference基础设施。
在暖阶段,migrate 操作将 index.routing.allocation.include._tier_preference
设置为 data_warm,data_hot。这将索引移动到
暖层中的节点。如果没有暖层的节点,则会回退到
热层。
在冷阶段,migrate 操作将
index.routing.allocation.include._tier_preference
设置为 data_cold,data_warm,data_hot。这将索引移动到
冷层中的节点。如果没有冷层中的节点,它将回退到
暖层,或者如果没有暖层节点可用,则回退到 热层。
在冻结阶段不允许进行迁移操作。冻结阶段直接使用index.routing.allocation.include._tier_preference为data_frozen的可搜索快照进行挂载。这会将索引移动到冻结层中的节点。
在热阶段不允许进行迁移操作。 初始索引分配是自动执行的, 并且可以通过索引模板手动配置。
选项
edit-
enabled -
(可选, 布尔值)
控制在此阶段ILM是否自动迁移索引。
默认为
true。
示例
edit在以下策略中,指定了分配操作,以在ILM将索引迁移到暖节点之前减少副本数量。
明确指定迁移操作不是必需的——ILM会自动执行迁移操作,除非您禁用迁移。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"migrate" : {
},
"allocate": {
"number_of_replicas": 1
}
}
}
}
}
}
禁用自动迁移
edit以下策略中的迁移操作已禁用,并且分配操作将索引分配给具有rack_id为一或二的节点。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"migrate" : {
"enabled": false
},
"allocate": {
"include" : {
"rack_id": "one,two"
}
}
}
}
}
}
}
只读
edit允许的阶段:热、温、冷。
使索引数据变为只读; 禁止对索引进行数据写操作。
要在hot阶段使用readonly操作,rollover操作必须存在。
如果没有配置rollover操作,ILM将拒绝该策略。
选项
edit无。
示例
editPUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"readonly" : { }
}
}
}
}
}
滚动更新
edit允许的阶段:热。
当现有索引满足指定的滚动更新条件时,将目标滚动更新到新索引。
当一个索引被滚动更新时,前一个索引的年龄会被更新以反映滚动更新的时间。
这个日期,而不是索引的creation_date,用于索引生命周期管理
min_age阶段计算。了解更多。
翻转目标可以是一个数据流或一个索引别名。当目标是一个数据流时,新索引成为数据流的写入索引,并且其代数递增。
要滚动索引别名,别名及其写入索引必须满足以下条件:
-
索引名称必须匹配模式 ^.*-\d+$,例如 (
my-index-000001)。 -
必须将
index.lifecycle.rollover_alias配置为要滚动的别名。 - 索引必须是别名的 写入索引。
例如,如果 my-index-000001 有别名 my_data,
则必须配置以下设置。
PUT my-index-000001
{
"settings": {
"index.lifecycle.name": "my_policy",
"index.lifecycle.rollover_alias": "my_data"
},
"aliases": {
"my_data": {
"is_write_index": true
}
}
}
选项
edit滚动操作必须指定至少一个max_*条件,它可以包括零个或多个min_*条件。空的滚动操作是无效的。
当任何max_*条件满足且所有min_*条件满足时,索引将会滚动更新。但请注意,默认情况下空索引不会被滚动更新。
-
max_age - (可选, 时间单位) 在索引创建后达到最大经过时间时触发翻转。 经过的时间始终从索引创建时间开始计算,即使索引起始日期配置为自定义日期,例如在使用 index.lifecycle.parse_origination_date 或 index.lifecycle.origination_date 设置时。
-
max_docs - (可选, 整数) 在达到指定的最大文档数量后触发滚动更新。 自上次刷新以来添加的文档不计入文档数量。 文档数量不包括副本分片中的文档。
-
max_size -
(可选, 字节单位) 当索引达到一定大小时触发滚动更新。 这是索引中所有主分片的总大小。 副本不计入最大索引大小。
要查看当前索引大小,请使用_cat indices API。
pri.store.size值显示所有主分片的总大小。 -
max_primary_shard_size -
(可选,字节单位) 当索引中最大的主分片达到一定大小时触发翻转。 这是索引中主分片的最大大小。与
max_size一样,副本被忽略。要查看当前分片大小,请使用 _cat shards API。
store值显示每个分片的大小,而prirep指示分片是主分片(p)还是副本(r)。 -
max_primary_shard_docs -
(可选,整数) 当索引中最大的主分片达到一定数量的文档时触发翻转。 这是索引中主分片的文档最大数量。与
max_docs一样,副本被忽略。要查看当前分片的文档,请使用 _cat shards API。
docs值显示每个分片的文档数量。 -
min_age -
(可选, 时间单位)
防止在索引创建后达到最小经过时间之前进行滚动更新。
参见关于
max_age的注释。 -
min_docs -
(可选,整数)
在达到指定的最小文档数量之前,防止滚动更新。
参见关于
max_docs的注释。 -
min_size -
(可选,字节单位)
防止索引达到一定大小时进行滚动更新。
参见关于
max_size的注释。 -
min_primary_shard_size -
(可选,字节单位)
防止在索引中最大的主分片达到一定大小时进行滚动更新。
参见关于
max_primary_shard_size的注释。 -
min_primary_shard_docs -
(可选,整数)
防止在索引中最大的主分片达到一定数量的文档之前发生翻转。
请参阅关于
max_primary_shard_docs的注释。
即使空索引具有关联的 max_age,也不会进行滚动更新,这通常会导致滚动更新发生。策略可以通过添加 "min_docs": 0 条件来覆盖此行为,并显式选择滚动更新空索引。这也可以通过将 indices.lifecycle.rollover.only_if_has_documents 设置为 false 来在集群范围内禁用。
如果一个或多个分片包含200000000或更多文档,滚动操作将隐式地总是滚动一个数据流或别名。通常情况下,一个分片在达到200M文档之前会先达到50GB,但对于空间高效的数据集来说,情况并非如此。如果一个分片包含超过200M的文档,搜索性能很可能会受到影响。这就是内置限制的原因。
示例
edit基于最大主分片大小的滚动更新
edit当最大的主分片至少为50GB时,此示例会滚动索引。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover" : {
"max_primary_shard_size": "50gb"
}
}
}
}
}
}
基于索引大小的滚动
edit当索引至少为100GB时,此示例会滚动索引。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover" : {
"max_size": "100gb"
}
}
}
}
}
}
基于文档数量的滚动
edit当索引包含至少一亿个文档时,此示例会滚动索引。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover" : {
"max_docs": 100000000
}
}
}
}
}
}
基于最大主分片文档数的滚动更新
edit当最大的主分片包含至少一千万个文档时,此示例会将索引滚动更新。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover" : {
"max_primary_shard_docs": 10000000
}
}
}
}
}
}
基于索引年龄的滚动
edit如果索引是在至少7天前创建的,此示例会将索引滚动。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover" : {
"max_age": "7d"
}
}
}
}
}
}
使用多条件进行滚动
edit当您指定多个滚动条件时,
当满足任意一个max_*和所有的min_*条件时,索引将被滚动。
此示例在索引至少7天或至少100GB时滚动索引,
但前提是索引至少包含1000个文档。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover" : {
"max_age": "7d",
"max_size": "100gb",
"min_docs": 1000
}
}
}
}
}
}
在保持分片大小的情况下滚动更新
edit当主分片大小至少为50gb,或者索引至少有30天大时,此示例会滚动索引,但前提是主分片至少为1gb。对于低容量索引,这可以防止创建许多小分片。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover" : {
"max_primary_shard_size": "50gb",
"max_age": "30d",
"min_primary_shard_size": "1gb"
}
}
}
}
}
}
滚动条件块阶段转换
edit仅当满足其中一个条件时,滚动操作才会完成。 这意味着在滚动成功之前,任何后续阶段都会被阻塞。
例如,以下策略在索引滚动更新后一天删除该索引。 它不会在索引创建后一天删除该索引。
PUT /_ilm/policy/rollover_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50gb"
}
}
},
"delete": {
"min_age": "1d",
"actions": {
"delete": {}
}
}
}
}
}
下采样
edit允许的阶段:热、温、冷。
聚合一个时间序列(TSDS)索引并存储预先计算的统计摘要(最小值、最大值、总和、值计数 和 平均值),这些摘要按配置的时间间隔对每个指标字段进行分组。例如,一个包含每10秒采样一次指标的TSDS索引可以被降采样到一个每小时索引。在一个小时间隔内的所有文档被汇总并存储为一个文档,并存储在降采样索引中。
此操作对应于 downsample API。
生成的降采样索引的名称是
downsample-。如果ILM对数据流的备份索引执行
downsample操作,降采样索引将成为同一流的备份索引,并且源索引将被删除。
要在hot阶段使用downsample操作,rollover操作必须存在。如果没有配置rollover操作,ILM将拒绝该策略。
示例
editPUT _ilm/policy/datastream_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_docs": 1
},
"downsample": {
"fixed_interval": "1h"
}
}
}
}
}
}
可搜索快照
edit允许的阶段:热,冷,冷冻。
在配置的存储库中获取托管索引的快照,并将其挂载为可搜索快照。如果索引是数据流的一部分,则挂载的索引将替换流中的原始索引。
The searchable_snapshot action requires 数据层。该操作使用
index.routing.allocation.include._tier_preference
设置将索引直接挂载到与阶段对应的数据层。在冻结阶段,该操作将一个前缀为 partial- 的部分挂载索引挂载到冻结层。在其他阶段,该操作将一个前缀为 restored- 的完全挂载索引挂载到相应的数据层。
在冻结层中,操作将忽略原始索引中存在的
index.routing.allocation.total_shards_per_node 设置,
以考虑冻结层与其他层之间节点数量的差异。要为可搜索快照设置
index.routing.allocation.total_shards_per_node,请在 ILM 策略的冻结阶段中的
searchable_snapshot 操作内设置 total_shards_per_node 选项。
不要在热阶段和冷阶段中同时包含searchable_snapshot操作。这可能导致索引在冷阶段无法自动迁移到冷层。
如果在热阶段使用了searchable_snapshot操作,则后续阶段不能包含shrink或forcemerge操作。
此操作无法在数据流的写入索引上执行。尝试这样做将会失败。要将索引转换为可搜索快照,首先需要手动滚动数据流。这将创建一个新的写入索引。由于该索引不再是流的写入索引,因此可以将其转换为可搜索快照。使用在热阶段中使用滚动操作的策略将避免这种情况,并且无需为未来的托管索引进行手动滚动。
挂载和重新定位可搜索快照索引的分片涉及从快照存储库复制分片内容。这可能会产生与常规索引在节点之间复制时不同的成本。这些成本通常较低,但在某些环境中可能会更高。有关更多详细信息,请参阅通过可搜索快照降低成本。
默认情况下,此快照会在删除阶段的删除操作中被删除。
要保留快照,请在删除操作中将delete_searchable_snapshot设置为false。此快照保留基于索引生命周期管理(ILM)策略运行,不受快照生命周期管理(SLM)策略的影响。
选项
edit在执行forcemerge期间正在重新定位的分片将不会被合并。
即使并非所有分片都被强制合并,searchable_snapshot操作仍将继续执行。
这种强制合并发生在索引处于之前的阶段,即searchable_snapshot操作之前。例如,如果在hot阶段使用searchable_snapshot操作,强制合并将在热节点上执行。如果在cold阶段使用searchable_snapshot操作,强制合并将在索引处于之前的阶段(无论是hot还是warm)的任何层级上执行。
-
total_shards_per_node - 可搜索快照索引将分配给单个节点的分片(副本和主分片)的最大数量。默认为无限制。
示例
editPUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"cold": {
"actions": {
"searchable_snapshot" : {
"snapshot_repository" : "backing_repo"
}
}
}
}
}
}
设置优先级
edit允许的阶段:热、温、冷。
设置索引的优先级, 一旦策略进入热、温或冷阶段。 优先级较高的索引在节点重启后会优先于优先级较低的索引进行恢复。
通常,热阶段的索引应具有最高值,冷阶段的索引应具有最低值。 例如:热阶段为100,暖阶段为50,冷阶段为0。 未设置此值的索引具有默认优先级1。
选项
edit-
priority -
(必需, 整数)
索引的优先级。
必须为0或更大。
设置为
null以移除优先级。
示例
editPUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"set_priority" : {
"priority": 50
}
}
}
}
}
}
收缩
edit允许的阶段:热,暖。
源索引上的块写入并将其收缩为具有较少主分片的新索引。生成的索引名称是
shrink-。此操作对应于
收缩索引 API。
在执行了shrink操作后,任何指向源索引的别名都会指向新的收缩索引。如果ILM对数据流的备份索引执行了shrink操作,收缩后的索引将替换流中的源索引。您不能对写入索引执行shrink操作。
要在hot阶段使用shrink操作,rollover操作必须存在。如果没有配置rollover操作,ILM将拒绝该策略。
收缩操作将取消设置索引的 index.routing.allocation.total_shards_per_node 设置,这意味着将没有限制。这是为了确保索引的所有分片都可以复制到单个节点上。此设置更改将在步骤完成后继续保留在索引上。
收缩选项
edit-
number_of_shards -
(可选,整数)
要缩减到的分片数量。
必须是源索引分片数量的因数。此参数与
max_primary_shard_size冲突,只能设置其中一个。 -
max_primary_shard_size -
(可选, 字节单位)
目标索引的最大主分片大小。用于为目标索引找到最佳的分片数量。
当设置此参数时,目标索引中每个分片的存储大小将不会超过此参数。
目标索引的分片数量仍然是源索引分片数量的一个因素,但如果此参数小于源索引中单个分片的大小,则目标索引的分片数量将等于源索引的分片数量。
例如,当此参数设置为50gb时,如果源索引有60个主分片,总计100gb,则目标索引将有2个主分片,每个分片大小为50gb;如果源索引有60个主分片,总计1000gb,则目标索引将有20个主分片;如果源索引有60个主分片,总计4000gb,则目标索引仍将有60个主分片。此参数与
settings中的number_of_shards冲突,只能设置其中一个。 -
allow_write_after_shrink - (可选,布尔值) 如果为 true,则通过移除 写入块 使收缩后的索引可写。默认为 false。
示例
edit显式设置新缩减索引的分片数量
editPUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"shrink" : {
"number_of_shards": 1
}
}
}
}
}
}
计算缩减索引的最佳主分片数量
edit以下策略使用max_primary_shard_size参数来自动计算新缩小索引的主分片数量,基于源索引的存储大小。
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"shrink" : {
"max_primary_shard_size": "50gb"
}
}
}
}
}
}
缩减的分片分配
edit在执行shrink操作期间,ILM将源索引的主分片分配给一个节点。缩减索引后,ILM会根据您的分配规则将缩减后的索引的分片重新分配到适当的节点。
这些分配步骤可能因以下原因失败:
-
在执行
shrink操作期间,一个节点被移除。 - 没有节点有足够的磁盘空间来托管源索引的分片。
- 由于冲突的分配规则,Elasticsearch无法重新分配缩小的索引。
当其中一个分配步骤失败时,ILM会等待在
index.lifecycle.step.wait_time_threshold
中设置的时间段,默认值为12小时。此阈值时间段允许集群解决导致分配失败的任何问题。
如果阈值期过后,ILM尚未缩小索引,ILM会尝试将源索引的主分片分配到另一个节点。如果ILM缩小了索引但在阈值期内无法重新分配缩小索引的分片,ILM将删除缩小后的索引并重新尝试整个shrink操作。
取消关注
edit允许的阶段:热、温、冷、冻结。
将一个CCR跟随者索引转换为常规索引。 这使得可以在跟随者索引上安全地执行收缩、滚动更新和可搜索快照操作。 您也可以在通过生命周期移动跟随者索引时直接使用取消跟随操作。 对非跟随者索引没有影响,阶段执行只是移动到下一个操作。
此操作会等待,直到可以安全地将跟随者索引转换为常规索引。 必须满足以下条件:
一旦满足这些条件,unfollow 将执行以下操作:
- 暂停对从属索引的索引。
- 关闭从属索引。
- 取消从属索引的跟随。
- 打开从属索引(此时它是一个常规索引)。
选项
edit无。
示例
editPUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"unfollow" : {}
}
}
}
}
}