Java客户端无法找到主节点:MasterNotDiscoveredException等待[1m]

时间:2014-06-16 22:33:05

标签: java scala elasticsearch vagrant

我正在使用vagrant,我使用debian软件包在其上安装了ES:

elasticsearch-1.1.1.deb

在我的网络应用中,我正在使用jar:

org.elasticsearch elasticsearch 1.1.1

我正在创建我的客户端:

val node = nodeBuilder.client(true).node
val client: Client = node.client 

当我尝试索引时,我收到错误:

val response = client.prepareIndex("articles", "article", article.id.toString).setSource(json).execute.actionGet

我得到的错误是:

[MasterNotDiscoveredException: waited for [1m]]

我可以通过以下方式看到我的ES实例工作正常:

http://localhost:9200

我从README文件中运行了一些测试查询,但它们工作正常,但由于某种原因它现在也无法正常工作:

http://localhost:9200/twitter/user/kimchy?pretty=true

我收到错误:

{
  "error" : "ClusterBlockException[blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];[SERVICE_UNAVAILABLE/2/no master];]",
  "status" : 503
}

我的流浪文件2个端口打开以进行弹性搜索:

  config.vm.network "forwarded_port", guest: 9200, host: 9200 # ES
  config.vm.network "forwarded_port", guest: 9300, host: 9300 # ES

似乎有什么问题?

注意:我的Web应用程序没有使用elasticsearch.yml文件,因为它只是根据我的理解连接到默认的localhost:9200。

3 个答案:

答案 0 :(得分:1)

通常你必须通过http从外部连接到ES(通常,但也有其他协议可用),然后谈谈REST / JSON。因此,您的webapp应该使用scala / java ES客户端(请参阅http://www.elasticsearch.org/guide/en/elasticsearch/client/community/current/clients.html),然后通过http连接到在端口9200上运行ES的主机。端口9300仅用于节点间通信(ES是分布式集群系统) 。但是还有另一种远程与ES通信的方式:启动加入集群的节点,然后通过内部客户端查询该节点。但是:

在上面的问题中,您尝试通过内部Java客户端(内部传输)连接到ES,该客户端启动节点然后尝试加入群集。这失败是因为可以找到主节点。可能是由于网络问题。尝试在类路径中包含elasticsearch.yml或使用如上所述的REST。还有第三种选择:TransportClient - 看http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/client.html#transport-client

另请参阅http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-transport.htmlhttp://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-http.html以及http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-memcached.html

答案 1 :(得分:1)

由于您使用.client(true)生成客户端节点,如果我正确理解the docs,则会禁用节点上的数据存储和主资格。 (来源也不是很有帮助)

请注意,任何ES群集至少需要1个主节点。

首先,为了澄清配置情况,您的主要elasticsearch.yml(请参阅reference config)配置位于/etc/elasticsearch/下。您还可以在elasticsearch.yml文件夹中配置第二个src/main/resources,该文件夹将应用于您在应用中创建的节点。我建议这样做,因为与使用神秘的nodeBuilder方法相比,它更清晰。

在启动es http://localhost:9200/_nodes之后,您能在查询时显示响应吗? 具体来说,如果你有

"attributes": {
    "master": "true"
},

在其中一个节点上设置。如果是这样,那么它看起来像网络问题,因为您的客户端节点无法联系主节点。我在设置时遇到了类似的问题,解决方法是在应用的network.host: 127.0.0.1中设置elasticsearch.yml(希望我知道原因)

答案 2 :(得分:1)

discovery.zen.ping.multicast.enabled: false

中取消注释/etc/elasticsearch/elasticsearch.yml
相关问题