2020/07/09 Managing Documents with Elasticsearch Index Life Management

上一篇讲了使用 ELK Stack 来搭建日志收集系统,这一篇来讲讲使用 Elasticsearch 来管理日志。日志存储在 Elasticsearch 是随着时间逐步增加的,有些日志会长期保存,而有些日志只需要保存一段时间后就删除,Elasticsearch 为 index 定义了生命周期,包括 4 个阶段:hot 、warm、cold 和 delete 。针对不同的阶段也定义了不同的策略,下面我们就来看一下如何使用策略来管理日志。

假设我们的日志规则是每 10000 条日志一个索引,日志最多保存 3 个月,那么我们可以创建一个策略。

curl -XPUT "http://localhost:9200/_ilm/policy/my_policy" -H 'Content-Type: application/json' -d'
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_docs": 10000
          }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}'

我们定义了一个滚动策略 rollover ,每 10000 条就会生成一个新的索引,并且 90 天后进入 delete 阶段,即被删除。

接下来需要将日志索引加上这个策略。日志我们都是通过 template 生成的,所以在 template 上加上策略。

curl -XPUT "http://localhost:9200/_template/my_template" -H 'Content-Type: application/json' -d'
{
  "index_patterns": ["log-*"], 
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "index.lifecycle.name": "my_policy", 
    "index.lifecycle.rollover_alias": "log-alias"
  }
}'

最后在初始化的时候创建第一个索引,并将索引设为可写。

curl -XPUT "http://localhost:9200/log-000001" -H 'Content-Type: application/json' -d'
{
  "aliases": {
    "log-alias": {
       "is_write_index": true
    }
  }
}'

以后往 log-alias 中写入新的日志是,就会使用我们设置的策略了。

详细的操作设置见 https://www.elastic.co/guide/en/elasticsearch/reference/6.8/index-lifecycle-management.html

这里附一些常用的操作:

查看策略

curl -XGET "http://localhost:9200/_ilm/policy?pretty"

查看索引的信息

curl -XGET "http://localhost:9200/test-*/_ilm/explain?pretty"

查看状态

curl -XGET "http://localhost:9200/_ilm/status?pretty"

修改 ES 的 策略生效时间

curl -XPUT "http://localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
  "transient": {
    "indices.lifecycle.poll_interval": "3s" 
  }
}'