Java客户端可以';找不到主节点:MasterNotDiscoveredException等待[1m]
我使用的是vagrant,我使用debian软件包在上面安装了ES: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
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