【问题标题】:Elasticsearch 5 Java Client giving "NoNodeAvailableException"Elasticsearch 5 Java 客户端给出“NoNodeAvailableException”
【发布时间】:2017-06-27 08:05:30
【问题描述】:

我正在使用 Elasticsearch 5.2 和 Spring Boot 1.5.1。我通过 Spring 应用程序中的 Java 客户端连接到它。当我在端口9300 或9200 上连接到它时,我得到NoNodeAvailableException: None of the configured nodes are available。在我的 Java 客户端中,我将client.transport.sniff 属性设置为true。通过端口 9200 上的 cURL 向它发送请求时,它工作正常。我在一个集群中有 4 个节点,我无法连接到其中任何一个。我的配置文件具有 network 部分中的所有默认值,除了 network.host 具有 eth0 inet addr 作为值。

我正在使用 Gradle。我的依赖是:

compile('org.springframework.boot:spring-boot-starter-web')
compile('org.elasticsearch:elasticsearch:5.2.0')
compile('org.elasticsearch.client:transport:5.2.0')
compile('org.apache.logging.log4j:log4j-api:2.7')
compile('org.apache.logging.log4j:log4j-core:2.7')

我连接 Elasticsearch 集群的代码:

@Bean
public TransportClient elasticClient() {
    org.elasticsearch.common.settings.Settings settings = Settings.builder()
        .put("client.transport.sniff", true)
        .put("cluster.name", "TestCluster")
            .build();
    TransportClient client = null;
    try {
        client = new org.elasticsearch.transport.client.PreBuiltTransportClient(settings)
            .addTransportAddress(new org.elasticsearch.common.transport.InetSocketTransportAddress(
                InetAddress.getByName("54.175.155.56"), 9200));
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
    return client;
}

ES启动时我的ES日志是:

[2017-02-15T10:37:40,664][INFO ][o.e.t.TransportService   ] [ip-10-0-29-2] publish_address {10.0.29.2:9300}, bound_addresses {10.0.29.2:9300}
[2017-02-15T10:37:40,669][INFO ][o.e.b.BootstrapChecks    ] [ip-10-0-29-2] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
[2017-02-15T10:37:43,856][INFO ][o.e.c.s.ClusterService   ] [ip-10-0-29-2] detected_master {kafka-stage}{sTIeF8gGTNam0oNW8dkbbA}{TTX6FIRtRp-gDemYY-22Sg}{10.0.20.71}{10.0.20.71:9300}, added {{kafka-stage-2}{jl3oLGgMQ1yxhdMMy65k_g}{ibV8BApjRByUOpDDncddyQ}{10.0.51.31}{10.0.51.31:9300},{ip-10-0-40-144}{t-_THs3wQbC_k9eivDo5eQ}{v-UYoYgXQ265QkdYhtiPYA}{10.0.40.144}{10.0.40.144:9300},{kafka-stage}{sTIeF8gGTNam0oNW8dkbbA}{TTX6FIRtRp-gDemYY-22Sg}{10.0.20.71}{10.0.20.71:9300},}, reason: zen-disco-receive(from master [master {kafka-stage}{sTIeF8gGTNam0oNW8dkbbA}{TTX6FIRtRp-gDemYY-22Sg}{10.0.20.71}{10.0.20.71:9300} committed version [98]])
[2017-02-15T10:37:44,009][INFO ][o.e.h.HttpServer         ] [ip-10-0-29-2] publish_address {10.0.29.2:9200}, bound_addresses {10.0.29.2:9200}
[2017-02-15T10:37:44,009][INFO ][o.e.n.Node               ] [ip-10-0-29-2] started

这些问题的答案并不能解决我的问题:

  1. Java ElasticSearch None of the configured nodes are available
  2. Elasticsearch - NoNodeAvailableException
  3. Elasticsearch NoNodeAvailableException issue

【问题讨论】:

  • 你能分享你的 POM 吗?
  • @Val 我已经添加了我的依赖项。
  • 你能分享你连接到ES的java代码吗?
  • @Mysterion 我已经添加了 Java 代码。

标签: java spring elasticsearch


【解决方案1】:

在您的elasticsearch.yml 配置文件中,您需要确保绑定到正确的主机并具有以下设置:

network.host: 54.175.155.56

同样在您的 Java 代码中,由于您使用的是传输客户端,因此您需要使用端口 9300(用于 TCP 通信)而不是 9200,后者用于 HTTP 通信(例如通过 curl)

    client = new org.elasticsearch.transport.client.PreBuiltTransportClient(settings)
        .addTransportAddress(new org.elasticsearch.common.transport.InetSocketTransportAddress(
            InetAddress.getByName("54.175.155.56"), 9300));
                                                     ^
                                                     |
                                                change this

【讨论】:

  • 我使用eth0 inet addr 作为network.host 值。使用 DNS IP 不允许我连接到集群。我尝试将两者都用作数组,然后出现错误:BindException: Cannot assign requested address。使用端口9300 会得到相同的结果。
  • 能否用 ES 启动时看到的 ES 日志更新您的问题,尤其是出现“publish_host”和“bind_host”的行。
  • 在我启动 ES 时添加它们,仅使用 eth0 inet addr 作为 network.host
  • 那么你需要在你的Java代码中使用10.0.29.2:9300。
  • 我遇到了同样的错误。我可以使用 cURL 连接到 ES,但不能通过 Java。
【解决方案2】:

我连接的节点只是一个主节点。它有node.ingest 和node.data 作为false。在连接到具有node.ingest 为true 的节点并删除Java 客户端中的client.transport.sniff 设置时,我能够连接到ES 集群。

【讨论】:

  • 我遇到了类似的问题。但我想我只有一个节点。你能给我一些建议吗?
  • @niaomingjian 在您的主节点中将node.ingest 设置为true。
  • 我只有一个 ES 实例。我的问题在这里stackoverflow.com/q/47050107/4983501
【解决方案3】:

这个问题的答案很可能是 clustername 可能与 elasticsearch.yml 不同,请进行配置,并且在 elasticsearch 中它使用 两个端口:它们是 9200提供通过http访问,9300用于通过Java Transport Client使用的内部传输协议访问Elasticsearch。

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 2015-09-13
    • 1970-01-01
    • 2017-07-05
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多