8

我已经安装了 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$3.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客户端?

4

6 回答 6

13

此故障最可能的原因是您计算机上的防火墙阻止了端口 54328 上的多播发现流量。客户端和主服务器在初始发现期间都在此端口上进行广播,并且他们没有收到对方的回复。这就是为什么当您指定 node.client=true 时,客户端节点(不能是主节点)会因 MasterNotDiscoveredException 而失败,并且没有数据的节点会选择自己作为主节点。

于 2011-11-11T03:49:14.313 回答
9

我遇到了同样的问题,并通过在配置文件中使用 IP 号码为我解决了这个问题。

在 /config/elasticsearch.yml

取消注释并将 network.host 设置更改为:

network.host: 127.0.0.1

您也可以在 ifconfig 中将其更改为您的机器 IP 号。

于 2011-12-14T21:22:32.623 回答
5

我遇到过同样的问题。最终,我发现我遇到了防火墙问题,我的防火墙(在 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,它可以工作,但是我将我的本地主机硬编码到了 TransportClient 将处理的地址中。对于生产代码来说不是一件好事:-)

于 2012-07-23T15:13:03.820 回答
2

面临相同的问题,即节点无法在节点重新启动时选择主节点。

问题在于节点之间的通信。

请确保在您的弹性搜索日志中,节点重启是否显示

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

这意味着当前节点没有将其 IP 地址发布给其他节点,因此即使节点 IP 可能存在于discovery.zen.ping.unicast.hosts中,节点也不会识别该节点

解决方案 在 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.
于 2016-04-29T09:04:43.500 回答
1

像这样的东西应该工作:

        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找到上述设置的指导

于 2011-11-09T20:27:26.493 回答
1

将网络主机配置为 localhost:

网络主机:127.0.0.1

于 2015-06-22T14:47:52.440 回答