ElasticSearch NoNodeAvailableException[None of the configured nodes are available]
ElasticSearch 偶尔会报下面的错误
系统发生异常 (NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{192.168.xxx.xxx}{192.168.xxx.xxx:9300}]])
可能有以下几个原因:
端口错误
javaclient = new TransportClient().addTransportAddress(new InetSocketTransportAddress(ipAddress, 9300));
端口 9300 写成 9200 的报错 No node available 或者查看连接的是不是本地计算机,如果是远程的话查看一下 IP 地址是否正确。
jar 包报错误的话可能是引用包不匹配,开启的服务是什么版本最好对应相应的 jar 包。
修改了集群名称,设置了集群名字导致出现问题,设置操作如下:
javaSettings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "yoodb").build(); client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(ipAddress, 9300));
集群超过 5s 没有响应,解决方式如下:
设置
client.transport.ping_timeout
超时时间,增大一些代码内嵌入,如下:
javawhile (true) { try { bulk.execute().actionGet(getRetryTimeout()); break; } catch (NoNodeAvailableException cont) { Thread.sleep(5000); continue; } }
因为只是偶尔报错,排除了上面 1、2、3 的可能,可能是网络原因或者服务器原因导致获取 node 超时了。
准备先将 client.transport.ping_timeout
设置成 60s 看看效果。
java
//设置集群的名字
Settings settings = Settings.settingsBuilder()
.put("cluster.name", clusterName)
.put("client.transport.sniff", false)
.put("client.transport.ping_timeout", "60s")
.build();
//创建集群 client 并添加集群节点地址
transportClient = TransportClient.builder()
.settings(settings)
.build();
//添加 IP
for (String ip : ips) {
transportClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), 9300));
}
参照:
ElasticSearch 使用问题及解决方案汇总
生产环境使用 elasticsearch 遇到的一些问题以及解决方法(不断更新)