Elasticsearch Index Lifecycle Management(ILM)是Elasticsearch的一个功能,用于管理索引的生命周期,优化索引的性能和减少存储成本。ILM可以自动执行索引的各种操作,如创建、删除、滚动、缩小等,从而帮助用户轻松地管理索引的生命周期。ILM可以帮助用户减少手动干预的工作量,使其可以更好地专注于数据分析。
ILM机制通过在索引生命周期的不同阶段执行动作来实现自动化管理。以下是ILM机制的四个阶段及其对应的动作:
- 热阶段(Hot Phase):此阶段索引处于活动状态,数据频繁更新和查询。在这个阶段,可以配置滚动索引,将较旧的数据移动到暖阶段或冷阶段。此外,可以设置索引别名,使所有查询都指向新索引。
- 暖阶段(Warm Phase):此阶段索引处于半活动状态,数据较少更新和查询。在这个阶段,可以执行一些操作,如压缩索引、合并段或更改数据存储方式,以减少存储成本。
- 冷阶段(Cold Phase):此阶段索引处于非活动状态,数据不再更新,只有少量查询。在这个阶段,可以将索引移动到低成本的存储层(如S3),以进一步减少存储成本。
- 删除阶段(Delete Phase):此阶段索引被删除,释放存储空间。
二、ILM的所有用法
数据从Hot到Warm再到Cold,最后被Delete,这对应着我们日常的业务数据应用情况,随着时间的推移,数据的重要性越来越低,我们常常更关注近期的数据,而所有的数据存储在Elasticsearch都极大占用系统资源,ILM这个功能极为重要,让系统资源控制和集群性能优化尽量自动化,减少人工维护的成本。
以下举个例子从整个生命周期来对索引进行管理:
2.1、创建一个新的索引并将其分配给别名
下面的代码创建一个名为“my_index”的新索引,并将其分配给别名“my_alias”。此外,这个代码使用ILM API定义了一个phases为“hot”的生命周期阶段,并为此阶段定义了最大文档空间大小和最大文档数,一旦超过就会执行索引滚动操作,创建新的索引,并通过别名指定。
代码语言:javascript复制PUT _ilm/policy/hot_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_docs": 100000000
}
}
}
}
}
}
PUT /my_index-000001
{
"aliases": {
"my_alias": {
"is_write_index": true
}
},
"settings": {
"index.lifecycle.name": "hot_policy"
}
}
2.2、将索引从“hot”阶段转移到“warm”阶段
如下定义了一个hot_warm_policy
,定义了hot和warm两个生命周期阶段,超过7天的索引会执行warm阶段相关的操作,如actions所示,执行forcemerge和shrink操作,这能显著降低分片数量和segments数量,对于集群的性能有比较大的提升。
PUT _ilm/policy/hot_warm_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_docs": 100000000
}
}
},
"warm": {
"min_age": "7d",
"actions": {
"forcemerge": {},
"shrink": {
"number_of_shards": 1
}
}
}
}
}
}
POST my_index-000001/_rollover
{
"conditions": {
"max_age": "1d"
}
}
2.3、将索引从“warm”阶段转移到“cold”阶段
同样的,下面的代码则在此基础上又增加了"cold"阶段,下面的代码演示了如何将索引从“warm”阶段转移到“cold”阶段,并在此阶段使用“freeze”操作来冻结索引,以便将其留在磁盘上,但不进行任何搜索操作,被freeze的索引,其元数据等信息将不会被缓存在内存中,能显著降低Elasticsearch堆内存的占用,降低集群压力。
代码语言:javascript复制PUT _ilm/policy/hot_warm_cold_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_docs": 100000000
}
}
},
"warm": {
"min_age": "7d",
"actions": {
"forcemerge": {},
"shrink": {
"number_of_shards": 1
}
}
},
"cold": {
"min_age": "30d",
"actions": {
"freeze": {}
}
}
}
}
}
POST my_index-000001/_rollover
{
"conditions": {
"max_age": "7d"
}
}
2.4、将索引从“cold”阶段转移到“delete”阶段
以下代码"delete"阶段,表示删除所有超过90天的索引。
代码语言:javascript复制PUT _ilm/policy/hot_warm_cold_delete_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "50GB",
"max_docs": 100000000
}
}
},
"warm": {
"min_age": "7d",
"actions": {
"forcemerge": {},
"shrink": {
"number_of_shards": 1
}
}
},
"cold": {
"min_age": "30d",
"actions": {
"freeze": {}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
通过以上操作可以发现,Elasticsearch的ILM功能完全解放了管理员手工操作管理索引生命周期,极大释放了生产力,不仅效率提升,而且不会容器出现因为忘记操作删除历史数据等问题导致应用性能受损的情况。