java - 无法使用 Java API 连接到在本地虚拟机上运行的 ElasticSearch Docker 集群

标签 java elasticsearch docker virtualbox

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

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

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

Host Guest

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),当然连接失败了(运行虚拟机到我的窗口没有 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 , 但我在这里找不到答案,猜测是另一个问题。

最佳答案

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

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

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

关于java - 无法使用 Java API 连接到在本地虚拟机上运行的 ElasticSearch Docker 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31057603/

相关文章:

elasticsearch - Elasticsearch位置数组的非法映射

python - docker 中的 django 迁移权限被拒绝

windows - docker 警告 : failed to get default registry endpoint from daemon

java - Dagger2 无法在注入(inject)类中注入(inject)字段

java - 用于 java 的 Linux 字符串命令

ruby - 将压缩的字节字符串从protobuf转换为通过Logstash格式化的字节

elasticsearch - Elasticsearch 2.3 Geo Shape类型映射

ruby-on-rails - Docker Rails 应用程序无法提供服务 - curl : (56) Recv failure: Connection reset by peer

java - Maven 无法从 https ://repo. maven.apache.org/maven2 下载依赖项/插件

java - QR 码扫描仪库支持 Marshmallow?