我正在使用 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
}
我的 vagrant 文件为 Elasticsearch 打开了 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。
最佳答案
通常你必须通过http从外部连接到ES(通常,但也有其他协议(protocol)可用),然后再谈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
关于Java 客户端找不到主节点 : MasterNotDiscoveredException waited for [1m],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24253224/