ES系列-- ILM索引生命周期管理

前言

官方文档地址7.8版本

正文

ILM定义了四个生命周期阶段:
Hot:正在积极地更新和查询索引。
Warm:不再更新索引,但仍在查询。
cold:不再更新索引,很少查询。信息仍然需要可搜索,但是如果这些查询速度较慢也可以。
Delete:不再需要该索引,可以安全地将其删除。

ILM定期运行(indices.lifecycle.poll_interval),默认是10分钟,检查索引是否符合策略标准,并执行所需的任何步骤。
为了避免争用情况,ILM可能需要运行多次以执行完成一项动作所需的所有步骤。所以,即使indices.lifecycle.poll_interval设置为10分钟并且索引符合rollover,也可能需要20分钟才能完成rollover。
举例:比如我们设定超过10篇文档就rollover,但是因为这个过程不是立即实现的,可能第11,12篇还在落在之前的索引上,直到rollover成功后,新建的文档才会落在新的索引上。

注意:

为确保策略更新不会将索引置于无法退出当前阶段的状态,进入阶段时,阶段定义会缓存在索引元数据中。此缓存的定义用于完成该阶段。
当索引前进到下一阶段时,它将使用更新策略中的阶段定义。

ilm默认是启动的,状态为running,可以使用下面的api操作一下。

# 查看状态
GET _ilm/status
# 启动
POST _ilm/start
# 停止
POST _ilm/stop

rollover

这个是比较常用的,单独拿出来。
rollover可以基于大小,文档数或使用期限创建新的索引去保存数据。

操作体验下:

1.创建一条策略
# 创建一条策略(这里设置超过3条数据就rollover)
PUT _ilm/policy/test-policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_docs": 3
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "delete": {
        "min_age": "220d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

# 顺带列一下其它的api,如下:
# 查询
GET _ilm/policy

GET _ilm/policy/<policy_id>

# 删除策略
DELETE _ilm/policy/<policy_id>

# 从index中移除策略
POST <index>/_ilm/remove
# 查看索引当前所在生命周期状态
GET <index>/_ilm/explain
# 重试,一般通过explain查看策略状态,如果是error,则按照错误信息更新策略,然后可以执行retry进行重试
POST <index>/_ilm/retry
2. 创建index template应用策略:
# 创建index模板
PUT _index_template/test-template
{
  "index_patterns": ["test-*"],
  "template":{
     "settings": {
      "number_of_shards": 1,
      "number_of_replicas": 0,
      "index.lifecycle.name": "test-policy",    
      "index.lifecycle.rollover_alias": "test-index"  
    }
  }
}

也可以创建index 然后应用策略:
注意:
1.rollover操作的策略一般不会这样直接应用给index,而是使用index template,不然rollover新生成的索引没有应用到策略。
2.要给自己创建的索引应用生命策略时,要手动的创建第一个初始索引,并将其指定为写入索引,索引名称必须与索引模板中定义的模式匹配,并以数字结尾。(
为Beats或Logstash Elasticsearch输出插件启用索引生命周期管理时,必要的策略和配置更改将自动应用。您可以修改默认策略,但无需显式配置策略或引导初始索引。)

# 创建索引时指定生命策略
PUT test-000001
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "my_policy" 
  }
}

# 或者,直接给index应用策略
PUT test-000001/_settings 
{
  "index": {
    "lifecycle": {
      "name": "mylogs_policy_existing"
    }
  }
}

这个可以直接移动生命周期:

POST _ilm/move/my-index-000001
{
  "current_step": { 
    "phase": "new",
    "action": "complete",
    "name": "complete"
  },
  "next_step": { 
    "phase": "warm",
    "action": "forcemerge",
    "name": "forcemerge"
  }
}
3.创建index

这里创建一个符合索引模板的index,并向里面插入4条数据,
然后可以通过GET <index>/_ilm/explain查看状态,等到状态为完成了,再插入新数据,就可以看到自动创建了一个新的索引。

# 手动创建初始索引,数字结尾,并指定为写入索引
PUT test-000001
{
  "aliases": {
    "test-alias": {
      "is_write_index": true
    }
  }
}

测试的时候可以通过修改配置项,来缩短ILM检测时间间隔。

PUT /_cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval": "1m" 
  }
}

actions

上面的rellover其实就是hot阶段里的一个action,在不同的生命阶段,支持的actions不完全一样,具体的如下:
Hot
Set Priority
Unfollow
Rollover
Warm
Set Priority
Unfollow
Read-Only
Allocate
Shrink
Force Merge
Cold
Set Priority
Unfollow
Allocate
Freeze
Delete
Wait For Snapshot
Delete

简单介绍下上面列举的actions。

Set Priority

设置索引的优先级。节点重新启动后,将按优先级从高到低恢复索引。

通常,热阶段的索引应具有最高值,而冷阶段的索引应具有最低值。例如:100为热相,50为热相,0为冷相。未设置此值的索引的默认优先级为1。

值必须为0或更大。设置为null删除优先级。

示例:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "set_priority" : {
            "priority": 50
          }
        }
      }
    }
  }
}
Unfollow

将CCR跟随者索引转换为常规索引。这使得可以在跟随者索引上安全地执行收缩,翻转和可搜索快照操作。您还可以在生命周期中移动关注者索引时直接使用取消关注。
对不是跟随者的索引没有影响,阶段执行只是移至下一个动作。

注意:

当将Shrink 和 Rollover 操作应用于跟随者索引时,该操作将自动触发。

该操作将一直等到将跟随者索引转换为常规索引是安全的。必须满足以下条件:

1.Leader索引的index.lifecycle.indexing_complete必须为true。如果使用 Rollover 操作领导者索引,则会自动发生 ,并且可以使用索引设置API手动设置。
2.对领导者索引执行的所有操作都已复制到跟随者索引。这样可以确保在转换索引时不会丢失任何操作。

满足这些条件后,取消关注将执行以下操作:

1.暂停跟随者索引。
2.关闭关注者索引。
3.取消关注领导者索引。
4.打开跟随者索引(此时为常规索引)。

示例:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "unfollow" : {}
        }
      }
    }
  }
}
Read-Only

设置索引为只读

示例:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "readonly" : { }
        }
      }
    }
  }
}
Allocate

示例:

# 节点增加属性,在elasticsearch.yml里面
node.attr.{attribute}: {value}
# 例如:增加一个size属性
node.attr.size: medium
# 索引分配过滤器设置
# 将索引分配给其节点{attribute}至少具有一个逗号分隔值的节点。
index.routing.allocation.include.{attribute}
# 将索引分配给{attribute}具有所有逗号分隔值的节点。
index.routing.allocation.require.{attribute}
# 分配索引到其一个节点{attribute}具有无逗号分隔值的。
index.routing.allocation.exclude.{attribute}

# 创建模板时指定分配到有hot属性的节点
PUT _template/test_template
{
  "index_patterns": ["logs*"],                 
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "logs_policy", 
    "index.routing.allocation.require.data": "hot",
    "index.lifecycle.rollover_alias": "logs"    
  }
}

# 这个是分配hot,warm阶段的索引到属性box_type,值为hot或warm的节点上
PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": { 
      "warm": {
        "actions": {
          "allocate" : {
            "include" : {
              "box_type": "hot,warm"
            }
          }
        }
      }
    }
  }
}

Shrink

将索引设置为只读, 并将其收缩为具有更少主碎片的新索引。新索引的名称为形式 shrink-<original-index-name>。例如,如果源索引的名称为logs,则收缩索引的名称为shrink-logs。

shrink 操作将索引的所有主碎片分配到一个节点,因此它可以调用shrink API来收缩索引。收缩后,它将指向原始索引的别名交换为新的收缩索引。

注意:

如果对跟随者索引使用了收缩操作,则策略执行将等待,直到领导索引翻转(或 以其他方式标记为完成),然后在执行收缩操作之前使用Unfollow操作将跟随者索引转换为常规索引 。

示例:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "shrink" : {
            "number_of_shards": 1
          }
        }
      }
    }
  }
}

Force Merge

强制合并索引到一个更大的segments。

注意:

1.该操作会使索引变为  read-only   
2.如果要在hot阶段使用,则必须有 rollover 。没有的话,ILM会拒绝这个策略。

示例:
max_num_segments: 合并后的数量,如果要完全合并,应设置为1。

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "warm": {
        "actions": {
          "forcemerge" : {
            "max_num_segments": 1
          }
        }
      }
    }
  }
}
Freeze

冻结索引,这个可以缩小占用的内存。

示例:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "cold": {
        "actions": {
          "freeze" : { }
        }
      }
    }
  }
}
Wait For Snapshot

等待快照,这个可以保证索引在被删除之前执行快照相关计划。

示例:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "delete": {
        "actions": {
          "wait_for_snapshot" : {
            "policy": "slm-policy-name"
          }
        }
      }
    }
  }
}
Delete

删除索引。

示例:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "delete": {
        "actions": {
          "delete" : { }
        }
      }
    }
  }
}

跳过Rollover

index.lifecycle.indexing_complete设置为true,则ILM不会对索引执行过渡操作,即使它符合过渡条件。
一般当过渡操作成功完成时,它会由ILM自动设置。

注意:果index.lifecycle.indexing_complete为is true,则ILM验证索引不再是由所指定的别名的写入索引index.lifecycle.rollover_alias。如果索引仍然是写索引或未设置过渡别名,那么索引将移至ERROR step。

例如:如果我们需要更改新索引的名称,同时保留之前的索引配置的策略,可以按照下面的步骤:
1.创建新的索引模板使用相同的这个生命策略
2.创建初始索引
3.通过 index aliases API 修改索引别名的写入索引是新的索引

# 将新创建的索引增加别名test-alias,并设置为写入索引
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "test-new-000001",
        "alias": "test-alias",
        "is_write_index": true
      }
    }
  ]
}

4.将旧索引的index.lifecycle.indexing_complete设置为 true.

PUT test-000001
{
    "index.lifecycle.indexing_complete": true
}

在实际应用中,如果我们想另外从一个数字基点开始rollover,我们可以 创建新的index设置为写入索引,然后将旧的index都更新"index.lifecycle.indexing_complete": true即可。

恢复托管索引

假如我们恢复快照时,快照中包含有被生命策略管理的索引,生命策略里的min_age是针对索引创建或者Rollover时的时间,而不是恢复快照的时间,索引它按照相同的计划执行策略操作。
但是我们可能想在它进入下下一个生命阶段,变成只读或者合并之前,添加或更新文档,或防止立即删除操作,我们可以如下操作:
1.暂时停止ILM。这将暂停所有ILM策略的执行。
2.恢复快照。
3.在ILM恢复策略执行之前,从索引中删除策略或执行所需的任何操作。
4.重新启动ILM以恢复策略执行。


想要了解更多,可以通过 elk相关知识地图 来找到你想要了解的部分进行查看。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值