我正在使用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。
答案 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.html和http://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