Рабочие нагрузки по обработке данных временных рядов, такие как аналитика журналов и мониторинг в реальном времени, часто сопровождаются быстрым ростом объёма данных со временем. Если данные продолжают записываться в один индекс, индекс может стать чрезмерно большим, что приводит к ухудшению производительности запросов и увеличению потребления хранилища из‑за устаревших данных. Традиционно управление этим ростом требовало пользовательских скриптов для разделения индексов, что было сложным и дорогим. Теперь, настроив политики управления состоянием индекса (ISM) для индексов в кластерах Elasticsearch, можно автоматизировать переключение индекса на основе размера или возраста индекса и автоматически удалять устаревшие индексы. Это помогает сбалансировать производительность запросов и затраты на хранение.
В этой теме описывается, как настроить политику ISM для автоматизации переключения индекса.
Предположим, что приложение генерирует около 2,4 TB журналов каждый день. Можно создать политику ISM для оптимизации хранения журналов и производительности запросов. В этом примере мы определяем alias индекса как log-alias. Figure 1 log-alias data organization показывает организацию данных в этом индексе. При запросах alias указывает на все индексы, имена которых начинаются с test. При записях alias указывает только на последний индекс.
Figure 1 log-alias data organization

Один день в времени переключения означает 24 часа после создания индекса, а не календарный день.
Версия Elasticsearch должна быть 7.6.2 или новее.
Левая часть консоли представляет собой поле ввода команды, а треугольный значок в её правом верхнем углу является кнопкой выполнения. Правая часть отображает результат выполнения.
Для примера, создайте политику с именем "rollover workflow": Когда размер индекса достигает 1 TB или возраст индекса достигает одного дня, он автоматически переключается. Когда возраст индекса достигает семи дней, реплики отключаются. Когда достигает 30 дней, индекс удаляется.
PUT _opendistro/_ism/policies/rollover_workflow{"policy": {"description": "rollover test","default_state": "hot","states": [{"name": "hot","actions": [{"rollover": {"min_size": "1tb","min_index_age": "1d"}}],"transitions": [{"state_name": "warm","conditions": {"min_index_age": "7d"}}]},{"name": "warm","actions": [{"replica_count": {"number_of_replicas": 0}}],"transitions": [{"state_name": "delete","conditions": {"min_index_age": "30d"}}]},{"name": "delete","actions": [{"delete": {}}]}]}}
После создания политики жизненного цикла выполните следующую команду для получения сведений о политике:
GET _opendistro/_ism/policies/rollover_workflow
Свяжите политику с шаблоном индекса, чтобы новые индексы, созданные с использованием этого шаблона, автоматически наследовали ISM policy и алиас.
Для примера создайте шаблон индекса с именем template_test, чтобы вновь создаваемые индексы, имя которых начинается с test, автоматически связывались с ISM policy rollover_workflow и использовали log_alias для переключения индекса.
PUT _template/template_test{"index_patterns": "test*","settings": {"number_of_replicas": 1, // Number of index replicas"number_of_shards": 1, // Number of index shards"opendistro.index_state_management.policy_id": "rollover_workflow", // Index lifecycle policy name"index.opendistro.index_state_management.rollover_alias": "log_alias" // Which alias to roll over},"mappings": {"properties": {"name": {"type": "text"}}}}
После создания шаблона индекса вы можете выполнить следующую команду для получения сведений о шаблоне:
GET _template/template_test
Создайте вручную первый индекс, который запустит процесс автоматического переключения.
Для примера создайте первый индекс, задайте формат даты, укажите aliases и установите is_write_index в true. Индекс автоматически будет использовать шаблон индекса template_test и наследовать политику жизненного цикла rollover_workflow через шаблон.
PUT %3Ctest-%7Bnow%2Fd%7D-000001%3E{"aliases": {"log_alias": {"is_write_index": true // Tells the customer to direct all write requests aiming at log_alias to this index.}}}
The index above is the URL code of <test-{now/d}-000001>. By default, the index name contains the creation date. For example, if an index was created on 2022-06-02, the index name is test-2022.06.02-000001.
POST log_alias/_bulk{"index":{}}{"name":"name1"}{"index":{}}{"name":"name2"}{"index":{}}{"name":"name3"}{"index":{}}{"name":"name4"}{"index":{}}{"name":"name5"}{"index":{}}{"name":"name6"}
GET _cat/indices/test*?s=i
Должно быть как минимум два индекса, например:
green open test-<Date>-000001 r8ab5NX6T3Ox_hoGUanogQ 1 1 6 0 416b 208bgreen open test-<Date>-000002 sfwkVgy8RSSEw7W-xYjM2Q 1 1 0 0 209b 209b
In the preceding information, test-<Date>-000001 is the index created in 4, and test-<Date>-000002 is the index generated through rollover.
GET _cat/aliases/log_alias?v
Алиас должен указывать на несколько индексов, например:
alias index filter routing.index routing.search is_write_indexlog_alias test-<Date>-000001 - - - falselog_alias test-<Date>-000002 - - - true
Сценарии
После того как rollover для индекса будет пропущен, ISM больше не будет пытаться выполнять rollover или создавать переключённые индексы. Это означает, что пропуск rollover индекса может привести к потере данных. Пожалуйста, будьте осторожны.
Ограничения
Чтобы пропустить rollover индекса, версия кластера Elasticsearch должна быть 7.6.2 или 7.10.2, а версия образа кластера не должна быть старее 7.x.2_25.1.0_x.x.x.
Процедура
PUT {index_name}/_settings{"index.plugins.index_state_management.rollover_skip": true}
Если true возвращено, конфигурация выполнена успешно.
POST _opendistro/_ism/retry/{index_name}
Если возвращена следующая информация, повтор выполнен успешно:
{"updated_indices": 1,"failures": false,"failed_indices": []}