elasticsearch,vagrant,Java,Scala,elasticsearch,Vagrant" /> elasticsearch,vagrant,Java,Scala,elasticsearch,Vagrant" />

Java客户端可以';找不到主节点:MasterNotDiscoveredException等待[1m]

Java客户端可以';找不到主节点:MasterNotDiscoveredException等待[1m],java,scala,elasticsearch,vagrant,Java,Scala,elasticsearch,Vagrant,我使用的是vagrant,我使用debian软件包在上面安装了ES: elasticsearch-1.1.1.deb 在我的web应用程序中,我正在使用jar: org.elasticsearch elasticsearch 1.1.1 我正在创建我的客户,如: val node = nodeBuilder.client(true).node val client: Client = node.client 当我尝试索引时,我得到错误: val response = client.pre

我使用的是vagrant,我使用debian软件包在上面安装了ES:

elasticsearch-1.1.1.deb
在我的web应用程序中,我正在使用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
{
  "error" : "ClusterBlockException[blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];[SERVICE_UNAVAILABLE/2/no master];]",
  "status" : 503
}
我得到的错误是:

[MasterNotDiscoveredException: waited for [1m]]
我可以通过以下步骤看到我的ES实例工作正常:

http://localhost:9200
我从自述文件中运行了一些测试查询,它们运行良好,但由于某些原因,现在也无法运行:

http://localhost:9200/twitter/user/kimchy?pretty=true
我得到一个错误:

val response = client.prepareIndex("articles", "article", article.id.toString).setSource(json).execute.actionGet
{
  "error" : "ClusterBlockException[blocked by: [SERVICE_UNAVAILABLE/1/state not recovered / initialized];[SERVICE_UNAVAILABLE/2/no master];]",
  "status" : 503
}
My vagrant file 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,然后谈论REST/JSON。因此,您的Web应用程序应该使用scala/java ES客户端(请参阅),然后通过http连接到您的主机,该主机在端口9200上运行ES。端口9300仅用于节点间通信(ES是分布式集群系统)。但是还有另一种与ES远程通信的方法:为加入集群的节点通电,然后通过内部客户端查询该节点。但是:

在上面的问题中,您尝试通过内部Java客户端(内部传输)连接到ES,该客户端启动一个节点,然后尝试加入集群。该操作失败,因为无法找到主节点。可能是因为网络问题。尝试将elasticsearch.yml包含在类路径中,或者像上面描述的那样使用REST。还有第三种选择:TransportClient-look


另请参见和

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

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

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

在启动es后立即查询时,能否显示响应是什么http://localhost:9200/_nodes? 特别是,如果你有

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

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

取消注释
discovery.zen.ping.multicast.enabled:false
/etc/elasticsearch/elasticsearch.yml
我没有使用传输客户端,我正在使用节点客户端。传输客户端有
InetSocketTransportAddress
等,我没有。我的代码来自您提供的链接中的节点客户端示例:更正(检查我的配置)两组
elasticsearch.yml
都需要
network.host:127.0.0.1