我正在使用Logstash 1.4.1和Elasticsearch(安装为EC2集群)1.1.1和Elasticsearch AWS插件2.1.1。
如果Logstash正在与Elasticsearch正确交谈,我会使用 -
bin/logstash -e 'input { stdin { } } output { elasticsearch { host => <ES_cluster_IP> } }'
我得到了 -
log4j, [2014-06-10T18:30:17.622] WARN: org.elasticsearch.discovery: [logstash-ip-xxxxxxxx-20308-2010] waited for 30s and no initial state was set by the discovery
Exception in thread ">output" org.elasticsearch.discovery.MasterNotDiscoveredException: waited for [30s]
at org.elasticsearch.action.support.master.TransportMasterNodeOperationAction$3.onTimeout(org/elasticsearch/action/support/master/TransportMasterNodeOperationAction.java:180)
at org.elasticsearch.cluster.service.InternalClusterService$NotifyTimeout.run(org/elasticsearch/cluster/service/InternalClusterService.java:492)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java/util/concurrent/ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java/util/concurrent/ThreadPoolExecutor.java:615)
at java.lang.Thread.run(java/lang/Thread.java:744)
但是当我使用 -
时bin/logstash -e 'input { stdin { } } output { elasticsearch_http { host => <ES_cluster_IP> } }'
它可以正常使用以下警告 -
Using milestone 2 output plugin 'elasticsearch_http'. This plugin should be stable, but if you see strange behavior, please let us know! For more information on plugin milestones, see http://logstash.net/docs/1.4.1/plugin-milestones {:level=>:warn}
我不明白为什么即使版本兼容,我也不能使用elasticsearch
代替elasticsearch_http
。
答案 0 :(得分:1)
在Logstash elasticsearch plugin page提到:
VERSION NOTE: Your Elasticsearch cluster must be running Elasticsearch 1.1.1. If you use
any other version of Elasticsearch, you should set protocol => http in this plugin.
所以它不是版本不兼容。
Elasticsearch使用9300进行多播并与其他客户端通信。因此,您的logstsah可能无法与您的弹性搜索群集通信。请检查您的服务器配置防火墙是否具有阻止端口9300.
答案 1 :(得分:1)
我注意将protocol
选项设置为&#34; http&#34;,&#34; transport&#34;和&#34;节点&#34;。关于这一点的文档是矛盾的 - 一方面它声明它是可选的并且没有默认值,而最后它表示默认值根据代码集而不同:
'node'协议将正常连接到群集 Elasticsearch节点(但不会存储数据)。这允许你使用 多播发现之类的东西。如果您使用节点协议,那么 必须允许端口9300(或其中任何一个)进行双向通信 已配置的端口)。
'transport'协议将连接到您指定的主机并且将会 不会在Elasticsearch集群中显示为“节点”。这很有用 在你不能允许从中出站的连接的情况下 Elasticsearch集群到此Logstash服务器。
'http'协议将使用Elasticsearch REST / HTTP接口 和elasticsearch谈谈。
与Elasticsearch交谈时,所有协议都将使用批量请求。
java / jruby下的默认协议设置是“node”。默认 非java rubies上的协议是“http”
这里的问题是协议设置对你如何连接到Elasticsearch及其运作方式有一些非常重要的影响,但是当你没有设置协议时,它不清楚它会做什么。最好选择一个并设置它 -
http://logstash.net/docs/1.4.1/outputs/elasticsearch#protocol
答案 2 :(得分:0)
在elasticsearch.yml中获取协议:
output {
elasticsearch { host => localhost protocol => "http" port => "9200" }
stdout { codec => rubydebug }
}