2017-02-04 77 views
0

在Google Compute Engine上,我创建了3个虚拟机并在其上安装了Elasticsearch 5.1.2。 我安装了GCE Discovery Plugin进行单播发现。Elasticsearch 5.1.2中的NoNodeAvailableException [没有配置的节点可用]

从我的本地Web浏览器(Win7)中,我可以成功访问这些Elasticsearch节点。 在Google云端平台上,我添加了接受tcp:9300,tcp:9200的防火墙规则。

现在我想使用Java传输客户端与本地java应用程序中的远程Elasticsearch节点通信。 我敢肯定cluster.name是正确的。

是代码和错误如下:

public class NativeClient { 

    @SuppressWarnings({ "resource", "unchecked" }) 
    public static Client createTransportClient() throws UnknownHostException { 

     Settings settings = Settings.builder().put("cluster.name", "elasticsearch").put("client.transport.sniff", true) 
       .build(); 

     TransportClient client = new PreBuiltTransportClient(settings) 
       .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("104.100.100.96"), 9300)); 

     return client; 
    } 

    private final Node node = null; 
    private final Client client = null; 
} 


public class IndicesOperations { 
    private final Client client; 

    public IndicesOperations(Client client) { 
     this.client = client; 
    } 

    public boolean checkIndexExists(String name){ 
     IndicesExistsResponse response=client.admin().indices().prepareExists(name).execute().actionGet(); 
     return response.isExists(); 
    } 

    public static void main(String[] args) throws InterruptedException, UnknownHostException { 
     Client client =NativeClient.createTransportClient(); 
     IndicesOperations io=new IndicesOperations(client); 
     String myIndex = "test"; 
     if(io.checkIndexExists(myIndex)) 
      io.deleteIndex(myIndex); 
     io.createIndex(myIndex); 
     Thread.sleep(1000); 
     io.closeIndex(myIndex); 
     io.openIndex(myIndex); 
     io.deleteIndex(myIndex); 
    } 
} 


Exception in thread "main" NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{lu8DzekbSWOrNEgFgXxpgQ}{104.100.100.96}{104.100.100.96:9300}]] 
    at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:328) 
    at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:226) 
    at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59) 
    at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:345) 
    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:403) 
    at org.elasticsearch.client.support.AbstractClient$IndicesAdmin.execute(AbstractClient.java:1226) 
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:80) 
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:54) 
    at com.packtpub.IndicesOperations.checkIndexExists(IndicesOperations.java:16) 
    at com.packtpub.IndicesOperations.main(IndicesOperations.java:49) 

elasticsearch.yml

network.host: _gce_ 

cloud: 
    gce: 
     project_id: es-cloud 
     zone: asia-east1-b 
discovery: 
     type: gce 

编辑

部署在谷歌计算引擎,我的Java应用程序后,它可以访问在google计算引擎上运行的elasticsearch实例。在这个应用程序中,我只是修改了InetAddress.getByName("10.140.0.2")。在本地机器上部署时,我使用该VM的external ip

我还有什么要修改才能在本地机器上运行它?

回答

1

我附加我的虚拟机的external ipnetwork.publish_host财产elasticsearch.yml,那么我可以访问远程虚拟机上运行的elasticsearch:

network.host: _gce_ 
network.publish_host: 104.100.100.96 

cloud: 
    gce: 
     project_id: es-cloud 
     zone: asia-east1-b 
discovery: 
     type: gce 

我不完全理解,但好在它的工作原理。

相关问题