Tech
January 24, 2024

ElasticSearch ILM rollover (ротация лога, кейс автоудаление старых логов)

И так, вы задались вопросом, как бы так настроить автоудаление старых логов в Elasticsearch средствами самого Elasticsearch. Как мне кажется, кейс который я рассматриваю ниже, может подойти для вас.

Нам поможет бортовой Index lifecycle management и Rollover

Я подготовил схему реализации, ознакомьтесь. Ниже будет пошаговая реализация политики.

схема

1. Создаём Index Lifecycle Policies

PUT _ilm/policy/karpov
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
             "max_docs": 5
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "delete": {
        "min_age": "7d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

2. Создаём template

PUT _template/karpov
{
  "order": 0,
  "index_patterns": [
    "karpov-*"
  ],
  "settings": {
    "index": {
      "lifecycle": {
        "name": "karpov",
        "rollover_alias": "karpov"
      }
    }
  }
}

3. Создаём index

PUT karpov-000001
{
  "aliases": {
    "karpov": {
      "is_write_index":true
    }
  }
}

4. Теперь можно добавлять документы по alias

POST karpov/_doc/
{
  "@timestamp": "2099-11-15T13:12:00",
  "message": "GET /search HTTP/1.1 200 1070000",
  "user": {
    "id": "kimchy"
  }
}

ответ

{
  "_index" : "karpov-000002",
  "_type" : "_doc",
  "_id" : "6WR52HkBveAt0sSsNvDE",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 13,
  "_primary_term" : 1
}

В ответах можно увидеть, что _index инкрементируется (например если выполнить 4 пункт больше 5 раз). Следует отметить, что он делает это отвратно, см "Особенности" в конце статьи.

Проверить наличие записей с alias

GET /_alias/karpov
{
  "persistent" : {
    "indices" : {
      "lifecycle" : {
        "poll_interval" : "5s"
      }
    }
  },
  "transient" : { }
}

Поправить persistent.indeces.lifecycle.pool_interval на 5s, по дефолту там 10m. (но это действие не обязательно)

Особенности:

При ротации лог может превысить условия правила. Судя по всему это происходит из-за того, что эластик не триггерится на изменение индекса, а делает его проверку по интервалу. Т.е. это норм.

Ряд действий можно выполнить вручную через Kibana

Горячий, теплый, холодный (если вы встретитесь с этими состояниями) не влияют на удаление или ротацию как таковую. Эти состояния влияют на скорость индекса и то как их эластик будет хранить. Старые логи можно помечать как холодные, чтобы оптимизировать работу эластика.