前言
正文
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以恢复策略执行。