Elasticearch 5 Java-клиент, предоставляющий "NoNodeAvailableException"

Я использую Elasticsearch 5.2 и Spring Boot 1.5.1. Я подключаюсь к нему через клиент Java в приложении Spring. Когда я подключаюсь к нему на порту 9300 или 9200, и я получаю NoNodeAvailableException: None of the configured nodes are available. В моем Java-клиенте я установил свойство client.transport.sniff как true. При отправке запроса через cURL на порт 9200 он работает правильно. У меня есть 4 узла в одном кластере, и я не могу подключиться ни к одному из них. Мой конфигурационный файл имеет все значения по умолчанию в разделе network, кроме network.host, в котором значение eth0 inet addr.

Я использую Gradle. Мои зависимости:

compile('org.springframework.boot:spring-boot-starter-web')
compile('org.elasticsearch:elasticsearch:5.2.0')
compile('org.elasticsearch.client:transport:5.2.0')
compile('org.apache.logging.log4j:log4j-api:2.7')
compile('org.apache.logging.log4j:log4j-core:2.7')

Мой код для подключения к кластеру Elasticsearch:

@Bean
public TransportClient elasticClient() {
    org.elasticsearch.common.settings.Settings settings = Settings.builder()
        .put("client.transport.sniff", true)
        .put("cluster.name", "TestCluster")
            .build();
    TransportClient client = null;
    try {
        client = new org.elasticsearch.transport.client.PreBuiltTransportClient(settings)
            .addTransportAddress(new org.elasticsearch.common.transport.InetSocketTransportAddress(
                InetAddress.getByName("54.175.155.56"), 9200));
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
    return client;
}

Мои ES-журналы при запуске ES:

[2017-02-15T10:37:40,664][INFO ][o.e.t.TransportService   ] [ip-10-0-29-2] publish_address {10.0.29.2:9300}, bound_addresses {10.0.29.2:9300}
[2017-02-15T10:37:40,669][INFO ][o.e.b.BootstrapChecks    ] [ip-10-0-29-2] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
[2017-02-15T10:37:43,856][INFO ][o.e.c.s.ClusterService   ] [ip-10-0-29-2] detected_master {kafka-stage}{sTIeF8gGTNam0oNW8dkbbA}{TTX6FIRtRp-gDemYY-22Sg}{10.0.20.71}{10.0.20.71:9300}, added {{kafka-stage-2}{jl3oLGgMQ1yxhdMMy65k_g}{ibV8BApjRByUOpDDncddyQ}{10.0.51.31}{10.0.51.31:9300},{ip-10-0-40-144}{t-_THs3wQbC_k9eivDo5eQ}{v-UYoYgXQ265QkdYhtiPYA}{10.0.40.144}{10.0.40.144:9300},{kafka-stage}{sTIeF8gGTNam0oNW8dkbbA}{TTX6FIRtRp-gDemYY-22Sg}{10.0.20.71}{10.0.20.71:9300},}, reason: zen-disco-receive(from master [master {kafka-stage}{sTIeF8gGTNam0oNW8dkbbA}{TTX6FIRtRp-gDemYY-22Sg}{10.0.20.71}{10.0.20.71:9300} committed version [98]])
[2017-02-15T10:37:44,009][INFO ][o.e.h.HttpServer         ] [ip-10-0-29-2] publish_address {10.0.29.2:9200}, bound_addresses {10.0.29.2:9200}
[2017-02-15T10:37:44,009][INFO ][o.e.n.Node               ] [ip-10-0-29-2] started

Ответы на эти вопросы не решают мою проблему:

Ответ 1

node, к которому я подключался, был только мастером node. Он имел node.ingest и node.data как false. При подключении к node, который имел node.ingest как true и удалив параметр client.transport.sniff на Java-клиенте, мне удалось подключиться к кластеру ES.

Ответ 2

В конфигурационном файле elasticsearch.yml вам необходимо убедиться в том, что он привязан к правильному хосту и имеет следующий параметр:

network.host: 54.175.155.56

Также в вашем Java-коде, поскольку вы используете транспортный клиент, вам нужно использовать порт 9300 (для связи по протоколу TCP), а не 9200, который предназначен для связи по протоколу HTTP (например, через curl).

    client = new org.elasticsearch.transport.client.PreBuiltTransportClient(settings)
        .addTransportAddress(new org.elasticsearch.common.transport.InetSocketTransportAddress(
            InetAddress.getByName("54.175.155.56"), 9300));
                                                     ^
                                                     |
                                                change this

Ответ 3

Наверное, ответ на этот вопрос: clustername может отличаться от elasticsearch.yml, настроить его, и в elasticsearch он использует два порта: они 9200, которые обеспечивают доступ через http и 9300 используется для доступа к Elasticsearch по внутреннему транспортному протоколу, который используется Транспортным клиентом Java.