java - 无法连接到我的 Elasticsearch 实例 : NoNodeAvailableException

标签 java docker elasticsearch docker-compose elasticsearch-5

无法连接到我的 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)

jetty worker -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

(在没有 Docker 的情况下运行本地安装的 Elasticsearch 可以正常工作!)

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

最佳答案

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

传输端点应绑定(bind)到 0.0.0.0 ( "transport_address" : "0.0.0.0:9300" ) 在 elasticsearch容器,并且可以通过 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.yaml , elasticsearch容器在启动时失败并出现以下错误:
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 成功启动两个容器.

关于java - 无法连接到我的 Elasticsearch 实例 : NoNodeAvailableException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49439310/

相关文章:

java - Jenkins - 如何将覆盖率报告发布到 github

docker - NestJS 最小化 dockerfile

docker - 在 Docker 容器中运行不带 Selenium 服务器的 Nightwatch

python - 如何检测十进制列是否应转换为整数或 double ?

java - 如何将 TextView 与 EditText 堆叠在同一行(堆叠几行)

java - Gson 的 SharedPreferences 无法正常工作

java - Android Studio Activity 未链接

amazon-web-services - docker-machine 连接到现有机器

elasticsearch - 如何在Elasticsearch Nest中添加条件属性以创建索引?

elasticsearch - ElasticSearch将多个值作为输入(也包括正则表达式)以匹配(应该)在多个字段中