java Elasticsearch:在传输层捕获异常
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/34161544/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Elasticsearch: exception caught on transport layer
提问by Peter G.
After upgrading Elasticsearch from version 1.6 to 2.1 I see an error in my Java application.
将 Elasticsearch 从 1.6 版升级到 2.1 版后,我在 Java 应用程序中看到一个错误。
The application used to work with Java before, but now the connection gets terminated immediately and a similar error (org.elasticsearch.client.transport.NoNodeAvailableException
) is thrown in the application as result.
该应用程序以前使用 Java,但现在连接立即终止org.elasticsearch.client.transport.NoNodeAvailableException
,结果在应用程序中抛出类似的错误 ( )。
It all happens during first connection attempt, which points to a clash between the versions, but may as well be something else.
这一切都发生在第一次连接尝试期间,这表明版本之间存在冲突,但也可能是其他原因。
What can it be specifically, is there any way to fix it other than changing the versions?
它具体是什么,除了更改版本之外还有其他方法可以修复它吗?
elasticsearch.log
:
elasticsearch.log
:
[2015-12-08 17:42:54,035][WARN ][transport.netty ] [Lorna Dane] exception caught on transport layer [[id: 0x9f75ad33, /192.168.0.208:21248 => /192.168.0.140:9300]], closing connection
java.lang.IllegalStateException: Message not fully read (request) for requestId [0], action [cluster/nodes/info], readerIndex [39] vs expected [57]; resetting
at org.elasticsearch.transport.netty.MessageChannelHandler.messageReceived(MessageChannelHandler.java:120)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:462)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:443)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.elasticsearch.common.netty.OpenChannelsHandler.handleUpstream(OpenChannelsHandler.java:75)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
at org.jboss.netty.util.internal.DeadLockProofWorker.run(DeadLockProofWorker.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Java console:
Java控制台:
Exception in thread "main" org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: []
at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:298)
at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:214)
at org.elasticsearch.client.transport.support.InternalTransportClusterAdminClient.execute(InternalTransportClusterAdminClient.java:85)
at org.elasticsearch.client.support.AbstractClusterAdminClient.state(AbstractClusterAdminClient.java:138)
at org.elasticsearch.action.admin.cluster.state.ClusterStateRequestBuilder.doExecute(ClusterStateRequestBuilder.java:94)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:91)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:65)
采纳答案by Tim Van Laer
Make sure to keep the elasticsearch client library jar in sync with the version of your cluster.
确保将 elasticsearch 客户端库 jar 与您的集群版本保持同步。
For example when using Maven:
例如在使用 Maven 时:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.1.0</version>
</dependency>
回答by Meekohi
This happens for any >2.x Elasticsearch instance anytime there is still a 1.x machine looking for clusters (it sends bad protocol information) on the same network. Technically you can ignore it (it's just letting you know that the 1.x machine tried to connect but did an invalid connection), however probably your logs will fill up etc. if you leave it alone too long.
对于任何 >2.x Elasticsearch 实例,只要仍有一台 1.x 机器在同一网络上寻找集群(它发送错误的协议信息),就会发生这种情况。从技术上讲,您可以忽略它(它只是让您知道 1.x 机器尝试连接但连接无效),但是如果您将其放置太久,您的日志可能会填满等。
Best solution is to isolate your old 1.x nodes from the newer nodes until you're done upgrading.
最好的解决方案是将旧的 1.x 节点与新节点隔离,直到完成升级。