Имея множество кластеров, вы можете распределять нагрузку при запросе между всеми узлами ваших кластеров. Возможно это благодаря поддержке Кросс-кластерного поиска (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"
}
}
}
Комментарии