Можно ли использовать несколько хостов эластичного поиска в конфигурации Spring Bean для нескольких индексов эластичного поиска - PullRequest
0 голосов
/ 23 марта 2019

У меня есть Java API для вставки документов в три эластичных индекса, и он работает.Я хочу изменить хост одного индекса в API.Обычно файл EsConfig и код ElasticSearchTemplate имеют вид:

public class EsConfig {
    @Value("${elasticsearch.host}")
    private String EsHost;
   @Value("${elasticsearch.port}")
   private int EsPort;
   @Value("${elasticsearch.clustername}")
   private String EsClusterName;

   @Bean
   public Client client() throws Exception {
      Settings settings = Settings.builder()
            .put("cluster.name", EsClusterName)
            //.put("index.max_result_window", 4000000)
            .build();

      TransportClient client = new PreBuiltTransportClient(settings)
            .addTransportAddress(new 
      TransportAddress(InetAddress.getByName(EsHost), EsPort));
      return client;
     }

     @Bean
     public ElasticsearchTemplate elasticsearchTemplate() throws Exception {
          ElasticsearchTemplate elasticsearchTemplate = new ElasticsearchTemplate(client());
          return elasticsearchTemplate;
      }

}

Я хочу настроить эту структуру для использования двух хостов вместе.Это возможно в этой структуре, или я должен полностью изменить и удалить структуру одноэлементного компонента?

1 Ответ

0 голосов
/ 25 марта 2019

API клиента Elasticsearch позволяет настроить несколько имен хостов следующим образом, но, к сожалению, они не работают должным образом.

В соответствии с этим LINK ,

TransportClient подключается удаленно к кластеру Elasticsearch с помощью транспортного модуля.Он не присоединяется к кластеру, а просто получает один или несколько начальных транспортных адресов и связывается с ними циклически по каждому действию (хотя большинство действий, вероятно, будут операциями «двух скачков»).

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new TransportAddress(InetAddress.getByName("host1"), 9300))
        .addTransportAddress(new TransportAddress(InetAddress.getByName("host2"), 9300));

Что вы можете сделать, возможно, так это реализовать концепцию Spring Boot Profiles , в которой вы можете создать несколько application.properties.Ниже приведен один из способов достижения этого.

Если у меня есть два разных хоста / окружения, например, dev и prod, я бы в конечном итоге создал три файла свойств приложения (два для окружения, одно свойство, в котором указывалось бы, какое окружение вам нужновыбирать).

application-dev.properties

elasticsearch.clustername = mycluster_name
elasticsearch.host = mydev.abc.com          <-- Configure the name of host 1
elasticsearch.port = 9300

application-prod.properties

elasticsearch.clustername = mycluster_name_2
elasticsearch.host = myprod.abc.com         <-- Configure the name of host 2
elasticsearch.port = 9300

приложение.properties

spring.profiles.active=dev                 <-- Configure which of the above properties do you want to start application with

Теперь, когда вы запускаете приложение в режиме весенней загрузки, оно в конечном итоге запускает среду dev.

Обратите внимание, что я предполагаю, что оба эти узла находятся в разных кластерах и не являются частью одного кластера.Причина, по которой я это указываю, заключается в том, что внутренняя библиотекаasticsearch будет продолжать и обновлять фрагменты реплики других узлов, если получит новый / обновленный документ.Находясь в одном кластере, не имеет значения, на какой хост в кластере вы указываете.

Дайте мне знать, если это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...