SpringData Elasticsearch NoNodeAvailableException - PullRequest
0 голосов
/ 07 марта 2020

Я использую SpringData для подключения моего приложения к локальному экземпляру Elasti c. Когда я регулярно получаю curl для получения информации о ES, она работает нормально, но я не могу подключиться к ней из приложения Springboot. Elasticsearch локальная версия ./elasticsearch -V => Version: 7.6.0 SpringData Elasti c поиск версии 3.1.11

> curl -XGET 'http://localhost:9200/_cluster/state?pretty'
{
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "1_8HMIK5QDug_xH80VZLgQ",
  "version" : 54,
  "state_uuid" : "YEe1FSwfRUuw0uw-T69fJQ",
  "master_node" : "Nbktx7KrREetbyfL7v0Fog",
  "blocks" : { },
  "nodes" : {
    "Nbktx7KrREetbyfL7v0Fog" : {
      "name" : "k***-macOS",
      "ephemeral_id" : "pqMw40oPTUmBoHsyTAz9cg",
      "transport_address" : "127.0.0.1:9301",
      "attributes" : {
        "ml.machine_memory" : "17179869184",
        "xpack.installed" : "true",
        "ml.max_open_jobs" : "20"
      }
    }
  },
    @Value("$ELASTIC_HOST")
    private String EsHost;

    @Value("$ELASTIC_PORT")
    private String EsPort;

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() throws UnknownHostException {
        return new ElasticsearchTemplate(elasticsearchClient());
    }
    @Bean
    public Client elasticsearchClient() throws UnknownHostException {


        Settings settings = Settings.builder()
                .put("client.transport.sniff", true).build();
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress( new TransportAddress(InetAddress.getByName(EsHost), Integer.valueOf(EsPort));
        return client;
    }

Пробовал все вышеперечисленные способы получить хост и порт ТАКЖЕ ПРОБОВАНО С 9300 , но все еще не повезло. Кроме того, мой elasticsearch.yml является файлом по умолчанию и не добавляет явного хоста или портов.

Docker-compose

version: '3'
services:
  elastic:
    restart: always
    image: docker.elastic.co/elasticsearch/elasticsearch:6.2.2
    environment:
      - cluster.name=elasticsearch
      - node.name=es01
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9201:9200"
      - "9301:9300"
  db:
    restart: always
    image: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: 'xxx'
      POSTGRES_USER: 'xx'
      POSTGRES_DB: 'xx'
  api:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      ENVIRONMENT_NAME: "dev"
      REGION_NAME: "local"
      POSTGRES_PASSWORD: "xx"
      POSTGRES_USER: "xx"
      POSTGRES_HOST: "db"
      ELASTIC_HOST: "elastic"
      ELASTIC_PORT: "9200"
    depends_on:
      - db
      - elastic

ERROR:

"failed to load elasticsearch nodes : org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{JjFZc4y-RBCYbdELAsgaAQ}{elastic}{172.20.0.2:9200}]"}

It works if I change this to

environment:
      ENVIRONMENT_NAME: "dev"
      REGION_NAME: "local"
      POSTGRES_PASSWORD: "xxx"
      POSTGRES_USER: "xx"
      POSTGRES_HOST: "db"
      ELASTIC_HOST: "elastic"
      ELASTIC_PORT: "9300" --> this is changed from 9200 
client.addTransportAddress(new TransportAddress(InetAddress.getLocalHost(), 9201));

Нет, идея почему !!

1 Ответ

0 голосов
/ 08 марта 2020

Spring Data Elasticsearch 3.1.11 построен с клиентскими библиотеками Elasticsearch в версии 6.2.2. Таким образом, даже если вам удастся установить соединение с кластером, очень высоки шансы, что клиент и кластер не смогут правильно взаимодействовать.

Что касается настройки соединения: вы должны добавить имя кластера, к которому вы хотите подключиться, в настройках:

Settings settings = Settings.builder()
            .put("client.transport.sniff", true)
            .put("cluster.name", "elasticsearch")
            .build();
...