一种基于Flume的分布式日志采集分析系统

Posted 中兴大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一种基于Flume的分布式日志采集分析系统相关的知识,希望对你有一定的参考价值。

文 | 陈建伟@中兴大数据

日志可以反映应用系统的运行状况和用户行为,并且随着是互联网技术和人工智能的发展,日志的采集分析方式更加多样,采集分析系统的作用越来越大,甚至可以认为日志采集分析是大数据的基石。

下面主要介绍一种基于Flume-ng的分布式日志采集分析系统,该系统具有高可用性、可靠性、扩展性等特点。

系统结构

所示为一种基于Flume的分布式日志采集分析系统整体框架图:

一种基于Flume的分布式日志采集分析系统

图1 整体框架图

 整个系统分为三层:Agent层,Collector层和Storage层,下面将逐一介绍。

Agent层

Agent层每个机器部署一个Flume-ng单节点进程,负责对单机的日志收集整理。

为了方便理解,先简单介绍下Flume-ng(下文简称Flume):

Flume以agent为最小的独立运行单位,每一个agent即是一个小的JVM。Flume由不同类型的Source、Channel、Sink 组件组成,不同类型组件之间可以自由组合从而构建复杂性的系统。Source实现对原始日志的采集接收,Channel 负责为Source 和 Sink 的对接提供临时的缓存通道,Sink则负责将收集到的日志下放到存储、分析等系统中,以实现日志的最终交付。如图 2 所示是摘自Flume官网的,是最基础的采集存储系统的架构图:

一种基于Flume的分布式日志采集分析系统

图 2 Flume基础架构图

Flume具备高可扩展性,支持多级流处理,可根据不同业务需求及功能需求对Flumeagent组件进行不同方式的组合,从而构建出耦合度低、可用性高、扩展性强的健壮的采集系统。如图 3 即是摘自Flume官网的复杂的Flume流,通过 ChannelSink 和不同的分析存储系统及 Source组合完成复杂的采集分析任务。

一种基于Flume的分布式日志采集分析系统

图 3 Flume复杂流图

本文的分布式采集分析系统的agent层每个节点的框架如图 所示:

一种基于Flume的分布式日志采集分析系统

图 4 Agent层框架图

每个节点的使用了最新的1.7.0版本的Flume。下面就每个节点的sourcechannelsink配置逐一介绍下:

Source

选用tailDirSource, 这个是1.7版本新增特性,可以递归地监听配置目录的动态变化的文件。目前采集分析系统应用的大数据管理系统,其中各个组件同类型日志类型差异大,而最后又都需要对应ElasticSearch中field。所以,在每个source都根据日志类型增加了,定义日志的grok和filed匹配规则,从日志中解析对应filed的字段信息。具体配置信息如下:

Source配置:一种基于Flume的分布式日志采集分析系统

Morphline配置:一种基于Flume的分布式日志采集分析系统

dictionary配置:一种基于Flume的分布式日志采集分析系统

Channel

选用SpillableMemoryChannel,这种channel优先将evnet放在内存中,一旦内存达到设定的容量就使用file channel写入磁盘。然后读的时候会按照顺序读取:会通过一个DrainOrderQueue来保证不管是内存中的还是溢出(指的是内存channel已满,需要使用file channel存储数据)文件中的顺序。这个Channel是memory channel和file channel的一个折中,虽然在内存中的数据仍然可能因为进程的突然中断而丢失,但是相对于memory channel而言一旦sink处理速度跟不上不至于丢失数据(后者一旦满了爆发异常会丢失后续的数据),提高了数据的可靠性;相对于file channel而言自然是大大提高了速度,但是可靠性较file channel有所降低。

Channel配置:一种基于Flume的分布式日志采集分析系统

Sink

选用avro类型的sink,同时使用Flume的Failover Sink Processor特性,通过它维护了一组collector优先级列表,agent上报上来的日志会发送至优先级别高的collector中,如果优先级别高的collector异常无法提供服务,那么会发送给其他的collector,从而达到故障转移的效果。

Sink配置:一种基于Flume的分布式日志采集分析系统

Collector层

Collector层,负责接收Agent层发送的日志,并且将日志根发送到Storage层。通过Agent层的faild voer策略转发到Collector层,大大增加了系统的可靠性。Collector层仍然选择Flume-ng实现。具体框架如图 所示:一种基于Flume的分布式日志采集分析系统

图 5 collector框架图

Collector层每个collector节点都较为简单,avro类型的source 接受各个agent上报上来的日志,通过SpillableMemoryChannel类型的channel,最后由ElasticSearchSink写入到Storage层的ElasticSearch。

Collector配置:一种基于Flume的分布式日志采集分析系统

Storage层

Storage层基于ElasticSearch,不仅提供日志存储,还可以提供全文检索、分析聚合等功能。ElasticSearch是一个实时的分布式搜索和分析引擎,功能强大,限于篇幅,不在本文展开。

设计考虑

系统的可用性

可用性(availablity)指固定周期内系统无故障运行总时间。影响采集系统可用性的主要就AgentCollector宕机两种情况。

Agent宕机

Agent宕机分为两种情况:主机死机或者Agent进程死掉。

对于主机死机的情况来说,由于产生日志的进程也同样会死掉,所以不会再产生新的日志,不存在不提供服务的情况。

对于Agent进程死掉的情况来说,确实会降低系统的可用性。对此,我们也做了一些保护来提高系统的可用性。例如,对agent进出增加了看门狗进程,如果进程死掉会被agent立即重启。当然,如果是非常重要的日志,会考虑直接使用FileChannel。

Collector宕机

由于Collector层每个collector是对等的,都能提供服务,overfaild策略下,当某个Collector无法提供服务时,Agent的重试策略会将数据发送到其它可用的Collector上面。所以整个服务不受影响。

系统的可靠性

可靠性(reliability)是指Flume在数据流的传输过程中,保证events的可靠传递。

根据官方说明,Flume提供数据流中点到点的可靠性保证,当且仅当它们被保存到下一个Agent的Channel中或者被保存到最终的存储服务之后才会删除Channel中的event。

系统的扩展性

可扩展性(scalability)是指系统能够线性扩展。当日志量增大时,系统能够以简单的增加机器来达到线性扩容的目的。

对于本文基于Flume的日志收集系统来说,需要在设计的每一层,都可以做到线性扩展地提供服务。

Agent层

对于Agent这一层来说,每个机器部署一个Agent,可以水平扩展,不受限制。

Collector层

对于Collector这一层,Agent到Collector是有Load Balance机制,并且Collector提供无差别服务,所以可以线性扩展。

Storage层

对于Store这一层来说,ElasticSearch是分布式系统,可以做到线性扩展。

总结

本文介绍了一种基于Flume-的分布式日志采集分析系统,轻量,并且具有高可用、高可靠、可扩展的特点。分布式日志采集分析系统有多种实现,例如基于ELK(ElasticSearchLogStackKibanna)或者基于FlumeKafkaElasticsearchStorm的采集分析系统,都有各自优缺点和适用场景。针对不同的场景,还是需要具体问题具体分析,本文提供一种思路,仅供参考。


 

大数据时代的思考和洞察

长按二维码关注

以上是关于一种基于Flume的分布式日志采集分析系统的主要内容,如果未能解决你的问题,请参考以下文章

日志采集框架Flume

Hadoop-Flume日志采集系统

数据湖:海量日志采集引擎Flume

带你看懂大数据采集引擎之Flume&采集目录中的日志

带你看懂大数据采集引擎之Flume&采集目录中的日志

数据湖:海量日志采集引擎Flume