简体   繁体   中英

Can't connect to my Elasticsearch instance: NoNodeAvailableException

Can't connect to my Elasticsearch started with:

docker-compose up

Running command:

curl -XGET http://localhost:9200/_nodes/http?pretty

Output:

{
  "cluster_name" : "elasticsearch",
  "nodes" : {
    "qD18rHzhQaexExUw5sBgXg" : {
      "name" : "Scanner",
      "transport_address" : "172.19.0.3:9300",
      "host" : "172.19.0.3",
      "ip" : "172.19.0.3",
      "version" : "6.2.3",
      "build" : "fcbb46d",
      "http_address" : "172.19.0.3:9200",
      "http" : {
        "bound_address" : [ "0.0.0.0:9200" ],
        "publish_address" : "172.19.0.3:9200",
        "max_content_length_in_bytes" : 104857600
      }
    }
  }
}

Connect with transport client:

public Client client() throws Exception {
    Settings settings = Settings.builder()
        .put("spring.data.elasticsearch.cluster-nodes", "localhost:9300")
        .build();

    TransportClient client = TransportClient.builder()
        .settings(settings)
        .build()
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
    return client;
}

Get error:

Caused by: NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{localhost}{127.0.0.1:9300}]]
    at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:326)
    at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:223)

docker-compose.yml

services:
  elasticsearch:
    image: elasticsearch
    ports:
      - '9200:9200'
      - '9300:9300'
  kibana:
    image: kibana
    ports:
      - '5601:5601'
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200

Dockerfile

FROM elasticsearch, kibana
EXPOSE 9200
EXPOSE 9300

(running a local installed Elasticsearch without Docker it works!)

What am I doing wrong? Any idea how to fix it?

Transport endpoint is bound on localhost inside elasticsearch container. That's why it is only accessible from the container itself.

Transport endpoint should be bound to 0.0.0.0 ( "transport_address" : "0.0.0.0:9300" ) in elasticsearch container and it will be possible to access it via localhost on a host machine by localhost:9300 .

So, you can achieve that with the following docker-compose.yaml :

version: "3"
services:
  elasticsearch:
    image: elasticsearch
    command: "-Etransport.host=0.0.0.0"
    ports:
      - '9200:9200'
      - '9300:9300'
  kibana:
    image: kibana
    ports:
      - '5601:5601'
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200

Update:

If you just use the above docker-compose.yaml , elasticsearch container fails with the following error when it starts:

elasticsearch_1  | [2018-03-26T07:44:13,475][INFO ][o.e.n.Node               ] [rzYPgrJ] starting ...
elasticsearch_1  | [2018-03-26T07:44:13,663][INFO ][o.e.t.TransportService   ] [rzYPgrJ] publish_address {172.17.0.2:9300}, bound_addresses {0.0.0.0:9300}
elasticsearch_1  | [2018-03-26T07:44:13,688][INFO ][o.e.b.BootstrapChecks    ] [rzYPgrJ] bound or publishing to a non-loopback address, enforcing bootstrap checks
elasticsearch_1  | ERROR: [1] bootstrap checks failed
elasticsearch_1  | [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
elasticsearch_1  | [2018-03-26T07:44:13,696][INFO ][o.e.n.Node               ] [rzYPgrJ] stopping ...
elasticsearch_1  | [2018-03-26T07:44:13,747][INFO ][o.e.n.Node               ] [rzYPgrJ] stopped
elasticsearch_1  | [2018-03-26T07:44:13,747][INFO ][o.e.n.Node               ] [rzYPgrJ] closing ...
elasticsearch_1  | [2018-03-26T07:44:13,762][INFO ][o.e.n.Node               ] [rzYPgrJ] closed

That's because we changed transport endpoint be listened on 0.0.0.0 .

In order to fix it, it is necessary to increase vm.max_map_count sysctl parameter on a host mashine at least up to 262144 :

sudo sysctl -w vm.max_map_count=262144

Now you can successfully start both containers by docker-compose up .

When downgrading to elasticsearch:2.4.4 it works, I suspect it has to do with SpringData not being compatible with latest Elasticsearch.

   ...
    services:
      elasticsearch:
        image: elasticsearch:2.4.4
        ports:
          - '9200:9200'
          - '9300:9300'
      kibana:
        image: kibana:4.6.1
    ...

Charts:

https://github.com/spring-projects/spring-data-elasticsearch

https://www.elastic.co/support/matrix

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM