【问题标题】:Can't connect to ElasticSearch Docker cluster which run on local virtual machine using Java API无法使用 Java API 连接到在本地虚拟机上运行的 ElasticSearch Docker 集群
【发布时间】:2019-08-30 18:50:59
【问题描述】:

我使用 Oracle VM 作为虚拟机运行 Ubuntu。在此 VM 中使用以下命令运行 elasticsreach docker:

sudo docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch

在 Oracle VM 机器网络设置中,我添加了此端口转发:

接待客人

127.0.0.1:9200 --> 127.0.0.1:9200 127.0.0.1:9300 --> 127.0.0.1:9300

当我尝试使用 chrome 向地址 127.0.0.1:9200 和 127.0.0.1:9300 发送 http 请求时,我得到了没有问题的响应。

当我尝试使用 Java 客户端 API 进行连接时,出现以下异常:

[DEBUG] org.elasticsearch.client.transport - [Rattler] adding address [[#transport#-1][ran-pc][inet[/127.0.0.1:9300]]]
[DEBUG] org.elasticsearch.transport.netty - [Rattler] connected to node [[#transport#-1][ran-pc][inet[/127.0.0.1:9300]]]
[DEBUG] org.elasticsearch.client.transport - [Rattler] failed to connect to discovered node [[Ringmaster][LB14-DlsS-2XIDwduUj5sA][c367b60225b2][inet[/172.17.0.2:9300]]]
org.elasticsearch.transport.ConnectTransportException: [Ringmaster][inet[/172.17.0.2:9300]] connect_timeout[30s]
    at org.elasticsearch.transport.netty.NettyTransport.connectToChannels(NettyTransport.java:825) ~[elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.transport.netty.NettyTransport.connectToNode(NettyTransport.java:758) ~[elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.transport.netty.NettyTransport.connectToNode(NettyTransport.java:731) ~[elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.transport.TransportService.connectToNode(TransportService.java:216) ~[elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.client.transport.TransportClientNodesService$NodeSampler.validateNewNodes(TransportClientNodesService.java:331) [elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.client.transport.TransportClientNodesService$SniffNodesSampler.doSample(TransportClientNodesService.java:503) [elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.client.transport.TransportClientNodesService$NodeSampler.sample(TransportClientNodesService.java:315) [elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.client.transport.TransportClientNodesService.addTransportAddresses(TransportClientNodesService.java:174) [elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.client.transport.TransportClient.addTransportAddresses(TransportClient.java:268) [elasticsearch-1.6.0.jar:na]
    at infastructure.documents.ElasticSearchDocumentStore.lambda$Connect$2(ElasticSearchDocumentStore.java:104) [classes/:na]
    at infastructure.documents.ElasticSearchDocumentStore$$Lambda$5/673384643.run(Unknown Source) [classes/:na]
    at com.nurkiewicz.asyncretry.AsyncRetryExecutor.lambda$doWithRetry$4(AsyncRetryExecutor.java:55) [asyncretry-0.0.6.jar:na]
    at com.nurkiewicz.asyncretry.AsyncRetryExecutor$$Lambda$6/3886839.call(Unknown Source) [asyncretry-0.0.6.jar:na]
    at com.nurkiewicz.asyncretry.SyncRetryJob.run(SyncRetryJob.java:23) [asyncretry-0.0.6.jar:na]
    at com.nurkiewicz.asyncretry.RetryJob.run(RetryJob.java:95) [asyncretry-0.0.6.jar:na]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_45]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_45]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_45]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_45]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_45]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_45]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]
Caused by: java.net.ConnectException: Connection timed out: no further information: /172.17.0.2:9300
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.8.0_45]
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) ~[na:1.8.0_45]
    at org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.connect(NioClientBoss.java:152) ~[elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.processSelectedKeys(NioClientBoss.java:105) ~[elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.process(NioClientBoss.java:79) ~[elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.common.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:337) ~[elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.common.netty.channel.socket.nio.NioClientBoss.run(NioClientBoss.java:42) ~[elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.common.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) ~[elasticsearch-1.6.0.jar:na]
    at org.elasticsearch.common.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) ~[elasticsearch-1.6.0.jar:na]
    ... 3 common frames omitted

如您所见,它成功连接到 127.0.0.1:9300,但随后它获取了节点 ip (172.17.0.2),当然与它的连接失败了(运行 VM 的 Windows 没有 ping这个ip)。

我尝试禁用防火墙并添加此堡垒转发:

172.17.0.2:9300 --> 172.17.0.2:9300

172.17.0.2:9300 --> 10.0.0.15:9300

(10.0.0.15 是虚拟机的ip) 但没有成功。

我知道问题出在端口转发上,但我该如何解决呢?

我查看了这个issue,但在这里我没有找到答案,我猜这是另一个问题。

【问题讨论】:

  • Mac 上的 boot2docker 也有这个问题。我想我在升级后开始得到这个。 Docker 版本是 1.6.2。

标签: java elasticsearch docker virtualbox


【解决方案1】:

问题在于 Elasticsearch 集群位于 Docker 创建的网络不同的网络上。

解决此问题的一种方法是在本地计算机上使用 SSH 隧道连接到该网络,然后从本地端口转发到远程 9300。

Here 是如何定义 SSH 隧道的示例,以及如何使用 JAVA 客户端 API 连接到 Elasticsearch 的示例代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2020-07-12
    • 2015-10-27
    • 2018-03-15
    相关资源
    最近更新 更多