Flume架构整体上看就是 source -->channel --> sink 的三层架构,类似生成者和消费者的架构,他们之间通过queue(channel)传输,解耦。
-
Source:完成对日志数据的收集,分成 transtion 和 event 打入到channel之中
-
Channel:主要提供一个队列的功能,对source提供中的数据进行简单的缓存
-
Sink:取出Channel中的数据,进行相应的存储文件系统,数据库,或者提交到远程服务器
对现有程序改动最小的使用方式是使用是直接读取程序原来记录的日志文件,基本可以实现无缝接入,不需要对现有程序进行任何改动。
1、Exec source
可通过写Unix command的方式组织数据,最常用的就是tail -F [file]。
可以实现实时传输,但在flume不运行和脚本错误时,会丢数据,也不支持断点续传功能。因为没有记录上次文件读到的位置,从而没办法知道,下次再读时,从什么地方开始读。特别是在日志文件一直在增加的时候。flume的source挂了。等flume的source再次开启的这段时间内,增加的日志内容,就没办法被source读取到了。不过flume有一个execStream的扩展,可以自己写一个监控日志增加情况,把增加的日志,通过自己写的工具把增加的内容,传送给flume的node。再传送给sink的node。要是能在tail类的source中能支持,在node挂掉这段时间的内容,等下次node开启后在继续传送,那就更完美了。
2、Spooling Directory Source
SpoolSource:是监测配置的目录下新增的文件,并将文件中的数据读取出来,可实现准实时。需要注意两点:
A. 拷贝到spool目录下的文件不可以再打开编辑
B.spool目录下不可包含相应的子目录。在实际使用的过程中,可以结合log4j使用,使用log4j的时候,将log4j的文件分割机制设为1分钟一次,将文件拷贝到spool的监控目录。log4j有一个TimeRolling的插件,可以把log4j分割的文件到spool目录。基本实现了实时的监控。Flume在传完文件之后,将会修改文件的后缀,变为.COMPLETED(后缀也可以在配置文件中灵活指定)
ExecSource,SpoolSource对比:ExecSource可以实现对日志的实时收集,但是存在Flume不运行或者指令执行出错时,将无法收集到日志数据,无法何证日志数据的完整性。SpoolSource虽然无法实现实时的收集数据,但是可以使用以分钟的方式分割文件,趋近于实时。如果应用无法实现以分钟切割日志文件的话,可以两种收集方式结合使用。
其它修正后的Source可以参见:http://vinoyang.com/2015/06/07/日志系统之Flume日志收集
http://demo.aosustudio.com/B951CA08BA0247F416323E9D32A36EE3.AHtml
http://neoremind.com/2016/05/flumekafka收集docker容器内分布式日志应用实践/