date: 2020-05-31title: es索引生命周期管理 #标题
tags: es索引生命周期管理 #标签
categories: elastic stack # 分类
本文用于记录如何配置使用es的索引管理策略——ILM。
参考:官方文档。
ES索引存活数量过多,会给ES集群带来较大压力,不仅严重影响数据录入和数据查询效率,而且导致磁盘、CPU占用比过高,加大节点“驾崩”的风险。对ES进行索引生命周期管理意义重大,不仅能提高服务器性能,降低内存和磁盘使用率,而且能够优化数据结构,提升读写、查询效率,避免数据丢失情况出现。
ILM定义了四个索引生命周期阶段:
- Hot(热数据):正在积极地更新和查询索引。
- Warm(温数据):索引不再更新,但仍在查询。
- cold(冷数据):索引不再被更新,很少被查询。这些信息仍然需要可搜索,但是如果查询速度较慢也没关系。
- delete (删除数据) :索引不再需要,可以安全地删除。
索引的生命周期策略指定了哪些阶段是可应用的,在每个阶段执行哪些操作,以及在各个阶段之间何时进行转换。
我们可以通过指定一个或多个转换条件来控制何时触发转换操作:
- 最大大小(索引中所有主分片的总大小)
- 最大文档数
- 最长时间
一旦满足任何条件,就执行转换。由于会定期检查标准,因此索引可能会略微超出指定的阈值。要控制检查标准的频率,可以在es的配置文件中指定indices.lifecycle.poll_interval群集设置。
要使用ILM自动滚动和管理时间序列索引,一般顺序如下:
- 创建一个定义适当阶段和操作的生命周期策略。
- 创建一个索引模板,将策略应用于每个新索引。
- 引导一个索引作为初始写入索引。
- 验证索引按照预期在生命周期阶段中移动。
我这里配置一个生命周期,来对索引进行管理,生命周期策略为:当索引大小达到1GB或超过5个文档数时触发,然后1小时后,旧索引将被删除。
创建生命周期策略
一个生命周期最多可以有四个阶段:热、暖、冷和删除。我们可以通过Kibana管理或使用put来定义和管理策略。
kibana配置生命周期的策略方法如下:
如上如所示,点击创建后,根据生产上的实际需求进行创建即可。
创建完成后,可以点击下方的request查看相应的请求语句,如下:
查看到的put语句如下(策略是我随便创建的,多数选项都是可选的。):
PUT _ilm/policy/aaa
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "30d",
"max_size": "50gb",
"max_docs": 5
},
"set_priority": {
"priority": 93
}
}
},
"warm": {
"actions": {
"allocate": {
"number_of_replicas": 2
},
"forcemerge": {
"max_num_segments": 2
},
"shrink": {
"number_of_shards": 2
},
"set_priority": {
"priority": 51
}
}
},
"cold": {
"min_age": "2d",
"actions": {
"allocate": {
"number_of_replicas": 1
},
"freeze": {},
"set_priority": {
"priority": 0
}
}
},
"delete": {
"min_age": "2d",
"actions": {
"delete": {}
}
}
}
}
}
好,回归正题,我们接着用api;来配置生命周期策略。
当索引大小达到1GB或超过5个文档数时触发,然后1小时后,旧索引将被删除。对应的put请求语法如下:
PUT /_ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": { # 新数据的age默认为0ms,也就是说新数据进入es后就处于hot阶段
"actions": {
"rollover": { # 满足以下任何一个条件,就触发翻转操作
"max_docs": 5,
"max_size": "1gb"
}
}
},
"delete": {
"min_age": "1h", # 在翻转1小时后将索引移动到delete阶段。
"actions": {
"delete": {} # 当索引进入删除阶段时触发删除操作。
}
}
}
}
}
创建一个索引模板来应用生命周期策略
要使用索引生命周期管理策略,需要在用于创建索引的索引模板中指定它。例如,下面的模板将my_policy与从模板my_template创建的索引相关联。
要启用自动翻转,模板需要两个ILM设置:
- index.lifecycle.name:指定要应用于匹配索引模式的新索引的生命周期策略的名称。
- index.lifecycle.rollover_alias:指定当索引触发翻转操作时要滚动的索引别名。
对应的语句如下:
PUT _template/my_template
{
"index_patterns": ["test-*"],# 如果新索引的名称以test-*开头,则将该模板应用于该索引(也可以写*号,表示匹配所有索引)
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "my_policy", # 要应用于每个新索引的生命周期策略的名称(就是我们上面创建的)。
"index.lifecycle.rollover_alias": "test-alias" # 用于引用这些索引的别名的名称。使用滚动操作的策略所需要的。
}
}
引导初始时间序列索引
为了能够开始使用这些test-*索引的策略,我们需要通过创建第一个索引来引导进程。
并将其指定为索引模板中指定的rollover别名(test-alias)的写索引。此索引的名称必须与模板的索引模式匹配,并以数字结尾。在滚动时,这个值会递增,以生成新索引的名称。
对应的put语句如下:
PUT test-0000001 # 创建名为test-0000001的索引。rollover操作递增每个后续索引的后缀号。
{
"aliases": {
"test-alias": { # 这里的名字必须和上面"index.lifecycle.rollover_alias"指定的名字一致
"is_write_index": true # 指定此索引作为此别名的写索引。
}
}
}
当满足翻转条件时,翻转动作如下:
- 创建一个名为test-0000002的新索引。这与test-*模式匹配,因此my_template模板中的设置应用于新索引。
- 将新索引指定为写入索引并使引导索引为只读。
插入文档进行测试
# 按照此格式依次插入ray1、ray2、ray3、ray4吧,批量插入文档我没研究
POST test-0000001/_doc
{
"name": "ray1"
}
观察索引中的文档数后,再继续插入两条文档ray5和ray6,再观察索引的变化(会发现新增索引test-0000002):