我有一个具有多个索引的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支持)
有什么想法吗?
提前谢谢
答案 0 :(得分:0)
与此同时,您可以修改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脚本,基本上就是这样:
logstash -f your_config_file.conf
LAST_RUN=$(date +"%FT%T")