簡體   English   中英

無法使用 Java API 連接到在本地虛擬機上運行的 ElasticSearch Docker 集群

[英]Can't connect to ElasticSearch Docker cluster which run on local virtual machine using Java API

我使用 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 將 http 請求發送到地址 127.0.0.1:9200 和 127.0.0.1:9300 時,我得到了沒有問題的響應。

當我嘗試使用 Java Client 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),當然連接失敗了(我的 Windows 沒有 ping 將 VM 運行到此 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)但沒有成功。

我知道問題出在端口轉發上,但是我該如何解決呢?

我查看了這個問題,但我沒有在這里找到答案,然后猜測是另一個問題。

問題是 Elasticsearch 集群位於一個不同的網絡上,這是 Docker 創建的網絡。

解決它的一種方法是在本地機器上使用 SSH 隧道連接到該網絡,然后從本地端口轉發到遠程 9300。

下面是一個關於如何定義 SSH 隧道的示例和一個關於如何使用 JAVA 客戶端 API 連接到 Elasticsearch 的示例代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM