【问题标题】:Can't connect to my Elasticsearch instance: NoNodeAvailableException无法连接到我的 Elasticsearch 实例:NoNodeAvailableException
【发布时间】:2018-09-01 12:28:09
【问题描述】:

无法连接到我的 Elasticsearch,开始于:

docker-compose up

运行命令:

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

输出:

{
  "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
      }
    }
  }
}

与传输客户端连接:

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;
}

得到错误:

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

(运行本地安装的 Elasticsearch 没有 Docker 它可以工作!)

我做错了什么?知道如何解决吗?

【问题讨论】:

  • 确保您的弹性客户端版本与您的弹性版本匹配!!那是我的问题。仍然得到 NoNodeAvailableException。

标签: java docker elasticsearch docker-compose elasticsearch-5


【解决方案1】:

传输端点绑定在 elasticsearch 容器内的本地主机上。这就是为什么它只能从容器本身访问。

传输端点应该绑定到elasticsearch容器中的0.0.0.0"transport_address" : "0.0.0.0:9300"),并且可以通过localhost:9300在主机上的localhost访问它。

因此,您可以使用以下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

更新:

如果你只是使用上面的docker-compose.yamlelasticsearch容器在启动时会失败并出现以下错误:

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

那是因为我们将 transport endpoint 更改为在 0.0.0.0 上收听。

为了修复它,需要将主机上的vm.max_map_count sysctl 参数至少增加到262144

sudo sysctl -w vm.max_map_count=262144

现在你可以通过docker-compose up成功启动两个容器了。

【讨论】:

  • 感谢您的回答我不确定,我应该编辑 Docker 容器 elasticsearch.yml、docker-compose.yml 还是上面的 Java client() 方法以及使用什么设置?
  • @powder366 为答案添加了其他信息。
  • 感谢反馈,现在我不能发出上面的 curl 命令,得到 curl: (7) 无法连接到 localhost 端口 9200:连接被拒绝。我在尝试连接时收到相同的消息 NoNodeAvailableException。还可以从 Docker 的控制台输出中获取以下信息:kibana_1 | {"type":"log","@timestamp":"2018-03-26T07:45:38Z","tags":["warning","elasticsearch"],"pid":12,"message": "无法恢复连接:elasticsearch:9200"} kibana_1 | {"type":"log","@timestamp":"2018-03-26T07:45:38Z","tags":["warning","elasticsearch"],"pid":12,"message": “没有生活联系”}
  • @powder366 为答案添加了附加信息
  • 我的 max_map_count 没有问题,但是根据我之前的评论,在您建议的更改之后有问题。
【解决方案2】:

当降级到 elasticsearch:2.4.4 时它可以工作,我怀疑它与 SpringData 与最新的 Elasticsearch 不兼容有关。

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

图表:

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

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

【讨论】:

  • 不,那是因为“注意:从 5.0 开始,Elasticsearch 默认只在 http 和传输端点上侦听 localhost)” - hub.docker.com/_/elasticsearch
  • 您能否澄清一下,我对较新版本的 Elasticsearch 进行了您建议的更改,但没有奏效。所以我删除了所有东西并安装了 2.4.4 并且它可以工作。我查看了 SpringData 的兼容图表,它只支持旧版本的 Elasticsearch。
  • 确保您的弹性客户端版本与您的弹性版本匹配!!那是我的问题。仍然得到NoNodeAvailableException
猜你喜欢
  • 2017-07-06
  • 2018-06-08
  • 2012-12-26
  • 2015-10-19
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多