文档库 最新最全的文档下载
当前位置:文档库 › 基于Flume的分布式日志采集分析系统设计与实现

基于Flume的分布式日志采集分析系统设计与实现

2016年

软 件

2016, V ol. 37, No. 12

作者简介: 陈飞(1991-),男,研究生,主要研究方向:信息安全;艾中良(1971-),男,研究员级高级工程师,主要研究方向:网格计算、信息共享及信息安全。

基于Flume 的分布式日志采集

分析系统设计与实现

陈 飞,艾中良

(华北计算技术研究所,北京 100083)

摘 要: 互联网的迅猛发展以及大数据相关技术的兴起,使得日志数据的规模日益剧增,给已有的日志采集及分析系统带来了挑战;同时针对互联网安全的攻击活动也层出不穷,如何在海量的日志中及时提取有效的信息以为企业安全提供信息支撑,也给现有的分析系统提出了新的需求。本文结合使用Flume 、Elasticsearch 以及Kibana 等技术手段提出了一种分布式的日志采集分析系统,从系统设计和架构等方面提出了新的解决思路,并针对Nginx 的访问日志进行了实时采集和分析及展示,完成了原型系统的实现,实验证明,基于Flume 的分布式的日志采集分析系统方案具有可行性。

关键词: 信息安全;日志采集;Flume ;Elasticsearch ;Kibana

中图分类号: TP311.52 文献标识码: A DOI :10.3969/j.issn.1003-6970.2016.12.019

本文著录格式:陈飞,艾中良. 基于Flume 的分布式日志采集分析系统设计与实现[J]. 软件,2016,37(12):82-88

Design and Implementation of Distributed Log Collection

and Analysis System Based on Flume

CHEN Fei, AI Zhong-liang

(North China Institute of Computing Technology, Beijing 100083, Chin )

【Abstract 】: The rapid development of the Internet and the rise of big data technology, making the scale of the log data increasing rapidly, bring challenges to the current log collection and analysis system. At the same time, the Internet se-curity attacks become more and more severely, how to extract effective information from massive logs to provide sup-ports for enterprise security in time has also bring the new requirements to the current system. This paper proposes a distributed log collection and analysis system based on Flume, Elasticsearch and Kibana, and proposes a new solution from the aspects of system design and architecture, In addition it has also done a successful experiment based on Nginx's access logs. The experiment has proved that the method based on Flume is feasible. 【Key words 】: Information Security; Log collection; Flume; Elasticsearch; Kibana

0 引言

互联网的快速发展,尤其是近年来移动互联网的崛起及大数据技术的迅猛发展,导致了日志数据日益剧增[1],这些日志数据具有体量巨大、种类繁多、价值密度低以及处理速度快等特点[2]。海量日志数据的出现给互联网公司和企业带来了巨大挑战[3],一方面海量数据的出现对企业和单位现有的日志采集系统造成了冲击,传统的日志采集方案不足以支撑现有大规模数据量,在面对各类型数据处理时不

够灵活;另一方面,当前互联网上的网络攻击日益频繁,企业安全系统受到严重的挑战,网络安全形势严峻[4],海量日志数据的出现会将极少有用的数据湮没。建立建立扩展性高[5]、适应性强、稳定性好的日志采集分析系统至关重要,一方面满足大规模数据的采集及处理,另一方面通过建立实时的日志分分析、展示平台将各类应用服务日志数据的实时趋势及当前状况及时展示出来,便于及时掌握公司内部系统的状态,为企业IT 系统的管理和安全分析提供保障和有效支撑。

陈 飞等:基于Flume 的分布式日志采集分析系统设计与实现

83

《软件》杂志欢迎推荐投稿:cosoft@https://www.wendangku.net/doc/015794804.html,

本文基于开源日志收集系统Apache Flume 以及开源搜索引擎ElasticSearch 设计并实现一个基于海量数据的分布式日志采集分析原型系统,该系统实现对系统WEB 服务日志的采集,分析和展示,具备实时搜索功能。实验证明了系统设计和方案具备可行性。

1 技术要点

1.1 Flume

Flume [6]是一个分布式的海量日志聚合系统,支持数据发送方,数据接收方的数据定制,同时具备数据预处理的能力。目前Flume 有Flume-OG 和Flume-NG 两个版本,Flume-NG 是在Flume-OG 的基础上经重构所形成的更具适应性的版本,使用方便简单,适应各种日志收集,并支持FailOver 和负

载均衡机制。其主要架构如图1所示:

Flume 以agent 为最小的独立运行单位,每一个agent 即是一个小的JVM 。Flume 主要由不同类型的Source 、Channel 、Sink 组件组成,不同类型组件之间可以自由组合从而构建复杂性的系统。Source 组件实现对原始日志的采集接收,Channel 组件负责为Source 和Sink 组件的对接提供临时的缓存通道,Sink 组件则负责将收集到的日志下放到存储、分析等系统中,以实现日志的最终交付。Flume 具备高可扩展性,支持多级流处理,可根据不同业务需求及功能需求对Flume 的agent 组件进行不同方式的组合,从而构建出耦合度低、可用性高、扩展性强的强壮的采集系统。如下图2即是复杂的Flume 流,通过Channle 、Sink 和不同的分析存储系统及Source 组合完成复杂的采集分析任务。

图1 Flume 基本架构

图2 复杂的Flume 流

第37卷 第12期 软 件

84

《软件》杂志欢迎推荐投稿:cosoft@https://www.wendangku.net/doc/015794804.html,

1.2 ElasticSearch

ElasticSearch [7]是一个基于Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web 接口,是当前流行的企业级搜索引擎。常被用于云计算中,具有实时搜索、稳定、可靠、快速、安装方便[8]等特点。其典型的调用API 接口如下: 1.2.1 创建索引

//通过json 文档建立索引

IndexResponse response = client.prepareIndex ("twitter", "tweet", "1")

.setSource(jsonBuilder() .startObject()

.field("user", "kimchy") .field("postDate", new Date())

.field("message", "try-ing out Elasticsearch")

.endObject() ) .execute() .actionGet(); 1.2.2 更新索引

UpdateRequest updateRequest = new UpdateRe-quest();

updateRequest.index("index"); updateRequest.type("type"); updateRequest.id("1");

updateRequest.doc(jsonBuilder() .startObject()

.field("gender", "male") .endObject());

client.update(updateRequest).get(); 1.2.3 查询索引

SearchResponse response = client.prepareSearch ("index1", "index2")

.setTypes("type1", "type2")

.setSearchType(SearchType.DFS_QUE RY_THEN_FETCH)

.setQuery(QueryBuilders.termQuery("multi", "test")) // Query

.setPostFilter(FilterBuilders.rangeFilter ("age").from(12).to(18)) // Filter

.setFrom(0).setSize(60).setExplain(true) .execute() .actionGet(); 1.3 Kibana

Kibana [9]是一个与Elasticsearch 配合工作的开源的数据分析和图形化展示的平台。使用Kibana 可对Elasticsearch 索引中存储的数据进行查找、查看,可以方便地进行高级数据分析和绘制各种图表等。Kibana 在分析海量数据时非常方便,基于Web 界面可以快速的创建和分享在Elasticsearch 的查询结果,实时显示Elasticsearch 查询动态。

2 系统设计

基于开源日志采集工具Flume 的分布式日志采集系统,围绕业务数据海量、高可扩展、高可靠性等需求设计开发,为海量数据分析提供基础数据支撑。支持海量级业务数据采集、分布式处理、Failover 与负载均衡;提供与多种类型数据源对接的API ,部署灵活,扩展性强。分布式日志采集系统由采集、管理、分析存储三大模块组成。

图3 分布式日志采集分析系统

陈 飞等:基于Flume 的分布式日志采集分析系统设计与实现

85

《软件》杂志欢迎推荐投稿:cosoft@https://www.wendangku.net/doc/015794804.html,

系统采用分层式数据采集方案,针对不同业务需求在业务服务器上部署采集agent ,数据经采集管理中心实现数据的聚合及分发,实现数据采集与数据处理逻辑解耦,使不同业务之间数据采集逻辑相互分离,便于管理,系统可扩展性强,支持负载均衡与故障切换机制,为海量数据的采集提供稳定支撑,其实现方案如图4所示。

其中采集模块负责对业务数据的收集工作,由对应业务的采集agent 完成;管理模块负责接收采集层的数据,并将数据根据不同的路由策略下发至存储模块中供分布式文件系统及分布式消息系统使用,此工作由管理层的各管理agent 完成,各管理agent 与采集agent 之间通过交叉传输实现负载均衡与Failover ,保证数据传输的可靠性;分析存储模块则负责提供永久或者临时的数据存储服务、或者将数据流导向其他服务,主要由分布式文件系统、分布式实时索引系统等组成。

3 系统实现

根据系统设计及项目需求,本文完成对WEB 服务日志的采集并根据需求对日志中的字段进行索引,最后通过WEB 界面对Nginx 的访问日志进行实时的展示。

3.1 Nginx 日志

Nginx [10]是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序设计师Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎Rambler ,其特点是占有内存少,并发能力强,目前在主流WEB 服务器排名中位居第二仅次于Apache 。其日志主要由access. log 和error.log 构成,其中error.log 日志记录服务器错误日志,而access.log 主要记录了用户的访问,主要包括用户的ip 地址、访问的时间、请求页面以及客户端浏览器信息等,其格式如下:

图4 采集方案

192.168.10.254 - - [30/Aug/2016:14:01:40 +0800] "GET /poweredby.png HTTP/1.1" 304 0 "http://192.168. 10.112/" "Mozilla/5.0 (Windows NT 6.1) Apple-WebKit/537.36 (KHTML, like Gecko) Chrome/45.0. 2454.101 Safari/537.36" "-"

3.2 Flume 配置

Flume 主要完成对Nginx 服务器中access.log 日志的采集和分析,从而能够将日志汇总到Elast-icsearch 并能形成实时索引信息供展示和查询,其核

心配置如下:

#定义sources 、channel 和sinks 的名称 agent.sources = tail

agent.sinks = elasticsearch

agent.channels = memoryChannel #配置source 的详情

agent.sources.tail.type = exec

https://www.wendangku.net/doc/015794804.html,mand=tail -F /var/log/nginx/ access.log

第37卷 第12期 软 件

86

《软件》杂志欢迎推荐投稿:cosoft@https://www.wendangku.net/doc/015794804.html,

agent.sources.tail.interceptors=i1 i2 i3

agent.sources.tail.interceptors.i1.type=regex_extr actor

agent.sources.tail.interceptors.i1.regex=(\\d+\\.\\ d+\\.\\d+\\.\\d+)\\s+\\-\\s+\\-\\s+\\[(\\d+/\\w+/\\d+\\:\\d +\\:\\d+\\:\\d+)

agent.sources.tail.interceptors.i1.serializers=s1 s2 agent.sources.tail.interceptors.i1.serializers.s1.na me=visit_ip

agent.sources.tail.interceptors.i1.serializers.s2.na me=visit_time

agent.sources.tail.interceptors.i2.type=org.apache .flume.interceptor.TimestampInterceptor$Builder

agent.sources.tail.interceptors.i3.type=org.apache .flume.interceptor.HostInterceptor$Builder

agent.sources.tail.interceptors.i3.hostHeader=myhost source 部分的配置主要为了对Nginx 的access. log 日志进行采集并对其进行预处理,通过定义拦截器interceptors [11]对日志进行分割预处理其中i1规则主要通过正则表达式对日志进行格式化处理并将对应匹配到的字段进行变量赋值。上述配置中将(\\d+\\.\\d+\\.\\d+\\.\\d+)正则表达式匹配到的ip 地址赋值给visit_ip 变量,(\\d+/\\w+/\\d+\\:\\d+\\:\\d+\\:\\ d+)正则表达式匹配到的时间赋值给visit_time 变量。 #配置channel 的详情

agent.channels.memoryChannel.type=memory agentes.channels.channel1.capacity=1000000 agentes.channels.channel1.transactionCapacity=5000 #agentes.channels.channel1.keep-alive=10 #配置sink 的详情

agent.sinks.elasticsearch.type=org.apache.flume.s ink.elasticsearch.ElasticSearchSink

agent.sinks.elasticsearch.batchSize=100

agent.sinks.elasticsearch.hostNames=192.168.10.112:9300

agent.sinks.elasticsearch.indexName=nginx_log agent.sinks.elasticsearch.indexType=nginx_doc agent.sinks.elasticsearch.clusterName=elasticsearch agent.sinks.elasticsearch.serializer=org.apache.fl ume.sink.elasticsearch.ElasticSearchLogStashEventSe rializer

sink 部分的配置主要为了将格式化之后的数据段成功导入到Elasticsearch 集群中并建立相关索引,上述配置使用Flume 内置的ElasticSearchLogStash-EventSerializer 进行了序列化过程,建立了名称为nginx_log 开头,类型为nginx_doc 的索引。

#配置source 、sink 和channel 的详情

agent.sources.tail.channels = memoryChannel agent.sinks.elasticsearch.channel=memoryChannel

3.3 Kibana 定制

Kibana 可通过插件形式安装到Elasticsearch 中,安装完成后可通过手动定制或者直接导入模板的方式对展示界面进行定制以实现对所需要的条目信息以及显示界面进行个性化定制[12],模板以json 格式进行定义,由于行数较多,给出部分配置如下所示: {

"title": "Flume-ES-Nginx", "services": { "query": { "list": { "0": {

"id": 0,

"color": "#C15C17", "alias": "visit_ip=192.168.10.124", "pin": true,

"type": "lucene", "enable": true, "query": "visit_ip=192.168.10.124" }, "ids": [ 0, ] }, …

"filter": { "list": { "0": {

"type": "time",

"field": "@timestamp", "from": "now-6h", "to": "now",

"mandate": "must", "alias": "", "id": 0 } },

"ids": [0] } } }

4 结果及分析

通过多客户端对Nginx 服务器的访问测试,可以在Elasticsearch 服务器集群中看到对应实时索引的生成如下图5所示。

其对应的每个索引的详细信息为如下json 文本所示,显示了之前在Flume 中定义的索引名称、索引类型、索引对应的文本以及访问地址visit_ip 、visit_time 等信息,表明索引已经成功生成。

陈 飞等:基于Flume 的分布式日志采集分析系统设计与实现

87

《软件》杂志欢迎推荐投稿:

cosoft@https://www.wendangku.net/doc/015794804.html,

图5 索引展示

{

"_index": "nginx_log-2016-07-12", "_type": "nginx_doc",

"_id": "AVXdA4V9xdsomK8RZ1gC", "_version": 1, "_score": 1, "_source": {

"@message": "192.168.10.254 - - [12/Jul/2016: 10:50:36 +0800] "GET /elasticsearch/.kibana/_map-ping/*/field/_source?_=1468291983652 HTTP/1.1" 200 333 "http://192.168.10.112:8888/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" "-"",

"@timestamp": "2016-07-12T02:50:36.975Z", "@fields": { "timestamp": "1468291836975", "visit_ip": "192.168.10.254", "myhost": "192.168.10.121", "visit_time": "12/Jul/2016:10:50:36" } } }

最后在Kibana 平台上可以看到各访问客户端对

服务器的访问情况以及变化趋势,简单直观,并且可以根据需要自行进行定制,图6、图7和图8分别展示了各时间段内Nginx 服务器的总体访情况,各客户端的访问情况,统计图以及详细的访问数据等数据信息。

5 总结

本论文以“基于大数据平台的企业数据中心”项目为背景,实现了基于Flume 的分布式的数据日志采集分析系统的系统设计及实现,结合ElasticSearch 及其插件Kibana 完成了对Nginx 服务器访问日志的简单格式化处理及近实时的索引及展示,完成了从外部服务器日志到采集系统再到分析处理的简单流程,系统具有扩展性强,适应海量数据系统,高可靠性等优势,为项目的后期实现提供了技术储备。本文提出了一种新型适应于海量日志的采集系统解决方案,目前仅仅基于Flume 和ElasticSearch 内置的各组件和序列化接口实现对Nginx 日志的解析,完成了整个原型系统的研制,在遇到复杂的日志数据分析功能时可以通过对序列化源码进行修改以满

图6 Nginx 总体访问量

图7 客户端的访问量

图8 饼状统计图和柱状统计图

第37卷 第12期 软 件

88

《软件》杂志欢迎推荐投稿:cosoft@https://www.wendangku.net/doc/015794804.html,

图9 详细的数据段信息

足不同的业务需求,后续也会基于此点出发对系统进行改造优化。

参考文献

[1] 宋密, 王劲松. 基于Flume 的网络安全可视化系统[J]. 天津理工大学学报, 2015, 02: 38-42.

[2] 王正也, 李书芳. 一种基于Hive 日志分析的大数据存储优化方法[J]. 软件, 2014, 35(11): 94-100.

[3] 江三锋, 王元亮. 基于Hive 的海量web 日志分析系统设计研究[J]. 软件, 2015, 36(4): 93-96.

[4]

金松昌, 方滨兴, 杨树强, 贾焰. 基于Hadoop 的网络安全日志分析系统的设计与实现[A]. 中国计算机学会计算机安全专业委员会. 全国计算机安全学术交流会论文集·第二十五卷[C]. 中国计算机学会计算机安全专业委员会, 2010: 6.

[5]

吴茜媛, 郑庆华, 王萍. 一种可扩展的网络用户行为日志获取方法[J]. 软件, 2014, 35(10): 21-25.

[6] Apache Flume[OL]. https://www.wendangku.net/doc/015794804.html,/FlumeUserGuide.html. [7] Elasticsearch[OL]. https://www.elastic.co/products/elasticsearch. [8]

白俊, 郭贺彬. 基于ElasticSearch 的大日志实时搜索的软件集成方案研究[J]. 吉林师范大学学报(自然科学版), 2014, 01: 85-87.

[9] Kibana[OL]. https://www.elastic.co/products/kibana. [10] 苗泽. Nginx 高性能Web 服务器详解[M]. 北京: 电子工业

出版社, 2013.

[11] Hari Shreedharan. Flume: 构建高可用、可扩展的海量日志

采集系统[M]. 马延辉. 北京: 中国工信出版集团电子工业出版社, 2015.

[12] Rafaol Kuc, Marek Rogozinski. 深入理解ElasticSearch[M].

张世武. 北京: 机械工业出版社, 2016.

相关文档
相关文档 最新文档