Ответ
Я развертывал, настраивал и поддерживал кластеры Elasticsearch для двух основных сценариев: централизованное логгирование (ELK-стек) и полнотекстовый поиск в приложениях.
Развертывание и настройка кластера:
- Установка на виртуальные машины и в Kubernetes (используя Helm-чарт Elastic или оператор ECK).
- Конфигурация узлов: выделение мастер-узлов, data-узлов и координаторов для стабильности и производительности.
- Настройка безопасности: включение TLS для трафика между узлами, настройка аутентификации и ролевой модели доступа (RBAC) через X-Pack.
Управление данными и производительность:
- Шардирование и репликация: Расчет оптимального количества шардов на основе объема данных и паттернов запросов для избежания проблемы "over-sharding".
- Index Lifecycle Management (ILM): Автоматизация жизненного цикла индексов логов (hot → warm → cold → delete) для контроля затрат на хранение.
- Оптимизация запросов: Использование
_searchAPI, составление сложных запросов с агрегациями, работа сscrollиsearch_afterдля пагинации больших результатов. - Мониторинг: Настройка алертов на основе метрик кластера (статус шардов, использование heap памяти, latency запросов) через Kibana или интегрированные с внешними системами (PagerDuty, Slack).
Пример политики ILM для логов приложения:
PUT _ilm/policy/app_logs_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50gb",
"max_age": "7d"
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "1d",
"actions": {
"forcemerge": {
"max_num_segments": 1
},
"shrink": {
"number_of_shards": 1
},
"set_priority": {
"priority": 50
}
}
},
"cold": {
"min_age": "30d",
"actions": {
"set_priority": {
"priority": 0
}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
Для сбора логов использовал Filebeat, который направлял данные в Logstash для дополнительной обработки перед индексацией в Elasticsearch.