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

На схеме ниже продемонстрирована работа Кросс-кластерного поиска. Т.е вы выполняете запрос на одном из узлов в Кластере 2 и дальше Elasticsearch сам распараллеливает запрос между другими кластерами.

Cross-Cluster Search

Регистрация удаленных кластеров

Для добавления удаленного кластера используется 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 только если у вас минимальная задержка на сетевом уровне между кластерами.

Cross-Cluster Search

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