ElasticSearch——索引生命周期管理

前言

在使用elk的时候,由于数据量较大,时间比较久远的数据就没有那么有价值了,因此就需要定期的清除这些历史数据,所以我们在设置es的索引策略的时候就可以进行数据的冷热策略设置。
本文介绍 ElasticSearch 7.14 版本的生命周期:

  • Hot:正在积极更新和查询索引。
  • Warm:索引不再更新,但仍在查询中。
  • Cold:索引不再更新,很少被查询。信息仍然需要可搜索,但如果这些查询速度较慢也没关系。
  • Delete:不再需要索引,可以安全地删除。

每个阶段可以触发的动作:

 

Kibana配置

  • 创建策略

设置hot阶段的策略,这里我设置索引大小为20kb、文档数为3、30秒钟自动滚动,就是说只要达到其中一个条件就自动根据索引模板创建索引,设置删除阶段,6分钟之后删除索引数据。

  • 创建索引模板

步骤1:

步骤2:

 

注:索引的别名(alias)需要和rollover_alias字段配置的相同,在生命周期策略rollover(折断的意思)的时候,将过期的索引内容附上rollover_alias-000001 这样的名字。如下图所示:

步骤3:

步骤4:

  • 创建索引
可使用kibana来创建索引。

注意:索引的别名(alias)需要和rollover_alias字段配置的相同,在生命周期策略rollover(折断的意思)的时候,将过期的索引内容附上rollover_alias-000001 这样的名字。
  • 测试验证

索引创建成功后,发现索引每隔30秒就会生成一个索引值,或者每插入3条数据就会生成一个索引。

到此说明配置的索引策略生效了,这里默认的情况,生成的索引的自增是6位的,比如000001。等待6分钟之后你会发现,有些索引已经被删除了,前面的两个索引已经被删除了。

 

命令配置

  • 设置策略刷新时间【可选】

设置生命周期策略刷新时间,默认是10min,我们在测试的时候可以设置的短一些,如3s:

PUT _cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval": "3s" 
  }
}
  • 创建策略

创建一个名为 my_policy 的策略,并添加了hot、delete两个phrase,hot 阶段单分片大于25G创建新索引,30天后删除旧索引。

PUT _ilm/policy/my_policy{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "25GB" 
          }
        }
      },
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {} 
        }
      }
    }
  }
}
  • 创建索引模板并使用策略

创建一个索引模板,将 my_policy 赋值给 index.lifecycle.name,其中index.lifecycle.rollover_alias指定了索引别名,通过别名可以查询模板创建的所有索引。

PUT _index_template/test-template
{
    "version": 1.0,
    "priority": 1,
    "index_patterns": ["test-*"],
    "template": {
        "settings":{
            "number_of_shards": 3,
            "number_of_replicas": 1,"index.lifecycle.name": "my-policy",
            "index.lifecycle.rollover_alias": "test-alias"  #这个别名记得和索引别名用的要一致不然会报illegal_argument_exception: index.lifecycle.rollover_alias [ilm_alias] does not point to index [ilm_index-000001]
        }
    }
}
  • 创建索引

创建一个名为 test-000001 的索引,同时别名为test-alias,其中 is_write_index = true 意思是当前新建索引为写索引,触发hot阶段归档后的索引该值是false

PUT test-000001{
  "aliases": {
    "test-alias":{  #这里的名字要和上面的模板一致
      "is_write_index": true 
    }
  }
}

 注:索引的别名(alias)需要和rollover_alias字段配置的相同,在生命周期策略rollover(折断的意思)的时候,将过期的索引内容附上rollover_alias-000001 这样的名字。

  • 插入数据
PUT test-000001/_doc/1
{
  "hello":"world"
}

 

注意事项

一、错误

错误一:

  • 错误信息:illegal_argument_exception: setting [index.lifecycle.rollover_alias] for index [index] is empty or not defined
  • 错误原因:索引模板没有设置别名
  • 解决方法:创建索引模板时手动设置[index.lifecycle.rollover_alias]别名

错误二:

  • 错误信息:illegal_argument_exception: index.lifecycle.rollover_alias [metricbeat-alias] does not point to index [metricbeat-6.8.4-2020.10.13]
  • 错误原因:索引没有设置别名,或者别名不一致
  • 解决方法:创建索引时设置别名alias,值为跟索引模板中的[index.lifecycle.rollover_alias]别名一致

 

二、策略

策略中阶段中的各个动作都是可选的,可以只配置某个动作,如:

PUT _ilm/policy/auto-delete-iml-policy
{
  "policy": {
    "phases": {
      "delete": {
        "min_age": "30d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

也可以配置多个动作(如果某个动作失败了,后面的动作不会执行),如:

PUT _ilm/policy/full_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_age": "7d",
            "max_size": "50G"
          }
        }
      },
      "warm": {
        "min_age": "30d",
        "actions": {
          "forcemerge": {
            "max_num_segments": 1
          },
          "shrink": {
            "number_of_shards": 1
          },
          "allocate": {
            "number_of_replicas": 2
          }
        }
      },
      "cold": {
        "min_age": "60d",
        "actions": {
          "allocate": {
            "require": {
              "box_type": "cold"
            }
          }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}
上面策略大致意思是:
  • 当前索引会在7天后或者单分片大于50G后进行归档,并生成新的索引;
  • warm阶段在第30天后触发,将分片数降低为1分片,segment强制合并为1,通过allocation将副本数增大到2;
  • cold阶段第60天触发,会关闭索引,并将数据转移至box_type = cold标签节点;
  • 90天后删除索引。

 

三、索引别名 

创建索引时的别名(alias)需要和索引模板中[index.lifecycle.rollover_alias]字段配置的相同,在生命周期策略rollover(折断的意思)的时候,将过期的索引内容附上rollover_alias-000001 这样的名字,如果不指定,rollover将失败。

手动创建索引时可以配置alias,但使用ELK时自动创建索引(filebeat、logstash)如何配置alias呢? 这个还没有研究......

 

 

引用:

  • https://blog.csdn.net/lyl54545/article/details/124173572

posted on 2019-12-05 17:56  曹伟雄  阅读(7483)  评论(0编辑  收藏  举报

导航