前言
Apache Flume 是一个分布式、高可靠、高可用的用来收集、聚合、转移不同来源的大量日志数据到中央数据仓库的工具。Flume具有强大的功能和精简配置化实现功能的使用方式。
中文文档地址
Git地址
Event
Event是Flume定义的一个数据流传输的最小单元。
Agent
Agent就是一个Flume的实例,本质是一个JVM进程,该JVM进程控制Event数据流从外部日志生产者那里传输到目的地(或者是下一个Agent)。
Source
Source消耗由外部传递给它的Event。外部以Flume Source识别的格式向Flume发送Event。例如,Avro Flume Source可接收从Avro客户端(或其他FlumeSink)接收Avro Event。用Thrift Flume Source也可以实现类似的流程,接收的Event数据可以是任何语言编写的只要符合Thrift协议即可。
Channel
Channel是一个数据的缓冲池,可以认为是一个消息队列。当Source接收Event时,它将其存储到一个或多个channel。该channel是一个被动存储器,可以保持Event直到它被Sink消耗。channel也提供了多种实现方式,例如内存,文件,Kafka以及JDBC等。
Sink
Sink从channel中移除Event并将其放入外部存储库(如HDFS,通过 Flume的 HDFS Sink 实现)或将其转发到流中下一个Flume Agent的Flume Source。
简例
使用Flume实现日志append监控,并输出到控制台
# 配置Agent a1各个组件的名称
a1.sources = source1
a1.sinks = sink1
a1.channels = channel1
# source1
a1.sources.source1.type = TAILDIR
a1.sources.source1.filegroups = f1
a1.sources.source1.filegroups.f1 = D:/flume/access.log
# sink1
a1.sinks.sink1.type = logger
# channel1
a1.channels.channel1.type = memory
a1.channels.channel1.capacity = 1000
a1.channels.channel1.transactionCapacity = 100
# 把source和sink绑定到channel上
a1.sources.source1.channels = channel1
a1.sinks.sink1.channel = channel1
思考
TailDir数据源基于Liunx kernel的tail -f指令实现,目前暂不支持windows平台。另外如果考虑使用TailDir为埋点方案需要在负载均衡服务器上部署服务,显然会占用负载的资源。
现阶段大多数企业日志系统都是基于ELK实现:
- Logstash:日志收集工具,可以从本地磁盘,网络服务,消息队列中收集各种各样的日志,然后进行过滤分析,并将日志输出到Elasticsearch中。
- Elasticsearch:日志分布式存储/搜索工具,原生支持集群功能,可以将指定时间的日志生成一个索引,加快日志查询和访问。
- Kibana:可视化日志Web展示工具,对Elasticsearch中存储的日志进行展示,还可以生成炫丽的仪表盘。
如果采用上图架构会因为企业日志过于庞大,有效日志只占一小部分导致机器资源的浪费。