• 对于注定会优秀的人来说,他所需要的,只是时间!
  • 手懒得,必受贫穷,手勤的,必得富足----《圣经》
  • 帮助别人,成就自己。愿君在本站能真正有所收获!
  • 如果你在本站中发现任何问题,欢迎留言指正!
  • 宝剑锋从磨砺出,梅花香自苦寒来!

<二十二>ELK-学习笔记–elasticsearch-ILM-索引生命周期管理探微

本文预计阅读时间 13 分钟

索引生命周期管理将会是es维护管理中重要的一环,生产中已经有一个集群用的 7.x 版本,一直也没有使用自带的生命周期管理工具,今天就来研究一下,现在先通过简单的例子来理解这个功能以及用法。

1,快速体验

1,创建索引策略

我们可以在kibana设置的图形界面里配置索引策略,但是使用工具来进行管理维护显得更加方便便捷。

PUT _ilm/policy/eryajf_policy 
{
  "policy": {                       
    "phases": {
      "hot": {                      
        "actions": {
              "rollover":{
                  "max_age":"30s"
              }
        }
      },
      "delete": {
        "min_age": "90s",           
        "actions": {
          "delete": {}              
        }
      }
    }
  }
}

这里为了演示方便,定义了索引在hot节点保留10s,然后就会触发滚动策略到delete阶段,到delete阶段之后,保留60s左右,就会删除,在这个过程中,我们能够比较清晰地看到索引在声明周期中的变化。

2,创建索引模板

PUT _template/template_eryajf
{
  "index_patterns": ["eryajf*"],                 
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "eryajf_policy",      
    "index.lifecycle.rollover_alias": "eryajf"    
  }
}
  • index_patterns: 索引以 eryajf 开头的自动采用settings的配置,事实上这里还可以加入mapping等的的配置,不是本文重点,不再赘述。
  • index.lifecycle.name:表示采用 eryajf_policy这个策略
  • index.lifecycle.rollover_alias:表示索引滚动策略基于eryajf这个别名进行管理,注意,这个别名相当重要。

3,创建索引

此处需要注意的是,创建的索引后缀需要带有数字并以中横杠分割,否则在策略应用的时候会报如下错误:

illegal_argument_exception: index name [liql-test] does not match pattern '^.*-\d+$',至少在我当前使用的版本当中,是有这样一个限制的,亦即:索引必须以中横杠分割且以数字结尾

PUT eryajf-1
{
  "aliases": {
    "eryajf": {
      "is_write_index": true
    }
  }
}

4,配置lifecycle检测时间

PUT _cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval": "10s" 
  }
}

默认策略轮询时间间隔为十分钟,这里改成10秒,是为了方便观察滚动效果。

5,功能验证

实际操作之前,首先来描述下将要操作与验证的流程:

  1. 查看当前情况。
  2. 往索引写入3条数据,间隙赶忙观察索引状态变化。
  3. 看到索引已经成功轮替之后,再往索引写入6条数据,注意数据落点在何处。
  4. 然后再多观察几轮,就能大概体会生命周期管理的意义了。

验证之前,可以先看一下当前索引状况:

image-20200729200115588

然后批量写入几条数据,注意这个地方,写数据的索引是 eryajf,也就是上边配置的别名。实际生产当中,也应该往这个别名里写内容,而非其他。

PUT /eryajf/_doc/_bulk
{"index":{}}
{"message":"hello-01"}
{"index":{}}
{"message":"hello-02"}
{"index":{}}
{"message":"hello-03"}

此时通过如下命令进行观测:

GET eryajf-*/_ilm/explain

记得及时观测变化情况,重点是数据落脚点,此时落到了新的滚动索引 eryajf-000002上。

image-20200729200217637

稍微等一下,看到再次滚动之后,再写入6条数据:

PUT /eryajf/_doc/_bulk
{"index":{}}
{"message":"hello-01"}
{"index":{}}
{"message":"hello-02"}
{"index":{}}
{"message":"hello-03"}
{"index":{}}
{"message":"hello-04"}
{"index":{}}
{"message":"hello-05"}
{"index":{}}
{"message":"hello-06"}

然后观测数据落脚点,可以看到落到了新的轮替索引上了,就是如此轮替的一个方案。

大概经过15秒之后,可以看到索引名称更新了,新的索引名叫 然后再过30秒左右,数据也就被删除了。

2,索引策略详解

  • 策略可以定义四个阶段
    • hot
    • warm
    • cold
    • delete
  • 滚动的依据有三种情况
    • max_age:在当前阶段索引保留最长时间(以索引创建时间为准)
    • max_size:在当前阶段索引保留最大大小
    • max_docs:在当前阶段索引保留最多文档数

一个相对完整的索引策略如下:

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_age": "7d",    //rollover前距离索引的创建时间最大为7天
            "max_size": "50G",  //rollover前索引的最大大小不超过50G
            "max_docs": 1,      //rollover前索引的最大文档数不超过1个(测试用)
          }
        }
      },
      "warm": {
        "min_age": "30d",       //rollover之后进入warm阶段的时间不小于30天
        "actions": {
          "forcemerge": {
            "max_num_segments": 1   //强制分片merge到segment为1
          },
          "shrink": {
            "number_of_shards": 1   //收缩分片数为1
          },
          "allocate": {
            "number_of_replicas": 2 //副本数为2
          }
        }
      },
      "cold": {
        "min_age": "60d",       //rollover之后进入cold阶段的时间不小于60天
        "actions": {
          "allocate": {
            "require": {
              "type": "cold"    //分配到cold 节点,ES可根据机器资源配置不同类型的节点
            }
          }
        }
      },
      "delete": {
        "min_age": "90d",       //rollover之后进入cold阶段的时间不小于60天
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

可根据实际情况进行调整配置。

3,正式应用

操作流程大概应该如下,先创建索引策略,然后创建索引模板,接着创建一个索引,然后往索引模板中定义的别名写数据就可以了。

1,创建索引策略

PUT _ilm/policy/shop-policy 
{
  "policy": {                       
    "phases": {
      "hot": {                      
        "actions": {
              "rollover":{
                  "max_age":"30d"
              }
          }
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {}              
        }
      }
    }
  }
}

这里定义了两个阶段,hot阶段保留30天,然后进入delete再保留30天。亦即索引保留60天。

2,创建索引模板

PUT _template/template_shop
{
  "index_patterns": ["shop*"], 
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "index.lifecycle.name": "shop-policy",      
    "index.lifecycle.rollover_alias": "shop"    
  }
}

3,创建索引

PUT shop-1
{
  "aliases": {
    "shop": {
      "is_write_index": true
    }
  }
}

需要注意这个索引并非最终写入端使用的索引,别名才是,这个索引只是为了滚动所需。注意命名要求。

因为别名是匹配的,因此会自动应用上前边创建的策略,此时写入方指定的索引名为 shop,对,就是上边定义的索引别名。

在这个索引创建30天之后,就会触发rollover,将老的数据定义到delete阶段,然后新建一个索引,名字应该为:shop-000002,再过30天之后,shop-000002会进入delete阶段,并生成shop-000003 ,然后 shop-1会被删除,如此循环往复下去。

之前被别名以及索引绕来绕去,快整晕了,目前来看,至少当前这种思路是可行可用的。如果你有更好的思路,可以分享一下哦。


weinxin
扫码订阅本站,第一时间获得更新
微信扫描二维码,订阅我们网站的动态,另外不定时发送WordPress小技巧,你可以随时退订,欢迎订阅哦~

二丫讲梵 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明<二十二>ELK-学习笔记–elasticsearch-ILM-索引生命周期管理探微
喜欢 (0)
[如果想支持本站,可支付宝赞助]
分享 (0)
eryajf
关于作者:
学无止境,我愿意无止境学。书山有路,我愿意举身投火,淬炼成金!永远不要忘记,激情的奋进,就是美好的未来!

您必须 登录 才能发表评论!