基于Apache Flume的分布式日志收集系统设计开发实
0引言
对于网站而言,通过采集系统日志,分析系统的运行和安全状况以及客户的访问行为至关重要[1]。传统的日志采集模式都是直接将信息记录在本地服务器,然后通过Linux命令行或其它日志分析工具对其进行分析[2,3]。然而,随着信息规模的扩大,一个网站系统可能会包含多个组件,并部署到多个不同的服务器上。采用传统的方式对其日志分别进行维护和分析会带来一些麻烦和问题。另一方面,随着虚拟化技术和云计算技术的应用,任何一个节点都可以动态地根据一定的策略分布或迁移,传统的本地日志收集模式势必不能适应虚拟环境的需要。
本文基于开源日志收集系统Apache Flume,设计并实现了一个分布式环境下的日志集中收集系统。该系统可以实现异构网站之间的日志集中收集,从而为下一步的日志分析与统一监控提供数据支持。
1Apache Flume
Apache Flume是Cloudera开源的分布式日志,其内置了非常齐全的各种组件,减少了用户使用的复杂度。Flume架构具有简单、可靠、灵活的特点,并且为HDFS提供了直接的支持,可以比较方便地实现与HBase的集成[4]。
本文采用Apache Flume NG系统进行分布式日志的收集。NG是New Generation的缩写,与Apache Flume 0.9x版本存在区分。Flume NG对传统的Apache Flume进行了精简,去掉了Master和Collector两种角色,只保留了Agent一种角色。
数据流(Data Flow)描述了日志数据从产生、传输、处理到最终写入目的地的路径,它是Flume中最主要的抽象模型。 Flume的数据流模型如图1所示。
图1Flume数据流模型
Flume Ng的数据流程分为3个阶段:
(1)Flume的Source接收由外部源(如Web Server)发送过来的事件。其中事件需要以Source能够识别的格式发送,如Avro Flume Source只能接收Avro客户端或其它Agent中的Avro Sink发送的Avro事件。
(2)Flume Source接收到一个事件后,它会将事件存储到一个或多个Channel,Channel会保存这些数据直到Sink处理完这些数据。
(3)Sink会取出并删除Channel中的事件,并将其发送到HDFS等存储系统进行存储,或者继续发送到下一个Agent的Source进行进一步处理,如汇聚等。
2日志收集数据流程定义
为了有效收集日志,系统实施时需要在每个需要收集日志的服务器上安装相同版本的Flume NG。由于不同类型的网站选用的Web Server不同,为了对数据进行有效的收集,需要为每类Web Server设定一个或多个Agent,对收集的不同数据进行不同的处理,本文采用如图2所示的日志收集流程。
图2基于Flume的日志数据收集流程
Flume中数据收集的流向以及各个组件的处理方式均通过配置Agent来实现。Flume中Agent配置文件采用了Java属性文件的格式,各个属性采用层次化的方式进行设置。
3Agent配置
Tomcat服务器日志采集方式如下:假定tomcat安装在/opt/tomcat目录,日志存放在var/log/data,日志聚合Agent的IP地址为192.168.0.10, Avro客户端访问端口为4545。定义ties如下:
# A single-node Flume configuration
# Name the components on this agent
s = source1
= sink1
ls = channel1
# Describe/configure source1
= exec
d =
tail -n +0 -F
/
ls =
channel1
# Describe sink1
= avro
me = 192.168.0.10
= 4545
# Use a channel which buffers events in memory
= file
ointDir=/var/checkpoint
rs=/var/tmp
ty = 1000
ctionCapactiy = 100
# Bind the source and sink to the channel
ls = channel1
l = channel1
其它Ngnix服务器、Apache服务器的日志收集Agent与此类似,这里不再赘述。对于IIS服务器,由于其运行在Windows平台上,可以通过安装Flume的Windows版本实现。
日志聚合Agent负责收集通过Avro Sink发送过来的事件,并将其写入到HBase数据库中,具体配置代码如下:
#source定义
s = avroIn
= avro
= 0.0.0.0
= 4545
ls = mc1
#Channel定义
ls = mc1
= memory
ty = 100
#HBase Sink定义
= sink1
#使用AsyncHBaseSink
= BaseSink
= transactions
Family = clients
= charges
ize = 5000
#使用自定义的SplittingAsyncHbaseEventSerializer类
izer =
ingAsyncHbaseEventSerializer
entColumn = icol
l = mc1
4结语
本文针对异构网站间的日志集中存放需求,首先提出了一种基于Apache Flume的分布式日志收集系统设计方案,然后对日志收集的数据流程进行了设计,最后以Tomcat服务器下的日志收集为例,对其Agent配置进行了分析。该系统通过将多个网站的日志集中存储,为进行下一步的日志分析提供了数据支
持,也为云平台下的网站日志收集方案提供了参考依据。
参考文献:
\[1\]詹玲,马骏.分布式I/O日志收集系统的设计与实现[J].计算机工程与应用, 2010,46(36):8890.
[2]孙寅林. 基于分布式计算平台的海量日志分析系统的设计与实现[D].西安: 西安电子科技大学,2012.
[3]宋爱青. 基于Hadoop的日志分析系统的设计与实现[D].北京:中国地质大学,2012.