Logstash中途停止后是否从未处理行继续?CSV数据导入疑问
Logstash CSV导入中断后重启的行为及索引影响
咱们先聊聊重启后会不会继续处理未完成的行:
- 答案是会的,核心原因在于你配置里的
sincedb_path。Logstash的file输入插件会通过sincedb文件记录每个CSV文件已经读取到的字节位置。当你中途突然停止Logstash,下次启动时,它会自动读取对应的sincedb记录,直接从上次中断的位置继续读取文件,不会重复导入已经处理完的5万条数据,而是从第5万条之后的未处理行开始。 - 不过要注意:如果手动删除了sincedb文件,或者修改了
sincedb_path指向不存在的文件,那Logstash会重新从头读取所有CSV文件,这时候就会重复导入之前已经处理过的数据了。
再说说对索引的影响:
- 如果你的Logstash输出配置是指向Elasticsearch(这是ELK栈的常规配置),那已经成功导入的5万条数据已经稳定存在目标索引里了。重启后继续导入的新数据会追加到同一个索引中,不会覆盖或损坏之前的已有数据。
- 有个小细节要注意:如果中断发生在Logstash已经读取了部分行,但还没完成filter处理或者还没成功写入Elasticsearch的阶段,那这部分数据在重启后会被重新读取并尝试写入。这种情况下,可能会出现少量的重复数据在索引里。如果想要避免这种重复,可以在Elasticsearch的索引配置里设置唯一ID,或者在Logstash里通过
fingerprint插件生成唯一标识来实现幂等写入。
补充:你当前的
file输入配置里,start_position => "beginning"只在第一次读取文件时生效,后续重启都会优先参考sincedb的记录,所以不用担心这个参数会导致重复读取。
内容的提问来源于stack exchange,提问作者Karthik Saravanan
相关产品推荐
相关产品推荐

