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配置生命周期的策略方法如下:

es索引生命周期管理 - 图1

如上如所示,点击创建后,根据生产上的实际需求进行创建即可。

创建完成后,可以点击下方的request查看相应的请求语句,如下:

es索引生命周期管理 - 图2

查看到的put语句如下(策略是我随便创建的,多数选项都是可选的。):

  1. PUT _ilm/policy/aaa
  2. {
  3. "policy": {
  4. "phases": {
  5. "hot": {
  6. "actions": {
  7. "rollover": {
  8. "max_age": "30d",
  9. "max_size": "50gb",
  10. "max_docs": 5
  11. },
  12. "set_priority": {
  13. "priority": 93
  14. }
  15. }
  16. },
  17. "warm": {
  18. "actions": {
  19. "allocate": {
  20. "number_of_replicas": 2
  21. },
  22. "forcemerge": {
  23. "max_num_segments": 2
  24. },
  25. "shrink": {
  26. "number_of_shards": 2
  27. },
  28. "set_priority": {
  29. "priority": 51
  30. }
  31. }
  32. },
  33. "cold": {
  34. "min_age": "2d",
  35. "actions": {
  36. "allocate": {
  37. "number_of_replicas": 1
  38. },
  39. "freeze": {},
  40. "set_priority": {
  41. "priority": 0
  42. }
  43. }
  44. },
  45. "delete": {
  46. "min_age": "2d",
  47. "actions": {
  48. "delete": {}
  49. }
  50. }
  51. }
  52. }
  53. }

好,回归正题,我们接着用api;来配置生命周期策略。

当索引大小达到1GB或超过5个文档数时触发,然后1小时后,旧索引将被删除。对应的put请求语法如下:

  1. PUT /_ilm/policy/my_policy
  2. {
  3. "policy": {
  4. "phases": {
  5. "hot": { # 新数据的age默认为0ms,也就是说新数据进入es后就处于hot阶段
  6. "actions": {
  7. "rollover": { # 满足以下任何一个条件,就触发翻转操作
  8. "max_docs": 5,
  9. "max_size": "1gb"
  10. }
  11. }
  12. },
  13. "delete": {
  14. "min_age": "1h", # 在翻转1小时后将索引移动到delete阶段。
  15. "actions": {
  16. "delete": {} # 当索引进入删除阶段时触发删除操作。
  17. }
  18. }
  19. }
  20. }
  21. }

创建一个索引模板来应用生命周期策略

要使用索引生命周期管理策略,需要在用于创建索引的索引模板中指定它。例如,下面的模板将my_policy与从模板my_template创建的索引相关联。

要启用自动翻转,模板需要两个ILM设置:

  • index.lifecycle.name:指定要应用于匹配索引模式的新索引的生命周期策略的名称。
  • index.lifecycle.rollover_alias:指定当索引触发翻转操作时要滚动的索引别名。

对应的语句如下:

  1. PUT _template/my_template
  2. {
  3. "index_patterns": ["test-*"],# 如果新索引的名称以test-*开头,则将该模板应用于该索引(也可以写*号,表示匹配所有索引)
  4. "settings": {
  5. "number_of_shards": 1,
  6. "number_of_replicas": 1,
  7. "index.lifecycle.name": "my_policy", # 要应用于每个新索引的生命周期策略的名称(就是我们上面创建的)。
  8. "index.lifecycle.rollover_alias": "test-alias" # 用于引用这些索引的别名的名称。使用滚动操作的策略所需要的。
  9. }
  10. }

引导初始时间序列索引

为了能够开始使用这些test-*索引的策略,我们需要通过创建第一个索引来引导进程。

并将其指定为索引模板中指定的rollover别名(test-alias)的写索引。此索引的名称必须与模板的索引模式匹配,并以数字结尾。在滚动时,这个值会递增,以生成新索引的名称。

对应的put语句如下:

  1. PUT test-0000001 # 创建名为test-0000001的索引。rollover操作递增每个后续索引的后缀号。
  2. {
  3. "aliases": {
  4. "test-alias": { # 这里的名字必须和上面"index.lifecycle.rollover_alias"指定的名字一致
  5. "is_write_index": true # 指定此索引作为此别名的写索引。
  6. }
  7. }
  8. }

当满足翻转条件时,翻转动作如下:

  • 创建一个名为test-0000002的新索引。这与test-*模式匹配,因此my_template模板中的设置应用于新索引。
  • 将新索引指定为写入索引并使引导索引为只读。

插入文档进行测试

  1. # 按照此格式依次插入ray1、ray2、ray3、ray4吧,批量插入文档我没研究
  2. POST test-0000001/_doc
  3. {
  4. "name": "ray1"
  5. }

观察索引中的文档数后,再继续插入两条文档ray5和ray6,再观察索引的变化(会发现新增索引test-0000002):

es索引生命周期管理 - 图3