【问题标题】:NoNodeAvailableException : None of the configured nodes are availableNoNodeAvailableException : 配置的节点都不可用
【发布时间】:2017-08-07 04:39:16
【问题描述】:

我正在尝试从我的 Java Web 服务中的 Elastic Search 中进行搜索, 这是我现在的使用方式:

    Client client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.10.150"), 9200));
    SearchResponse searchResponse = client.prepareSearch().execute().actionGet();

第一行可以正常工作,但是当它进入第二行时,会出现下面的异常:

NoNodeAvailableException[配置的节点都不可用: [{#transport#-1}{TskPSVeBRR6CvCzP9EVhkQ}{192.168.10.150}{192.168.10.150:9200}]]

无论我用9200还是9300设置端口,结果都是一样的。

另外,我尝试使用 NEST 从我的 .Net 程序中进行搜索,并且运行良好。以下是我的尝试:

    var node = new Uri("http://192.168.10.150:9200");
    var settings = new ConnectionSettings(node).DefaultIndex("iod-2017.03.08.*");
    _EsClient = new ElasticClient(settings);
    var index = String.Format("iod-{0}.{1:00}.{2:00}.*", item.TriggerTime.Year, item.TriggerTime.Month, item.TriggerTime.Day);
    var uniqueId = item.UniqueId.ToString();
    var result = _EsClient.Search<logs>(s => s.Index(index).Query(q => q.Match(t => t.Field(l => l.id).Query(uniqueId))));

我的 Java 程序有没有做错任何事情(防火墙、库的版本、调用 API 的方法等)?我目前的Java版本是1.8.0.121Elastic SearchTransport Client的版本都是 5.2。谢谢!

【问题讨论】:

  • 你能检查一下你是否可以从你的本地机器telnet到端口9300上的ES机器吗? 9200 似乎已打开,因为您的 .NET 客户端正在使用它
  • 您使用的是不是 elasticsearch 的集群名称?如果是,您是否在设置中更新了相同的内容?
  • 我的问题已经解决了!你是对的,我应该使用 9300 端口,但严重的错误是我没有正确设置集群名称。在设置中设置 cluster.name 后我可以搜索。非常感谢!
  • 很高兴,它解决了您的问题。在答案中添加了相同的内容。请采纳

标签: java elasticsearch


【解决方案1】:

正如在 cmets 中所讨论的,

如果您使用的集群名称不是elasticsearch,那么您需要在设置中进行更新。

Settings settings = Settings.builder()
        .put("cluster.name", "myClusterName").build();

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我的集群名称和一切都正确,但我的弹性集群使用的是 X-Pack Security。也正因为如此。

    这里是解决方案 - https://www.elastic.co/guide/en/x-pack/current/java-clients.html

    【讨论】:

      【解决方案3】:

      如果您是从解压文件中安装elasticsearch(例如:elasticsearch-5.4.0.tar.gz),请尝试通过yum 或其他RPM 工具安装。 https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html 它帮助我解决了这个问题。

      【讨论】:

        【解决方案4】:

        来自文档,

        // on startup
        
        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300)); 
        

        【讨论】:

          【解决方案5】:

          在执行程序之前,请确保您运行了 ElasticSearch -> config 文件夹下的 elasticSearch.bat 批处理文件。还要确保您在运行批处理文件的控制台中看到 "started" 记录。

          您可以通过点击 URL localhost:9200 来检查弹性搜索是否成功启动。您应该会看到如下所示的页面:

          {
            "name" : ...,
            "cluster_name" : "elasticsearch",
            "cluster_uuid" : ...,
            "version" : {
              "number" : "5.5.2",
              ...
              "build_snapshot" : false,
              "lucene_version" : "6.6.0"
            },
            "tagline" : "You Know, for Search"
          }
          

          【讨论】:

            【解决方案6】:

            在连接 URI 上添加集群名称作为参数:

            1. 转到http://&lt;elasticsearch_host&gt;:9200
            2. 检索cluster_name 值并将其作为参数添加到连接URI: elasticsearch://&lt;elasticsearch_host&gt;:9300?cluster.name=&lt;cluster_name_value&gt;

            【讨论】:

              【解决方案7】:

              此异常指向 elasticSearch 传输客户端无法与 elasticsearch 服务器建立连接。

              根本原因可能是服务器的端口名称或 IP/主机名或集群名称或 身份验证不正确。

              打开 elasticSearch.yaml 文件并正确验证所有详细信息。 使用以下配置参数忽略 clusterName 验证。

              client.transport.ignore_cluster_name = true
              

              创建传输客户端的完整代码sn-p是:

               Settings settingsBuilder = Settings.builder()
                          .put("cluster.name", DBPropertyUtil.getPropertyByName("es.cluster")).put("client.transport.sniff", true).put("client.transport.ignore_cluster_name", true).build();
                          //.put("client.transport.sniff", true).put("path.home", ".").build();
                       Client client = new PreBuiltTransportClient(settingsBuilder)
                          .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
              

              根据您的服务器指定主机和端口。这段代码对我来说很好用。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-11-23
                • 1970-01-01
                • 1970-01-01
                • 2014-11-12
                • 1970-01-01
                相关资源
                最近更新 更多