繁体   English   中英

NoNodeAvailableException : 没有配置的节点可用

[英]NoNodeAvailableException : None of the configured nodes are available

我正在尝试从我的 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 谢谢!

正如评论中所讨论的,

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

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

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

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

从文档来看,

// on startup

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

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

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

您可以通过点击 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"
}

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

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

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

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

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

client.transport.ignore_cluster_name = true

创建传输客户端的完整代码片段是:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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