索引生命周期管理 index lifecycle management (ILM)介绍

发布于 2022-07-12  171 次阅读


Elasticsearch索引生命周期管理指:Elasticsearch从设置、创建、打开、关闭、删除的全生命周期过程的管理。 Elasticsearch生产环境中一般采用多索引结合基于时间、基于空间的横向扩展的方式存储数据,随着数据量的增多,不用修改索引的底层架构逻辑。
 
引入索引生命周期管理的一个最重要的目的就是对大量时序数据在es读写操作的性能优化,比如在felk架构中,当日志量过大,日积月累后es索引也将变得庞大无比,在这么大数据量上对索引进程操作是很麻烦的事,那么我们希望es能够对单分片超过10g或者10天前的索引进行归档,并能够自动删除30天前的索引,那么这个场景可以通过ILM进行策略配置来实现。
 
要实现索引的生命周期管理,就不得不提索引别名,在elasticsearch里面给index(索引)起一个aliases(别名)能非常优雅的解决两个索引无缝切换的问题,这个功能在某些场景下非常使用。
比如这里用到的索引生命周期管理,要实现滚动更新就必须要设置一个索引别名,索引别名就像软连接一样,可以映射一个或多个索引。当我们写入的索引设置好别名后,我们只需要关注别名就可以了,对于别名下关联了多少个索引,都是无关紧要的。

索引生命周期管理实现流程

1)、创建一个索引生命周期策略

2)、创建一个索引模板,设置索引别名,连接索引生命周期策略

3)、创建一个索引,配置索引别名,设置当前索引可写(当索引别名包含多个索引时,同时只有一个索引能写)

4)、logstash通过索引别名写入数据(实际上数据是写入到了上一步创建的索引中)

3、索引生命周期管理实现

执行时删除备注

1)、设置索引生命周期策略:

PUT _ilm/policy/rolltest_policy 
{
    "policy": {
        "phases": {
            "hot": {  # 热阶段
                "actions": {
                    "rollover": {  # 滚动策略
                        "max_size": "1GB",  # 索引大小最大1GB,超过后执行滚动更新
                        "max_age": "1d"  # 索引创建后最大存着时间,超过后滚动更新
                    }
                }
            }, "delete": {  # 删除阶段
                "min_age": "90d",  # 热阶段完成后,在90天后删除索引
                "actions": {
                    "delete": {}
                }
            }
        }
    }
}

2)、创建索引模板,连接索引生命周期策略。

PUT _template/rolltest_template {
    "index_patterns": ["rolltest-*"],  # 匹配以“rolltest -”开头的所有索引。这也包括来自滚动等操作的所有新创建的索引
    "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 1,
        "index.lifecycle.name": "rolltest_policy",  # 关联的索引生命周期策略
        "index.lifecycle.rollover_alias": "rolltest"  # 索引别名
    }
}

3)、创建初始化索引

PUT index-000001
{
  "aliases": {
    "rolltest":{ //别名为 myindex
//允许索引被写入数据
      "is_write_index": true 
    }
  }
}

4)、logstash配置output为索引别名

output {
        elasticsearch { 
   hosts => ["10.3.37.75:9200","10.3.37.76:9200","10.3.37.77:9200"]                         index => 'rolltest'
                         codec => "json"
 }
         }
 

4、索引生命周期管理实践中遇到的一些疑问

1、当索引生命周期滚动策略设置过小时,比如最大索引大小为100m或更小时,索引并没有在达到这个大小后出发滚动策略,而是在1GB多的时候完成的滚动更新。推荐最好以GB为单位设置大小。

PUT /_ilm/policy/nginx_ilm_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_docs": "10"
          }
        }
      },
      "warm": {
        "min_age": "5s",
        "actions": {
          "allocate": {
            "include": {
              "box_type": "warm"
            }
          }
        }
      },
      "cold": {
        "min_age": "20s",
        "actions": {
          "allocate": {
            "include": {
              "box_type": "cold"
            }
          }
        }
      },
      "delete": {
        "min_age": "40s",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}