Конфигурация обнаружения сервера Elasticsearch

я установил сервер ElasticSearch, который я запускаю:

$ ./elasticsearch -f
 {0.18.2}[11698]: initializing ...
 loaded [], sites []
 {0.18.2}[11698]: initialized
 {0.18.2}[11698]: starting ...
 bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/192.168.1.106:9300]}
 new_master [Stingray][ocw4qPdmSfWuD9pUxHoN1Q][inet[/192.168.1.106:9300]], reason: zen-disco-join (elected_as_master)
 elasticsearch/ocw4qPdmSfWuD9pUxHoN1Q
 recovered [0] indices into cluster_state
 bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/192.168.1.106:9200]}
 {0.18.2}[11698]: started

как я могу настроить клиент Java для подключения к этому серверу? Я только что:

node.client=true

но, после попытки подключения я получаю:

org.elasticsearch.discovery.MasterNotDiscoveredException: 
    at org.elasticsearch.action.support.master.TransportMasterNodeOperationAction.onTimeout(TransportMasterNodeOperationAction.java:162)

если я настраиваю клиент java как:

node.data=false

я получаю следующие журналы:

INFO main node:internalInfo:93 - [Stark, Tony] {0.18.2}[13008]: starting ...
INFO main transport:internalInfo:93 - [Stark, Tony] bound_address {inet[/0:0:0:0:0:0:0:0:9301]}, publish_address {inet[/192.168.1.106:9301]}
INFO elasticsearch[Stark, Tony]clusterService#updateTask-pool-13-thread-1 service:internalInfo:93 - [Stark, Tony] new_master [Stark, Tony][WkNn96hgTkWXRnsR0EOZjA][inet[/192.168.1.106:9301]]{data=false}, reason: zen-disco-join (elected_as_master)

как я понял, это означает, что этот новый узел (предположительно клиентский узел) сделал себя новым главным узлом. и я не из журнала, что он найден и подключается к любому другому узлу.

сервер и клиент запущены на одной машине. 192.168.1.106:9200 доступны из браузера.

и я не могу найти хорошую документацию о конфигурации обнаружения. Где я могу узнать больше о конфигурациях ElasticSearch? И как настроить Java-клиент?

6 ответов


столкнулся с той же проблемой, когда узлы не смогли выбрать мастер на перезапуске узлов.

проблема заключается в связи узлов между собой.

пожалуйста, убедитесь в своих журналах эластичного поиска, говорит ли перезапуск узла

  publish_address {127.0.0.1:9200}
  or
  publish_address {0.0.0.1:9200}

это означает, что текущий узел не публикует свой IP-адрес другим узлам, и, следовательно, узлы не распознают этот узел, даже если IP-адрес узла может присутствовать в открытие.дзен.свистеть.одноадресный.хозяева

решение Внесите следующие изменения в elasticsearch.в формате YML. Добавить

 network.host: _non_loopback:ipv4_
 and restart the node.
 Ensure that the bound address now shows the <IP address>:<port no> and not the localhost.

Это означает, что теперь ваш узел доступен. Второй шаг, чтобы сделать его обнаруживаемым в кластере, - это добавить ip-адрес узла в списки одноадресных хостов всех главных узлов, чтобы каждый раз, когда у нас есть новый мастер, узел обнаруживался новому мастеру.

   Add the node IP to the discovery.zen.ping.unicast.hosts 
   list of hosts of all the masters to make it disoverable. A masterpings all the 
   nodes present in the unicast list.

наиболее вероятной причиной этого сбоя является брандмауэр на вашем компьютере, который блокирует многоадресный трафик обнаружения на порту 54328. И клиент и мастер передают на этом порту во время первоначального обнаружения, и они не слышат друг от друга. Вот почему, когда вы указываете node.клиент=истинный клиентский узел (который не может быть мастером) терпит неудачу с MasterNotDiscoveredException и узел без данных выбирает себя в качестве мастера.


я столкнулся с той же проблемой и, используя IP-номера в файле конфигурации, решил ее для меня.

in/config / elasticsearch.в формате YML

раскомментировать и изменить сеть.установка хоста в:

network.host: 127.0.0.1

вы также можете изменить это на свой IP-номер машины в ifconfig.


У меня была та же проблема. В конце концов, оказалось, что у меня была проблема с брандмауэром, с моим брандмауэром (на Ubuntu), блокирующим порты ElasticSearch. Я использую брандмауэр по умолчанию на Ubuntu,ufw.

Итак, чтобы открыть порты, я запускаю эти команды в терминале:

sudo ufw allow proto tcp to any port 9200:9400
sudo ufw allow proto tcp to any port 54328

мой кластер работает локально на 9200, и все мои клиенты на 9300+. Итак, я только что открыл для них диапазон 9200-9400. 54328 предназначен для многоадресной трансляции.

просто чтобы быть полным: я также использовал TransportClient, который работает, но я добавил жестко закодированный localhost к адресу, на котором будет работать TransportClient. Не очень хорошо для производственного кода: -)


что-то вроде этого должно работать:

        Settings s = ImmutableSettings.settingsBuilder()
                .put(this.settings)
                .build();
        TransportClient client = new TransportClient(s);
        client.addTransportAddress(new InetSocketTransportAddress(
                "localhost",
                9300)
        );

что меня запутало, так это то, что я изначально пытался подключить клиента к 9200, а не 9300. Руководство по настройкам выше можно найти изhttp://www.elasticsearch.org/guide/reference/java-api/client.html


настройка сетевого хоста на localhost:

сеть.хост: 127.0.0.1