没有节点可用异常 Elasticsearch 5.0.2
No Node Available Exception Elasticsearch 5.0.2
首先,我为我的英语感到抱歉。
Java API 传输客户端有问题。我有一个主节点和三个数据节点。我的 Elasticsearch 版本是 5.0.2,我使用 5.0.2 API.
我尝试使用 Transport Client 连接到我的集群,然后我响应
Exception in thread "main" NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{8SAZOxXXTU61DuDDMN-vGw}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}, {#transport#-2}{Fv3729YgTGClRBo5T2mWpA}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}, {#transport#-3}{Fr98ApBbRv29Xv6Mc8L4TQ}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}, {#transport#-4}{JOmpSH4LRzuP_XInxQtD9Q}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}]]
at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:328)
at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:226)
at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59)
at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:339)
at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:403)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:80)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:54)
at org.elasticsearch.action.ActionRequestBuilder.get(ActionRequestBuilder.java:62)
at nn.Main.main(Main.java:57)
这是我的客户端代码:
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
public class Main {
private static String[] hosts = new String[] {
"XX.XX.X.XXX"
,"XX.XX.X.XXX"
,"XX.XX.X.XXX"
,"XX.XX.X.XXX"
};
private static final Settings settings = Settings.builder()
.put("cluster.name", "myCluster")
.put("client.transport.sniff", true)
.put("transport.tcp.port", 9300)
.put("xpack.security.user", "transport_client_user:changeme")
.build();
private static final String index = "myIndex";
private static final String type = "myType";
private static TransportClient client;
public static void main(String[] args) throws UnknownHostException {
InetSocketTransportAddress[] ista = new InetSocketTransportAddress[hosts.length];
for (int i = 0; i < hosts.length; i++) {
ista[i] = new InetSocketTransportAddress(InetAddress.getByName(hosts[i]), 9300);
}
client = new PreBuiltXPackTransportClient(settings).addTransportAddresses(ista);
SearchRequestBuilder rb = client
.prepareSearch(index)
.setTypes(type)
.setSearchType(SearchType.DEFAULT)
.setQuery(QueryBuilders.termQuery("_id", 3524598));
SearchResponse sResponse = rb.get();
System.out.println(sResponse.toString());
}
}
传输客户端端口 - 9300,我所有的节点都在这个端口下通信。我看到了很多像我的问题,我试图遵循其中包含的建议。但是我有同样的例外。
如果需要更多信息或我的 Elastic 的任何文件或设置 - 我随时准备回答。
如果重要,这是 elasticsearch.yml
的内容
cluster.name: myCluster
node.name: elastic-0
path.data: /var/db/elasticsearch
path.logs: /var/log/elasticsearch
path.scripts: /usr/local/libexec/elasticsearch
network.host: _vmx0_
node.master: true
node.data: false
node.ingest: false
node.attr.rack_id: rack_one
cluster.routing.allocation.awareness.attributes: rack_id
discovery.zen.minimum_master_nodes: 3
discovery.zen.ping.unicast.hosts: ["XX.XX.X.XXX","XX.XX.X.XXX","XX.XX.X.XXX","XX.XX.X.XXX","XX.XX.X.XXX"]
bootstrap.memory_lock: false
xpack.monitoring.exporters:
id1:
type: http
host: ["XX.XX.X.XXX:9200"]
auth.username: remote_monitor
auth.password: changeme
我试图仅在 Client
上更改 TransportClient
,并禁用 client.transport.sniff
,但没有结果。
如有任何帮助或想法,我将不胜感激。
我找到了我收到 "NoNodeAvailableException" 的原因。
原因是transport_client的角色默认没有授予查看所有索引中数据的权限。
我将建立我的角色来访问索引中的数据。
Link: https://www.elastic.co/guide/en/x-pack/5.0/built-in-roles.html
当我们尝试将 ES 与 TranscientClient (9300) 一起使用而不是与 API (9200) 一起使用时,通常会发生此异常。
这些可能是这背后的原因:
我们提供的IP地址或端口有误。默认情况下,传输通信通过 9300 发生,除非我们明确更改 elastisearch.yml
IP 地址和端口无法从我们 运行 Java 应用所在的机器访问。 ES机器根本无法从客户端机器访问,所以我们需要打开客户端的端口和IP。
如果我们更改 'transport.host',那么 ES 将视为生产环境并进行 bootstrap 检查。但是在环境不是 prod 的情况下,我们在一台机器上是 运行 ES,并试图从另一台机器上使用传输客户端(Java 应用程序)访问它,那么我们可以只添加 'discovery.type: single-node'.
按如下方式更改 Elastic Search yaml:
cluster.name: elasticsearch
node.name: node-1
transport.host: 0.0.0.0
transport.tcp.port: 9300
http.port: 9200
network.host: 0.0.0.0
discovery.type: single-node
首先,我为我的英语感到抱歉。 Java API 传输客户端有问题。我有一个主节点和三个数据节点。我的 Elasticsearch 版本是 5.0.2,我使用 5.0.2 API.
我尝试使用 Transport Client 连接到我的集群,然后我响应
Exception in thread "main" NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{8SAZOxXXTU61DuDDMN-vGw}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}, {#transport#-2}{Fv3729YgTGClRBo5T2mWpA}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}, {#transport#-3}{Fr98ApBbRv29Xv6Mc8L4TQ}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}, {#transport#-4}{JOmpSH4LRzuP_XInxQtD9Q}{XX.XX.X.XXX}{XX.XX.X.XXX:9300}]]
at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:328)
at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:226)
at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59)
at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:339)
at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:403)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:80)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:54)
at org.elasticsearch.action.ActionRequestBuilder.get(ActionRequestBuilder.java:62)
at nn.Main.main(Main.java:57)
这是我的客户端代码:
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
public class Main {
private static String[] hosts = new String[] {
"XX.XX.X.XXX"
,"XX.XX.X.XXX"
,"XX.XX.X.XXX"
,"XX.XX.X.XXX"
};
private static final Settings settings = Settings.builder()
.put("cluster.name", "myCluster")
.put("client.transport.sniff", true)
.put("transport.tcp.port", 9300)
.put("xpack.security.user", "transport_client_user:changeme")
.build();
private static final String index = "myIndex";
private static final String type = "myType";
private static TransportClient client;
public static void main(String[] args) throws UnknownHostException {
InetSocketTransportAddress[] ista = new InetSocketTransportAddress[hosts.length];
for (int i = 0; i < hosts.length; i++) {
ista[i] = new InetSocketTransportAddress(InetAddress.getByName(hosts[i]), 9300);
}
client = new PreBuiltXPackTransportClient(settings).addTransportAddresses(ista);
SearchRequestBuilder rb = client
.prepareSearch(index)
.setTypes(type)
.setSearchType(SearchType.DEFAULT)
.setQuery(QueryBuilders.termQuery("_id", 3524598));
SearchResponse sResponse = rb.get();
System.out.println(sResponse.toString());
}
}
传输客户端端口 - 9300,我所有的节点都在这个端口下通信。我看到了很多像我的问题,我试图遵循其中包含的建议。但是我有同样的例外。
如果需要更多信息或我的 Elastic 的任何文件或设置 - 我随时准备回答。
如果重要,这是 elasticsearch.yml
的内容cluster.name: myCluster
node.name: elastic-0
path.data: /var/db/elasticsearch
path.logs: /var/log/elasticsearch
path.scripts: /usr/local/libexec/elasticsearch
network.host: _vmx0_
node.master: true
node.data: false
node.ingest: false
node.attr.rack_id: rack_one
cluster.routing.allocation.awareness.attributes: rack_id
discovery.zen.minimum_master_nodes: 3
discovery.zen.ping.unicast.hosts: ["XX.XX.X.XXX","XX.XX.X.XXX","XX.XX.X.XXX","XX.XX.X.XXX","XX.XX.X.XXX"]
bootstrap.memory_lock: false
xpack.monitoring.exporters:
id1:
type: http
host: ["XX.XX.X.XXX:9200"]
auth.username: remote_monitor
auth.password: changeme
我试图仅在 Client
上更改 TransportClient
,并禁用 client.transport.sniff
,但没有结果。
如有任何帮助或想法,我将不胜感激。
我找到了我收到 "NoNodeAvailableException" 的原因。
原因是transport_client的角色默认没有授予查看所有索引中数据的权限。 我将建立我的角色来访问索引中的数据。
Link: https://www.elastic.co/guide/en/x-pack/5.0/built-in-roles.html
当我们尝试将 ES 与 TranscientClient (9300) 一起使用而不是与 API (9200) 一起使用时,通常会发生此异常。
这些可能是这背后的原因:
我们提供的IP地址或端口有误。默认情况下,传输通信通过 9300 发生,除非我们明确更改 elastisearch.yml
IP 地址和端口无法从我们 运行 Java 应用所在的机器访问。 ES机器根本无法从客户端机器访问,所以我们需要打开客户端的端口和IP。
如果我们更改 'transport.host',那么 ES 将视为生产环境并进行 bootstrap 检查。但是在环境不是 prod 的情况下,我们在一台机器上是 运行 ES,并试图从另一台机器上使用传输客户端(Java 应用程序)访问它,那么我们可以只添加 'discovery.type: single-node'.
按如下方式更改 Elastic Search yaml:
cluster.name: elasticsearch
node.name: node-1
transport.host: 0.0.0.0
transport.tcp.port: 9300
http.port: 9200
network.host: 0.0.0.0
discovery.type: single-node