logstash 在哪里保存状态?

Where does logstash persist state?

我想利用 logstash 和 Csv filter plugin 监视目录中的新文件并将它们处理到 Elasticsearch 中。这很容易通过类似这样的配置实现:

input {
    file {
        path => "/csv/*.csv"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}

filter {
    csv {
        separator => ","
    }
}

output {
    elasticsearch {
        hosts => "${ELASTICSEARCH_URL}"
        index => "myData"
        document_type => "auto"
    }
}

我主要关心的是弹性完整性

弹性 - 我看了 João Duarte 的演讲,他在一年多前解释了这方面的挑战。他解释说,logstash(当时)将所有状态保存在内存中,并且无法恢复故障。这仍然是真的吗?他暗示可能将状态存储在一个文件中,这个文件现在存在吗?如果 logstash 在读取 Csv 文件的过程中崩溃,我需要它在重新启动时从中断处继续。这可能吗?

完整性 - 经过大量谷歌搜索后,似乎 Logstash is still incapable of deleting (or renaming) the Csv file after it's read。我的数据可能不是幂等的,我不能容忍读取同一个 Csv 两次。然而,logstash 似乎不会继续尝试一遍又一遍地读取同一个文件,因此那里有一些机制可以防止读取同一个文件(至少立即)。在读取 Csv 文件(删除、重命名、移动)后,此时建议 "do something" 使用什么策略,如果这不可能,那么清理 csv 文件的最佳做法是什么,因为它们可以'不要永远流连忘返。

Persistent Queues 自 5.2 以来一直在代码中,到 5.6 时它们被认为是生产质量。这会将管道中的事件保存到本地文件,该文件将在重新启动时读取。

至于不重新读取文件,多年来这一直是 Logstash 的核心部分。这种机制称为 sincedb,您指定的文件插件具有用于配置它的 sincedb 参数。 sincedb_path 指定将使用的 sincedb_file 本身,sincedb_write_interval 指定它使用文件偏移量更新数据库的频率。

对于清理你的文件,Logstash 绝对没有提供机制,并有意将其留给操作员。为此有多种机制,其中只有一种是 cron 作业,它每小时运行一次如下所示的内容:

find /var/log/csv-archive/ -atime 0.083 -type f |xargs rm

用于删除一小时内未访问的所有文件。还有其他方法。