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": {}
}
}
}
}
}