簡體   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