Поиск по кластерам
Поиск по нескольким кластерам позволяет выполнять один запрос на поиск по одному или нескольким удаленным кластерам. Например, можно использовать поиск по нескольким кластерам для фильтрации и анализа данных журналов, хранящихся в кластерах разных центров обработки данных.
Поддерживаемые API
Следующие API поддерживают поиск по нескольким кластерам:
- Поиск
- Асинхронный поиск
- Многократный поиск
- Шаблон поиска
- Шаблон многократного поиска
- Возможности полей
- [превью] Эта функциональность находится на стадии технического превью и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции на стадии технического превью не подпадают под SLA поддержки официальных функций GA. Поиск EQL
- [превью] Эта функциональность находится на стадии технического превью и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции на стадии технического превью не подпадают под SLA поддержки официальных функций GA. Поиск SQL
- Поиск векторных тайлов
Предварительные требования
-
Для поиска по нескольким кластерам требуются удаленные кластеры. Для настройки удаленных кластеров в Elasticsearch Service см. настройка удаленных кластеров в Elasticsearch Service. Если вы запускаете Elasticsearch на собственном оборудовании, см. Удаленные кластеры.
Чтобы убедиться, что конфигурация вашего удаленного кластера поддерживает поиск по нескольким кластерам, см. Поддерживаемые конфигурации.
- Координирующий узел локального кластера должен иметь роль узла
remote_cluster_client.
-
Если вы используете режим sniff mode, локальный координирующий узел должен иметь возможность подключения к узлам-семенам и шлюзовым узлам удаленного кластера.
Рекомендуется использовать шлюзовые узлы, способные выполнять роль координирующих узлов. Узлы-семена могут быть подмножеством этих шлюзовых узлов.
- Если вы используете режим прокси, локальный координирующий узел должен иметь возможность подключения к настроенному
proxy_address. Прокси по этому адресу должен иметь возможность перенаправлять подключения к шлюзовым и координирующим узлам в удаленном кластере. - Поиск по нескольким кластерам требует различных прав доступа на локальном и удаленном кластерах. См. Настройка прав для поиска по нескольким кластерам и Настройка прав для поиска по нескольким кластерам и Kibana.
Примеры поиска по нескольким кластерам
Настройка удаленного кластера
В следующем запросе API обновления настроек кластера добавляются три удаленных кластера: cluster_one, cluster_two и cluster_three.
PUT _cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"cluster_one": {
"seeds": [
"127.0.0.1:9300"
]
},
"cluster_two": {
"seeds": [
"127.0.0.1:9301"
]
},
"cluster_three": {
"seeds": [
"127.0.0.1:9302"
]
}
}
}
}
} Поиск в одном удаленном кластере
В запросе на поиск вы указываете потоки данных и индексы на удаленном кластере как <remote_cluster_name>:<target>`.
Следующий запрос API поиска выполняет поиск в индексе my-index-000001 на одном удаленном кластере, cluster_one.
GET /cluster_one:my-index-000001/_search
{
"query": {
"match": {
"user.id": "kimchy"
}
},
"_source": ["user.id", "message", "http.response.status_code"]
} API возвращает следующий ответ:
{
"took": 150,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0,
"skipped": 0
},
"_clusters": {
"total": 1,
"successful": 1,
"skipped": 0
},
"hits": {
"total" : {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "cluster_one:my-index-000001",
"_type": "_doc",
"_id": "0",
"_score": 1,
"_source": {
"user": {
"id": "kimchy"
},
"message": "GET /search HTTP/1.1 200 1070000",
"http": {
"response":
{
"status_code": 200
}
}
}
}
]
}
} | Тело ответа поиска включает имя удаленного кластера в параметре |
Поиск по нескольким удаленным кластерам
Следующий запрос API поиска выполняет поиск в индексе my-index-000001 по трём кластерам:
- Ваш локальный кластер
- Два удаленных кластера,
cluster_oneиcluster_two
GET /my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001/_search
{
"query": {
"match": {
"user.id": "kimchy"
}
},
"_source": ["user.id", "message", "http.response.status_code"]
} API возвращает следующий ответ:
{
"took": 150,
"timed_out": false,
"num_reduce_phases": 4,
"_shards": {
"total": 3,
"successful": 3,
"failed": 0,
"skipped": 0
},
"_clusters": {
"total": 3,
"successful": 3,
"skipped": 0
},
"hits": {
"total" : {
"value": 3,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "my-index-000001",
"_type": "_doc",
"_id": "0",
"_score": 2,
"_source": {
"user": {
"id": "kimchy"
},
"message": "GET /search HTTP/1.1 200 1070000",
"http": {
"response":
{
"status_code": 200
}
}
}
},
{
"_index": "cluster_one:my-index-000001",
"_type": "_doc",
"_id": "0",
"_score": 1,
"_source": {
"user": {
"id": "kimchy"
},
"message": "GET /search HTTP/1.1 200 1070000",
"http": {
"response":
{
"status_code": 200
}
}
}
},
{
"_index": "cluster_two:my-index-000001",
"_type": "_doc",
"_id": "0",
"_score": 1,
"_source": {
"user": {
"id": "kimchy"
},
"message": "GET /search HTTP/1.1 200 1070000",
"http": {
"response":
{
"status_code": 200
}
}
}
}
]
}
} | Параметр | |
| Этот документ пришёл из | |
| Этот документ пришёл из |
Необязательные удаленные кластеры
По умолчанию поиск по нескольким кластерам завершается ошибкой, если удаленный кластер в запросе возвращает ошибку или недоступен. Используйте настройку кластера skip_unavailable, чтобы отметить определённый удалённый кластер как необязательный для поиска по нескольким кластерам.
Если skip_unavailable равно true, поиск по нескольким кластерам:
- Пропускает удалённый кластер, если его узлы недоступны во время поиска. Значение
_cluster.skippedв ответе содержит количество пропущенных кластеров. - Игнорирует ошибки, возвращаемые удалённым кластером, такие как ошибки, связанные с недоступными фрагментами или индексами. Это может включать ошибки, связанные с параметрами поиска, такими как
allow_no_indicesиignore_unavailable. - Игнорирует параметр
allow_partial_search_resultsи соответствующую настройку кластераsearch.default_allow_partial_resultsпри поиске в удалённом кластере. Это означает, что поиски в удалённом кластере могут возвращать частичные результаты.
Следующий запрос API обновления настроек кластера изменяет значение настройки cluster_two на true.
PUT _cluster/settings
{
"persistent": {
"cluster.remote.cluster_two.skip_unavailable": true
}
} Если cluster_two отключён или недоступен во время поиска по нескольким кластерам, Elasticsearch не включит соответствующие документы из этого кластера в окончательные результаты.
Как поиск по нескольким кластерам обрабатывает задержки сети
Поскольку поиск по нескольким кластерам подразумевает отправку запросов на удаленные кластеры, любые задержки в сети могут повлиять на скорость поиска. Чтобы избежать медленных поисков, поиск по нескольким кластерам предлагает два варианта обработки задержек сети:
- Минимизация сетевых циклов
-
По умолчанию Elasticsearch уменьшает количество сетевых циклов между удаленными кластерами. Это уменьшает влияние задержек сети на скорость поиска. Однако Elasticsearch не может уменьшить сетевые циклы для больших запросов на поиск, например, таких, которые включают прокрутку или вложенные результаты.
См. Минимизация сетевых циклов, чтобы узнать, как работает этот параметр.
- Не минимизировать сетевые циклы
-
Для запросов на поиск, которые включают прокрутку или вложенные результаты, Elasticsearch отправляет несколько исходящих и входящих запросов каждому удаленному кластеру. Вы также можете выбрать этот вариант, установив параметр
ccs_minimize_roundtripsв значениеfalse. Хотя этот подход, как правило, медленнее, он может хорошо работать для сетей с низкой задержкой.См. Не минимизировать сетевые циклы, чтобы узнать, как работает этот параметр.
API поиска векторных тайлов всегда минимизирует сетевые циклы и не включает параметр ccs_minimize_roundtrips.
Минимизация сетевых циклов
Вот как работает поиск по нескольким кластерам, когда вы минимизируете сетевые циклы.
-
Вы отправляете запрос на поиск по кластерам в свой локальный кластер. Координирующий узел в этом кластере получает и анализирует запрос.
-
Координирующий узел отправляет один запрос на поиск каждому кластеру, включая локальный кластер. Каждый кластер выполняет запрос на поиск независимо, применяя к запросу собственные настройки уровня кластера.
-
Каждый удалённый кластер отправляет свои результаты поиска обратно координационному узлу.
-
После сбора результатов из каждого кластера координационный узел возвращает окончательные результаты в ответе на поиск по кластерам.
Не минимизируйте сетевые запросы
Вот как работает поиск по кластерам, когда вы не минимизируете сетевые запросы.
-
Вы отправляете запрос на поиск по кластерам в свой локальный кластер. Координирующий узел в этом кластере получает и анализирует запрос.
-
Координирующий узел отправляет запрос API search shards каждому удалённому кластеру.
-
Каждый удалённый кластер отправляет свой ответ обратно координационному узлу. Этот ответ содержит информацию об индексах и фрагментах, на которых будет выполняться запрос поиска по кластерам.
-
Координирующий узел отправляет запрос поиска каждому фрагменту, включая фрагменты в собственном кластере. Каждый фрагмент выполняет запрос поиска независимо.
Когда сетевые запросы не минимизируются, поиск выполняется так, как если бы все данные находились в кластере координационного узла. Рекомендуется обновить настройки кластера, которые ограничивают поиск, такие как
action.search.shard_count.limit,pre_filter_shard_sizeиmax_concurrent_shard_requests, чтобы учесть это. Если эти ограничения слишком низкие, поиск может быть отклонен. -
Каждый фрагмент отправляет свои результаты поиска обратно координационному узлу.
-
После сбора результатов из каждого кластера координационный узел возвращает окончательные результаты в ответе на поиск по кластерам.
Поддерживаемые конфигурации
Для выполнения поиска по кластерам локальный и удалённые кластеры должны быть совместимы, как указано в следующей матрице.
Для API поиска EQL локальный и удалённые кластеры должны использовать одну и ту же версию Elasticsearch. Локальные кластеры версии 7.17.7 или выше также поддерживают поиск по кластерам в удалённые кластеры версии 7.15.0 или выше.
Матрица совместимости версий
Локальный кластер | |||||||
Удалённый кластер | 5.0–5.5 | 5.6 | 6.0–6.6 | 6.7 | 6.8 | 7.0 | 7.1–7.17 |
5.0–5.5 | |||||||
5.6 | |||||||
6.0–6.6 | |||||||
6.7 | |||||||
6.8 | |||||||
7.0 | |||||||
7.1–7.17 | |||||||
Поиск по кластерам также может выполнять поиск в удалённых кластерах, которые находятся в процессе обновления, при условии, что как версия "обновления с" так и версия "обновления до" совместимы с шлюзовым узлом.
Например, координационный узел, работающий на Elasticsearch 5.6, может искать в удалённом кластере, работающем на Elasticsearch 6.8, но этот кластер не может быть обновлён до 7.1. В этом случае вы сначала должны обновить координационный узел до версии 7.1, а затем обновить удалённый кластер.
Запуск нескольких версий Elasticsearch в одном кластере за пределами периода обновления не поддерживается.
Поддерживаются только те функции, которые существуют во всех ищущих кластерах. Использование недавней функции с удалённым кластером, где функция не поддерживается, приведёт к неопределённому поведению.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/modules-cross-cluster-search.html