Имея множество кластеров, вы можете распределять нагрузку при запросе между всеми узлами ваших кластеров. Возможно это благодаря поддержке Кросс-кластерного поиска (Cross-Cluster Search) в Elasticsearch.
На схеме ниже продемонстрирована работа Кросс-кластерного поиска. Т.е вы выполняете запрос на одном из узлов в Кластере 2 и дальше Elasticsearch сам распараллеливает запрос между другими кластерами.

Регистрация удаленных кластеров
Для добавления удаленного кластера используется cluster.remote. Вам необходимо предоставить список узлов (seeds), который представляет собой список узлов в удаленном кластере.
PUT _cluster/settings
{
"persistent": {
"cluster.remote": {
"my_cluster_name": {
"seeds": ["node1:9300","node2:9300","node3:9300"]
}
}
}
}
Поиск в удалённом кластере
После того как вы добавили удаленный кластер вы также можете искать нужные вам документы именно в этом кластере. Поиск осуществляется как обычно за исключением добавлением имени удаленного кластера перед index.
GET my_cluster_name:my_index/_search
{
"query": {
"match": {
"title": "my_text"
}
}
}
Используем кросс-кластерный поиск
Ну и конечно самое интересное это и есть сам кросс-кластерный поиск. Для его использования делаем всё тоже самое что и делали при поиске в удаленном кластере с добавлением через запятую того же index в исходном кластере.
GET my_index,my_cluster_name:my_index/_search
{
"query": {
"match": {
"title": "my_text"
}
}
}
В результатах будет видно какой документ находится в удаленном кластере. Поле _index будет иметь значение my_cluster_name:my_index.
Конечно если у вас десятки удаленных кластеров писать их все через запятую очень муторно, поэтому используем *. Благодаря этому поиск будет осуществлён во всех удаленных кластерах.
GET my_index,*:my_index/_search
{
"query": {
"match": {
"title": "my_text"
}
}
}
Как это работает
По умолчанию при запросе координирующий узел (coordinating node) отправляет по одному запросу в каждый из зарегистрированных кластеров. Это действие по умолчанию, но его можно изменить, выставив значение параметра ccs_minimize_roundtrips в false.
При значении false Координирующий узел (coordinating node) отправляет по одному запросу в каждый кластер для сбора всей информации о shards, а затем отправляет запрос каждому shard, участвующему в запросе. Рекомендуется выставлять значение параметра ccs_minimize_roundtrips в false только если у вас минимальная задержка на сетевом уровне между кластерами.

- 1 - Поступает запрос поиска к
Node2 - 2 -
Node2получает информацию оshardsна удаленном кластере - 3 - Запрос выполняется на локальных
shards - 4 - Запрос выполняется на удаленных
shards
GET my_index,*:my_index/_search?css_minimize_roundtrip=false
{
"query": {
"match": {
"title": "my_text"
}
}
}


Комментарии