美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流。美团的日志收集系统基于Flume设计和搭建而成。
《基于Flume的美团日志收集系统》将分两部分给读者呈现美团日志收集系统的架构设计和实战经验。
第一部分架构和设计,将主要着眼于日志收集系统整体的架构设计,以及为什么要做这样的设计。
第二部分改进和优化,将主要着眼于实际部署和使用过程中遇到的问题,对Flume做的功能修改和优化等。
1 日志收集系统简介日志收集是大数据的基石。
许多公司的业务平台每天都会产生大量的日志数据。收集业务日志数据,供离线和在线的分析系统使用,正是日志收集系统的要做的事情。高可用性,高可靠性和可扩展性是日志收集系统所具有的基本特征。
目前常用的开源日志收集系统有Flume, Scribe等。Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,目前已经是Apache的一个子项目。Scribe是Facebook开源的日志收集系统,它为日志的分布式收集,统一处理提供一个可扩展的,高容错的简单方案。
2 常用的开源日志收集系统对比下面将对常见的开源日志收集系统Flume和Scribe的各方面进行对比。对比中Flume将主要采用Apache下的Flume-NG为参考对象。同时,我们将常用的日志收集系统分为三层(Agent层,Collector层和Store层)来进行对比。
对比项Flume-NGScribe使用语言 Java c/c++
容错性 Agent和Collector间,Collector和Store间都有容错性,且提供三种级别的可靠性保证; Agent和Collector间, Collector和Store之间有容错性;
负载均衡 Agent和Collector间,Collector和Store间有LoadBalance和Failover两种模式 无
可扩展性 好 好
Agent丰富程度 提供丰富的Agent,包括avro/thrift socket, text, tail等 主要是thrift端口
Store丰富程度 可以直接写hdfs, text, console, tcp;写hdfs时支持对text和sequence的压缩; 提供buffer, network, file(hdfs, text)等
代码结构 系统框架好,模块分明,易于开发 代码简单
3 美团日志收集系统架构
美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流。美团的日志收集系统基于Flume设计和搭建而成。目前每天收集和处理约T级别的日志数据。
下图是美团的日志收集系统的整体框架图。
a. 整个系统分为三层:Agent层,Collector层和Store层。其中Agent层每个机器部署一个进程,负责对单机的日志收集工作;Collector层部署在中心服务器上,负责接收Agent层发送的日志,并且将日志根据路由规则写到相应的Store层中;Store层负责提供永久或者临时的日志存储服务,或者将日志流导向其它服务器。
b. Agent到Collector使用LoadBalance策略,将所有的日志均衡地发到所有的Collector上,达到负载均衡的目标,同时并处理单个Collector失效的问题。
c. Collector层的目标主要有三个:SinkHdfs, SinkKafka和SinkBypass。分别提供离线的数据到Hdfs,和提供实时的日志流到Kafka和Bypass。其中SinkHdfs又根据日志量的大小分为SinkHdfs_b,SinkHdfs_m和SinkHdfs_s三个Sink,以提高写入到Hdfs的性能,具体见后面介绍。
d. 对于Store来说,Hdfs负责永久地存储所有日志;Kafka存储最新的7天日志,并给Storm系统提供实时日志流;Bypass负责给其它服务器和应用提供实时日志流。
下图是美团的日志收集系统的模块分解图,详解Agent, Collector和Bypass中的Source, Channel和Sink的关系。
a. 模块命名规则:所有的Source以src开头,所有的Channel以ch开头,所有的Sink以sink开头;
b. Channel统一使用美团开发的DualChannel,具体原因后面详述;对于过滤掉的日志使用NullChannel,具体原因后面详述;
c. 模块之间内部通信统一使用Avro接口;
4 架构设计考虑下面将从可用性,可靠性,可扩展性和兼容性等方面,对上述的架构做细致的解析。
4.1 可用性(availablity)