对于很多公司来说,日志的收集和集中管理是一个必然要经历的阶段。我们公司在经历了一拖再拖之后,终于不得不开始搭建日志收集系统了。
对于日志收集系统,我们的首选就是Flume。为何这么坚决呢,难道没有其他工具能做个这个事情么?当然有!不过,考虑到Flume的简单易用,稳定性和高扩展性,它是我们的最佳选择。(期间调研过很多人对于Flume/Scribe等日志收集工具的对比分析,一个直观的感觉是:Flume更新,功能更强大,而且简单易用)
Flume系统的架构很灵活,可以根据自己的应用场景去灵活的适应。
我们的应用场景是这样子的:业务日志分布在不同的业务服务器上,需要统一收集起来,存储到HDFS上,以便于使用Spark进行数据分析。
我们的需求相对来说比较简单,而且日志量也并不太大。结合Flume官方文档给出的一个架构,我们设计了自己的Flume架构如下图:
每个业务服务器的Agent负责收集业务日志,然后发送到Collectors集群进行日志汇集,然后,Collectors集群将日志写到HDFS上。
这个架构在业界是一个比较常见,而且很成熟的架构。它的容灾性和扩展性比较好。
1)容灾性
每个Agent和Collector使用FileChannel来缓存数据,即使发生宕机或其他异常情况,缓存的数据都是可恢复的,不会丢数据;
2)扩展性
Collector可以进行横向扩展,以接收更大规模的日志;而且Collector集群后还可以再增加下一跳的日志接收方,比如使用Flume或者Kafka对日志进一步缓冲,以应对日志量非常庞大的情况
对于我们的需求,初期使用这个架构应该够用了,不过还需要在集群上进行压力测试以确保满足需求。
根据Flume的官方文档去进行部署和启动,是一个比较轻松的事情。
部署完成后,配置文件中参数的配置是一个让人花精力去尝试的问题。导致耗费精力的原因有以下几点:
1)官方文档对于每个配置项的解释和示例过于简单;
2)各种博客和帖子介绍的配置项并不是非常全面,很多帖子中介绍的配置不适合在线上生产环境中使用,因为缺少了一些重要配置项;
下面给出我们在HDFS sink过程使用的配置文件,供参考(如果使用HDFS sink,建议把下面配置中的所有参数都配置好,否则,可能会出现莫名现象):
# -----------the sources,the channels and the sinks.in this case called 'collectorAgent'---------
collectorAgent.sources=srcca
collectorAgent.channels=channelca
collectorAgent.sinks=skca
# -----------sources config-----------
collectorAgent.sources.srcca.type=avro
collectorAgent.sources.srcca.bind=0.0.0.0
collectorAgent.sources.srcca.port=55555
collectorAgent.sources.srcca.channels=channelca
# -----------channels config-----------
collectorAgent.channels.channelca.type=file
collectorAgent.channels.channelca.checkpointDir=/data/flume/collector/channels/checkpoint #collector的备份文件目录
collectorAgent.channels.channelca.useDualCheckpoints=true #是否对备份文件启用备份
collectorAgent.channels.channelca.backupCheckpointDir=/data/flume/collector/channels/checkpointBak #备份的文件目录
collectorAgent.channels.channelca.dataDirs=/data/flume/collector/channels/data
collectorAgent.channels.channelca.capacity=200000000
collectorAgent.channels.channelca.keep-alive=30
collectorAgent.channels.channelca.maxFileSize=2000000000
collectorAgent.channels.channelca.checkpointOnClose=true
collectorAgent.channels.channelca.transactionCapacity=10000
# -------hdfs sinks config-----------
collectorAgent.sinks.skca.type=hdfs
collectorAgent.sinks.skca.channel=channelca
collectorAgent.sinks.skca.hdfs.path=hdfs://***/***/***/flume/game/%Y-%m-%d
collectorAgent.sinks.skca.hdfs.filePrefix=test_%H
collectorAgent.sinks.skca.hdfs.fileSuffix=.log
collectorAgent.sinks.skca.hdfs.rollInterval=0
collectorAgent.sinks.skca.hdfs.rollSize=128000000
collectorAgent.sinks.skca.hdfs.rollCount=0
collectorAgent.sinks.skca.hdfs.minBlockReplicas=1
collectorAgent.sinks.skca.hdfs.idleTimeout=3600
collectorAgent.sinks.skca.hdfs.fileType=DataStream
collectorAgent.sinks.skca.hdfs.writeFormat=Text
collectorAgent.sinks.skca.hdfs.batchSize=1500
collectorAgent.sinks.skca.hdfs.maxOpenfiles=5000
collectorAgent.sinks.skca.hdfs.callTimeout=500
collectorAgent.sinks.skca.hdfs.threadsPoolSize=2000
collectorAgent.sinks.skca.hdfs.useLocalTimeStamp=true
总结
1)Flume Agent的稳定性比较高;
2)配置文件中的细节很重要,配置不对,往往产生莫名其妙的问题,如果遇到莫名问题,极有可能是配置有问题,请耐心阅读文档和尝试;
3)配置文件中的参数配置对系统性能影响比较大,请耐心尝试,找到最优参数组合;
3)FileChannel的容灾很好,不过它会严重限制Sink的速度,根据我们的测试,使用Memory Channel的性能大约是FileChannel的4~10倍;FileChannel性能的吞吐上限大概是2M/s(使用SSD硬盘来存储FileChannel的checkpoint)。