Архив метки: ILM

Elasticsearch. Настройка ILM

Статья является вольной интерпретацией оригинальной статьи из документации Elastic.

В Elasticsearch благодаря функционалу управления жизненным циклом индекса (index lifecycle management, сокращенно ILM) стало доступным управлять состоянием индекса, замораживать, сжимать или вовсе удалять его.

В этой статье будет показан простой пример удаления индекса спустя указанный промежуток времени в Elasticsearch v. 7.3.2.

Настроить правила жизненного цикла индекса и применить их к индексу можно двумя способами:
1. По средством Dev Tools в интерфейсе Kibana или curl из консоли терминала, если Kibana не используется в кластере.
2. Либо настроить политику использую интерфейс Kibana во вкладке Management > Index Lifecycle Policies.

Сперва рассмотрим первый вариант и создадим политику с помощью запроса во вкладке Dev Tools.

Настройка через консоль Dev Tools.

Проверяем список уже имеющихся политик:

GET _ilm/policy

По умолчанию будет присутствовать стандартная политика watch-history-ilm-policy:

{
  "watch-history-ilm-policy" : {
    "version" : 1,
    "modified_date" : "2019-07-02T07:58:10.186Z",
    "policy" : {
      "phases" : {
        "delete" : {
          "min_age" : "7d",
          "actions" : {
            "delete" : { }
          }        }      }    }  }}

Создадим собственное правило:

PUT _ilm/policy/filebeat-7.3.2  
{
  "policy": {                       
    "phases": {
      "warm": {                      
        "actions": {
          "rollover": {             
            "max_size": "1GB",
            "max_age": "1h"
          }
        }
      },
      "delete": {
        "min_age": "1h",           
        "actions": {
          "delete": {}              
        }
      }
    }
  }
}

Давайте подробнее рассмотрим наше действие и разберем основные параметры запроса.
PUT _ilm/policy/filebeat-7.3.2 — создаем политику и именем filebeat-7.3.2.
«phases»: «warm» — Определяем фазу в которой окажется индекс. Подробнее про фазы ILM.
«actions»: «rollover» — Определяем действие, которое произойдет с индексом в зависимости от параметров.
«max_size»: «1GB» — Определяем первый параметр для перехода индекса в другую стадию — максимальный размер индекса.
«max_age»: «1h» — Определяем второй параметр — возраст индекса.
«delete»: «min_age»: «1h» — по достижению одного из вышеперечисленных параметров спустя указанное время (1 час) индекс удлалиться.
«actions»: «delete» — Определяем действие для удаления индекса.

Получаем положительный ответ «acknowledged» : true.
Вновь проверяем список политик:

GET _ilm/policy

Видим новое правило filebeat-7.3.2, которое мы создали:

{
  "filebeat-7.3.2" : {
    "version" : 1,   //версия правила, будет расти после каждого изменения. Немного подробнее ниже.
    "modified_date" : "2019-09-23T13:40:33.031Z", //дата изменения
    "policy" : {
      "phases" : {
        "hot" : {
          "min_age" : "0ms",
          "actions" : {
            "rollover" : {
              "max_size" : "1gb",
              "max_age" : "1h"
            }
          }
        },
        "delete" : {
          "min_age" : "1h",
          "actions" : {
            "delete" : { }          }        }      }    }  },
  "watch-history-ilm-policy" : {
    "version" : 1,
    "modified_date" : "2019-07-02T07:58:10.186Z",
    "policy" : {
      "phases" : {
        "delete" : {
          "min_age" : "7d",
          "actions" : {
            "delete" : { }          }        }      }    }  }}

После создания правила, его необходимо применить непосредственно к индексам. Можно применить правила как для одного конкретного индекса (что в целом не имеет смысла), так и для темплейта в целом.

Создание темплейта для индексов :
Внимание, если template с именем filebeat-7.3.2 уже существует, следующее действие его перезапишет

PUT _template/filebeat-7.3.2
{
  "index_patterns": ["filebeat-7.3.2-*"],                 
  "settings": {
    "index.lifecycle.name": "filebeat-7.3.2" 
  }
}

В настройка шаблона мы указали какие индексы подпадают под шаблон «index_patterns»: [«filebeat-7.3.2-*»], т.е. все индексы которые начинаются с filebeat-7.3.2-, какую политику использовать индексам «index.lifecycle.name»: «filebeat-7.3.2».

Важно помнить, что если вы используете filebeat 7 версии, то он создает темплейт в Elasticsearch уже с указанием используемой политики:
Посмотрим стандартный шаблон который создаем сам filebeat

GET _template/filebeat-7.3.2

Мы видим, что он по умолчанию использует политику с именем filebeat-7.3.2, даже если она еще не создана.

{
  "filebeat-7.3.2" : {
    "order" : 1,
    "index_patterns" : [
      "filebeat-7.3.2-*"
    ],
    "settings" : {
      "index" : {
        "lifecycle" : {
          "name" : "filebeat-7.3.2",
          "rollover_alias" : "filebeat-7.3.2"
...

В идеале создать отдельный теплейт для с паттерном индексов filebeat-7.3.2-* параллельно стандартному темплейту filebeat.

Вернемся непосредственно к ILM.
После создания политики и применения ее индексам можем проверить состояние жизненного цикла индекса:
— для всех индексов:

GET filebeat-7.3.2-*/_ilm/explain

Получаем информацию о текущих стадиях всех индексов

{
  "indices" : {
    "filebeat-7.3.2-2019.09.23-000004" : {
      "index" : "filebeat-7.3.2-2019.09.23-000004",
      "managed" : true,
      "policy" : "filebeat-7.3.2",
      "lifecycle_date_millis" : 1569248425250,
      "phase" : "warm",
      "phase_time_millis" : 1569248426531,
      "action" : "complete",
      "action_time_millis" : 1569248485680,
      "step" : "complete",
      "step_time_millis" : 1569248485680,
      "phase_execution" : {
        "policy" : "filebeat-7.3.2",
        "phase_definition" : {
          "min_age" : "0ms",
          "actions" : {
            "shrink" : {
              "number_of_shards" : 1
            }          }        },
        "version" : 2,
        "modified_date_in_millis" : 1569237244490
      }    },
    "filebeat-7.3.2-2019.09.23-000005" : {
      "index" : "filebeat-7.3.2-2019.09.23-000005",
      "managed" : true,
      "policy" : "filebeat-7.3.2",
      "lifecycle_date_millis" : 1569248424138,
      "phase" : "hot",
      "phase_time_millis" : 1569248425501,
      "action" : "rollover",
      "action_time_millis" : 1569248485824,
      "step" : "check-rollover-ready",
      "step_time_millis" : 1569248485824,
      "phase_execution" : {
        "policy" : "filebeat-7.3.2",
        "phase_definition" : {
          "min_age" : "0ms",
          "actions" : {
            "rollover" : {
              "max_size" : "50mb",
              "max_age" : "1h"
            }
          }
        },
        "version" : 2,
        "modified_date_in_millis" : 1569237244490
      }    }  }}

— для конкретного индекса (вместо * указываем полное имя индекса):

GET filebeat-7.3.2-*/_ilm/explain

GET filebeat-7.3.2-2019.09.23-000004/_ilm/explain

Получаем информацию о текущей стадии на которой находится индекс:

{
  "indices" : {
    "filebeat-7.3.2-2019.09.23-000004" : {
      "index" : "filebeat-7.3.2-2019.09.23-000004",
      "managed" : true,
      "policy" : "filebeat-7.3.2",
      "lifecycle_date_millis" : 1569248425250,
      "phase" : "warm",
      "phase_time_millis" : 1569248426531,
      "action" : "complete",
      "action_time_millis" : 1569248485680,
      "step" : "complete",
      "step_time_millis" : 1569248485680,
      "phase_execution" : {
        "policy" : "filebeat-7.3.2",
        "phase_definition" : {
          "min_age" : "0ms",
          "actions" : {
            "shrink" : {
              "number_of_shards" : 1
            }
          }
        },
        "version" : 2,
        "modified_date_in_millis" : 1569237244490
      }    }  }}

Стоит обратить внимание, на параметры:
— «phase» : «hot»\»warm» — текущая стадия индекса
— «action» : «rollover»\»complete» — ожидаемое действие
— «step» : «check-rollover-ready»\»complete» — текущий шаг
— «version» : 2 — используемая версия правила.

Остановимся подробнее на параметре version. Важно помнить, что при изменении политики меняется и ее версия. Однако индексы автоматически не меняют используемую версию политики. Говоря простым языком, после изменения настрое политики, индексы не применят эти изменения и останутся на старой версии.

Создание правила через интерфейс Kibana

Настроить политику можно использую интерфейс Kibana, переходим во вкладку Management > Index Lifecycle Policies и нажимаем кнопку «Create policy«.

Настраиваем необходимые параметры, в нашем случае необходимо включить функцию Delete phase, заполняем остальные поля по примеру:

После заполнения нужных полей можно нажать кнопку «Show JSON«, чтобы увидеть как наш конфиг будет выглядеть в json. Его же можно использовать во вкладке Dev Tools.

Далее создаем template во вкладке Dev Tools, об этом описано выше, не буду повторяться. Да, к сожалению, через интерфейс Kibana нельзя управлять настройками темплейтов.

После настройки политики и шаблонов переходим во вкладку Management > Index Management выбираем нужный нам индекс, в графе Index lifecycle management будут подробности состояния кластера:

Итоги
Выполнив вышеописанные действия мы получим индексы которые каждый час переходят в состояние warm и доступны только для чтения, и еще через час вовсе удаляются. Время жизни в один час на каждую фазу выбрано для демонстрации процесса, реальные настройка подбирайте под свои нужды.

Отдельно хочу обратить на имена индексов. Мы используем Rollover Action в нашей политике, которая требует, чтобы имя нашего индекса заканчивалось цифрой. В нашем случае мы использовали 000001. Это важно, чтобы Rollover мог увеличивать это число при присвоении имени новому индексу, созданному при пролонгации.
Небольшой пример в картинках, как это работает:
Скормил filebeat несколько файлов с логами превышающих объем в 50 МБ, Elasticsearch создал два индекса.

Спустя несколько часов первые индексы были удалены, а новым были присвоены порядковые номера 000003 и 000004.

Полезная информация и первоисточник:
https://www.elastic.co/guide/en/elasticsearch/reference/current/index-lifecycle-management.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-index-lifecycle-management.html

0