当单个客户机节点出现故障时,Elasticsearch客户端无法获取结果

时间:2017-02-13 13:25:02

标签: elasticsearch

我们有一个非常标准的弹性搜索设置,包含3个主节点,6个数据节点和3个客户端节点。这是我们从Java应用程序连接到Elasticsearch客户端的连接代码。

    Settings settings = Settings.settingsBuilder()
            .put("cluster.name", configuration.getString("clusterName"))
            .put("client.transport.sniff", false)
            .put("client.transport.ping_timeout", "5s")
            .build();

    TransportClient client = TransportClient.builder().settings(settings).build();

    for (String hostname : (Collection<String>)configuration.get("hostnames")){
        try {
            client = client.addTransportAddresses(
                    new InetSocketTransportAddress(InetAddress.getByName(hostname), 9300)
            );
            break;
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }

我们目前在主机名列表中有三个不同的主机。但是,只要主机名列表中的单个客户端发生故障,此Elasticsearch传输客户端就会停止响应。我已经浏览了Elasticsearch网站上的传输客户端文档,并且还尝试查看他们的Github问题,根据每当节点发生故障时,只有elasticsearch应该从节点列表中删除它并继续使用其他节点,但在我们的情况下,事情只是分解。任何人都知道可能是什么问题? 我们现在正在使用elasticsearch 2.4.3。

1 个答案:

答案 0 :(得分:0)

在添加单个节点后,您似乎正在打破循环。尝试删除break语句:

for (String hostname : (Collection<String>)configuration.get("hostnames")){
        try {
            client = client.addTransportAddresses(
                    new InetSocketTransportAddress(InetAddress.getByName(hostname), 9300)
            );
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }