Какие знаешь сущности ElasticSearch?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные сущности ElasticSearch
В ElasticSearch существует несколько ключевых сущностей (концепций), которые образуют иерархическую модель данных и определяют работу кластера. Понимание этих сущностей критически важно для эффективного проектирования, развертывания и эксплуатации ElasticSearch в DevOps-среде.
1. Кластер (Cluster)
Кластер — это совокупность одного или нескольких узлов (серверов), которые совместно хранят ваши данные и обеспечивают возможности совместного поиска и индексирования. Это высший уровень организации в Elasticsearch.
- Каждый кластер идентифицируется уникальным именем (по умолчанию
"elasticsearch"). Имя важно для обнаружения узлов. - Основная задача: объединять вычислительные ресурсы и данные всех узлов для выполнения операций (индексирование, поиск, агрегации).
# Пример настройки имени кластера в elasticsearch.yml
cluster.name: my-production-logging-cluster
2. Узел (Node)
Узел — это отдельный сервер, который является частью кластера, хранит данные и участвует в кластеризации, индексировании и поиске. В зависимости от роли, узел может быть разных типов:
- Master-eligible node: Может быть избран мастер-узлом, который управляет кластером (создание/удаление индексов, отслеживание состояния узлов).
- Data node: Хранит данные (шарды) и выполняет операции, связанные с данными (CRUD, поиск, агрегации).
- Ingest node: Выполняет pipeline-обработку документов перед индексированием.
- Coordinating node (только по запросу): Перенаправляет запросы, распределяет результаты поиска. Все узлы по умолчанию являются координирующими.
# Пример конфигурации узла как чистого мастер-узла в elasticsearch.yml
node.name: "master-node-01"
node.roles: [ master ]
node.data: false
3. Индекс (Index)
Индекс — это коллекция документов, имеющих схожие характеристики. Это логический неймспейс, который указывает на один или несколько физических шардов. Аналог базы данных в RDBMS.
- Имя индекса должно быть в нижнем регистре.
- Жизненным циклом индексов (rollover, shrink, ILM — Index Lifecycle Management) активно управляют в DevOps для оптимизации хранения и производительности.
# Создание индекса через REST API
curl -X PUT "localhost:9200/my-app-logs-2024.05" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": { ... }
}'
4. Тип документов (Type) — УСТАРЕЛ
В версиях до 7.x Type был логической категорией/разделением внутри индекса (аналог таблицы в RDBMS). Начиная с версии 8.x, концепция удалена. Теперь один индекс хранит документы только одного типа. Это упростило архитектуру.
5. Документ (Document)
Документ — это базовая единица информации, которую можно индексировать. Это JSON-объект, хранящийся в Elasticsearch.
- Каждый документ принадлежит индексу.
- Каждый документ имеет уникальный ID (может быть сгенерирован автоматически) и версию для управления конфликтами.
- Документ состоит из набора полей (
fields), которые по умолчанию динамически типизируются.
// Пример документа (лог приложения)
{
"@timestamp": "2024-05-27T12:00:00Z",
"message": "User login successful",
"log.level": "INFO",
"service.name": "auth-service",
"host.ip": "10.0.1.15",
"user.id": "user_12345"
}
6. Шард (Shard) и Реплика (Replica)
Это ключевые сущности для масштабирования и отказоустойчивости.
- Шард (Shard) — это низкоуровневая рабочая единица, индекс Люси. Каждый шард является полностью функциональным и самостоятельным "индексом". Когда создается индекс, определяется количество первичных шардов (primary shards), которое нельзя изменить позже.
- Реплика (Replica) — это копия первичного шарда. Она обеспечивает:
* **Высокую доступность**: Продолжение работы при отказе узла с первичным шардом.
* **Масштабирование производительности**: Запросы на чтение могут обрабатываться и репликами.
# Настройки индекса: 3 первичных шарда, по 1 реплике на каждый (всего 6 шардов)
number_of_shards: 3
number_of_replicas: 1
7. Mapping (Схема)
Маппинг — это схема или определение того, как документ и его поля хранятся и индексируются. Он определяет:
- Типы полей (
text,keyword,date,integer,geo_point,nestedи т.д.). - Форматы (например, для дат).
- Анализаторы (как текст разбивается на термины для поиска).
- Явный (explicit) маппинг рекомендуется для production для контроля над процессами.
// Пример определения маппинга при создании индекса
PUT /my-index
{
"mappings": {
"properties": {
"message": { "type": "text", "analyzer": "standard" },
"log.level": { "type": "keyword" },
"@timestamp": { "type": "date" },
"user.id": { "type": "keyword" },
"response.time_ms": { "type": "float" }
}
}
}
8. Сегмент (Segment)
На физическом уровне каждый шард представляет собой индекс Люси, который, в свою очередь, состоит из одного или нескольких сегментов (segments). Сегмент — это неизменяемая "порция" обратно-индексированных данных. Операция слияния (merge) периодически объединяет мелкие сегменты в более крупные для оптимизации производительности и использования дискового пространства.
Итог для DevOps-инженера: Понимание этих сущностей позволяет грамотно проектировать инфраструктуру (планирование количества узлов и их ролей), настраивать индексы (выбор количества шардов и реплик в зависимости от объема данных и требований к доступности), управлять жизненным циклом данных (ILM-политики) и устранять неполадки (например, проблемы с несбалансированностью шардов или нехваткой дискового пространства из-за сегментов). Например, решение о 10 первичных шардах для индекса логов или 1 шарде для небольшого системного индекса напрямую влияет на возможность горизонтального масштабирования и отказоустойчивости кластера.