Logstash之sincedb问题记录

作为ELK中重要的一个组成部分,logstash既可以作为indexer解析日志,又可以作为shipper采集日志。但是由于logstash是java应用,占用资源较大,启动慢,所以有了filebeat来代替logstash作为日志采集代理。filebeat使用golang编写,跨平台支持还不够,比如在AIX环境下不能运行。因此研究了logstash在AIX上的运行,使用jdk1.7 32bit的情况下,logstahs可以在AIX下正常运行,但是运行了一段时间后发现了问题:

系统每天产生日志较多(>2000个),每天mv到归档目录并再次产生新的文件,运行一段时间后,发现解析端的logstash经常收到不完整的日志,跟踪后发现采集端的logstash的sincedb已经非常大,查阅文档后发现其没有删除的设定!而且logstash的sincedb文件只记录inode,没有文件路径(filebeat记录了inode和路径,并且会有clean机制,将inode重用的风险降到最低)

在文件数较少的情况下这个错误几乎可以忽略,但是在文件数较多,inode重用的概率比较大,文件很可能会有采集不到,采集不全的情况。

只能放弃了在服务器上使用logstash采集的策略,使用NFS将日志目录挂载到Linux系统中,再使用filebeat读取这里的日志。

ELK官方不推荐filebeat读取网络扇区(network volumn),也是出于各种问题的考虑。但是这个选择是无奈之举,需要进行以下设置,保证在网络不稳定的情况下不出问题:

nfs延迟问题

mount时加上noac,不缓存,实现“准实时”的读取。

filebeat扫描间隔问题

设置scan_frequency为5s,默认为10s。设置间隔太小会导致cpu占用较高。

close_inactive设置为20m,默认为5m,官方推荐增大此设置,而不是改小scan_frequency

filebeat.idle_timeout设置为2s,默认为5s,这是filebeat在积攒到足够数量提交前的空闲时间,默认是2048个事件提交一次,或者5s提交一次,两个条件先到者生效

clean_removed: false 因nfs存在网络连接超时等问题,若设为true,重连后会重收整个文件。

ignore_older: 24h 该选项保证旧文件不被重收。

clean_inactive: 28h 该选项保证registry文件清理正常,注意必须大于ignore_older,如果小了会导致文件重收。


你可能感兴趣的:(ELK)