Какой у вас опыт работы с Elasticsearch?

«Какой у вас опыт работы с Elasticsearch?» — вопрос из категории Базы данных, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я развертывал, настраивал и поддерживал кластеры Elasticsearch для двух основных сценариев: централизованное логгирование (ELK-стек) и полнотекстовый поиск в приложениях.

Развертывание и настройка кластера:

  • Установка на виртуальные машины и в Kubernetes (используя Helm-чарт Elastic или оператор ECK).
  • Конфигурация узлов: выделение мастер-узлов, data-узлов и координаторов для стабильности и производительности.
  • Настройка безопасности: включение TLS для трафика между узлами, настройка аутентификации и ролевой модели доступа (RBAC) через X-Pack.

Управление данными и производительность:

  • Шардирование и репликация: Расчет оптимального количества шардов на основе объема данных и паттернов запросов для избежания проблемы "over-sharding".
  • Index Lifecycle Management (ILM): Автоматизация жизненного цикла индексов логов (hot → warm → cold → delete) для контроля затрат на хранение.
  • Оптимизация запросов: Использование _search API, составление сложных запросов с агрегациями, работа с 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.