使用logstash从ElasticSearch,Kafka中不断提取任何新的ES更新

时间:2016-03-09 08:53:31

标签: elasticsearch logstash logstash-configuration

我有一个具有多个索引的ES群集,它们都以随机时间间隔接收更新。我有一个logstash实例从ES中提取数据并将其传递给Kafka。

每分钟运行一次并在ES中获取任何更新的好方法是什么?

CONF:

 input {
   elasticsearch {
     hosts => [ "hostname1.com:5432", "hostname2.com" ]
     index => "myindex-*"
     query => "*"
     size => 10000
     scroll => "5m"
   }
 }
 output {
   kafka {
     bootstrap-servers => "abc-kafka.com:1234"
     topic_id => "my.topic.test"
   }
 }

我想在查询中使用文档@timestamp并将其保存在临时文件中,然后重新运行查询(带有计划)并获取最新的更新/插入(类似于logstash的jdbc-input plugin支持)

有什么想法吗?

提前谢谢

1 个答案:

答案 0 :(得分:0)

几个月前有人问过same thing,但这个问题没有得到太多的流量。你也可以给它+1。

与此同时,您可以修改query输入中的elasticsearch,如下所示:

query => '{"query":{"range":{"timestamp":{"gt": "now-1m"}}}}'

即。您查询其timestamp字段(任意名称,与您匹配的更改)在过去一分钟内的所有文档

然后你需要设置一个每分钟启动logstash进程的cron。现在由于cron被触发的时刻,logstash开始运行的那一刻以及查询到达ES服务器端的那一刻之间的延迟,只知道1m可能不够,你可能会错过一些文档。您需要对此进行测试并找出最佳选择。

根据这个recent blog post,另一种方法可能是记录Logstash最后一次在环境变量LAST_RUN中运行并在查询中使用该变量:

query => '{"query":{"range":{"timestamp":{"gt": "${LAST_RUN}"}}}}'

在这种情况下,您创建一个由cron运行的shell脚本,基本上就是这样:

  1. 运行logstash -f your_config_file.conf
  2. 完成后,设置LAST_RUN=$(date +"%FT%T")