何长鹏
(甘肃政法大学公安技术学院,甘肃兰州 730070)
现如今人们处在以“移动互联网”为代表的智能化时代,各种应用程序时刻在不断地产生数据。随着网络用户数的增加,数据每天以几何级的速度快速增长,PB级别的海量用户数据不断地被制造出来,同时产生大规模的网络日志数据。日志文件分析对于大规模系统的开发、维护和性能调整很重要,是故障排除和问题诊断的重要来源[1]。企业业务对日志处理的实时性需求也逐渐提高,这给传统的网络日志分析方法带来严峻的挑战[2]。为了满足企业网络安全监控以及公安机关对电子数据取证方面的需求,促使研究人员不断地改进技术,提供针对大规模的网络日志实时分析解决方案。
虽然大规模网络日志分析系统设计取得了一些成果[3-8],但由于日志文件的数量和复杂性在不断增加,日志实时分析仍然面临着巨大的挑战。通常日志文件分散在多台设备或者服务器上,日志文件不仅数据海量,且不同设备的日志文件存在优先次序不一致、格式不统一、存储时间比较短、不同种类的日志间相互联系、处理时延较长等诸多问题[5],使得日志的深度分析变得困难。因此,本文将从数据来源分类出发,借助分布式平台Hadoop 在处理大数据方面的优势,设计实现了一种基于分布式平台的实时网络日志分析系统。根据不同主题把日志流进行分组,日志文件实现分级优化存储机制,高效的搜索、可视化,集群实现负载均衡。
在信息系统运维中,工程师需要实时分析包括应用负载、网络流量、磁盘I/O等系统日志数据,来保障信息系统正常工作。一方面在企业级应用系统中,日志系统本质上起到辅助性的作用,设计时应考虑尽量减少其系统开销,提高效率和吞吐量,还要满足跨平台移植性和扩展性;另一方面,日志系统要求服务运行平稳,服务集群具备高并发处理能力,满足实时分析性能要求。因此,构建的日志系统应具有以下特征:(1)系统的低耦合性;(2)支持实时在线分析;(3)具有高可扩展性。
基于上述设计原则,本文选择主流的分布式的数据存储和处理平台Hadoop。Hadoop系统为用户提供了一个海量数据分布式存储和计算的框架,可以部署在廉价的计算机集群上,能够满足高并发性能要求。为了降低系统复杂性,优先采用模块化设计方法,将系统整体框架划分三大组成部分:多源异构日志数据收集模块、日志分发存储模块、日志分析模块以及可视化表示,如图1所示。
图1 实时日志分析系统框架
系统的三大组成部分之间可实现无缝衔接,具有分布式、高扩展性、高可靠性、实时性等特点。日志数据采集层和日志数据汇集层协同设计,有效地降低了日志数据给服务器集群带来的并发请求,并提高了服务器集群的高并发处理能力,保证了服务的稳定运行。
文献[9]利用Chukwa 解决日志文件系统在数据处理阶段耦合度高的问题,提高了日志处理的灵活性和扩展性,但是在实时性方面Chukwa 对数据的敏感性较低,处理的数据是分钟级别的,不能满足海量数据的毫秒级高速处理。消息中间件Kafka 是一个高性能、高扩张性的分布式海量日志采集、聚合和传输的系统,可以将日志数据持久化到硬盘,防止数据的丢失。因此,本文采用Kafka 集群构建日志文件系统,首先数据采集模块使用Beats 工具集将采集的日志数据发送给Kafka,然后Kafka 根据不同的主题(Topic)把日志流进行分组,发布消息到订阅模块:HDFS文件系统和HBase数据库。离线分析日志数据直接存储在HDFS文件系统中,而实时处理数据则使用Fluentd 工具接收并存储到HBase 数据库中。最后利用Kibana 对存储在索引中的数据进行高效的搜索、可视化、分析等操作[7]。
日志服务对于应用业务而言仅仅起到保障作用,要求实现快速、轻量的数据采集与传输,不应占用服务器太多资源。Beats 属于轻量级数据采集工具集,提供多种类型工具。其中,TopBeat 负责监控资源;Metricbeat 收集系统资源信息,例如CPU、内存、磁盘等信息;Packetbeat 收集网络数据;Filebeat 负责日志文件的采集和传输,它能够保持每个文件的状态,并且频繁地把文件状态从注册表更新到磁盘。FileBeat还具有占用内存较低、性价比高、配置简单等特点[10],因此本文选择FileBeat 工具采集各节点日志文件,对日志文件过滤、修剪之后,将日志文件发送到Kafka中,这样可以缩短数据传输时间,提高传输效率。
日志文件系统支持 uuid、pid、timest、arvo、log4j、syslog 和http post 等类型,用户也可以自定义日志类型文件。由于不同设备和应用产生的日志文件格式不同,位置不同,需要统一日志收集规则、目录和输出方式[10]。例如,Web日志文件主要由不同类型的设备和服务器的日志构成,但这些设备和服务器没有统一的日志标准和格式,导致日志文件可读性较差,有必要对不同类型的日志需要转换为统一的方式处理。Fluentd 工具将所有日志看作JSON 格式的数据,并且用正则表达式去匹配日志。因此,本文将Fluentd 工具集成在日志收集模块,来解决日志文件格式不统一的问题。
大型网络当中,日志文件规模较大,日志系统长期存储的数据量可达到PB 级别,但大部分情况分析处理的更多是规模较小的日志文件。如果每项业务都要处理大规模的数据,必然耗时,且处理效率很低。在日志文件系统中用户往往只对特定时间段、特定日志源的数据感兴趣。本文利用文献[11]中的文件分级归档管理机制,对数据文件进行有效的分隔和合理的组织。根据文件大小和时间划分不同的分级指标,并为每一级设定最大归档阈值。这样形成日志数据的倒金字塔存储结构,并且随着日志数据的增大,文件数量不会呈现显著的增长态势,保持相对稳定。
Kafka是一个分布式的、可分区的、可复制的基于Zookeeper 协调的分布式消息系统,可以实时处理大量数据以满足各种需求场景。Kafka成功地实现了生产者(Producer)/消费者(Consumer)模式,通过Hadoop并行加载机制统一了在线和离线消息的处理。本文选择Kafka 作为日志系统消息发布订阅模块。中间层的Kafka Cluster 存储消息,它是由多个Server 组成的集群。为了实现负载均衡,Kafka 将所有消息组织成多个主题(Topic)的形式存储,而每个Topic又拆分成多个Partition,每个Partition 又由一个一个消息组成。每个消息都被标识了一个递增序列号代表其进来的先后顺序,并按顺序存储在Partition 中。一旦有新的关于某个Topic 的消息,Broker 会传递给订阅它的所有消费者。日志数据收集模块采集到日志数据后向订阅Topic 的消费者发布消息,消费者分别根据其主题将离线数据存储在HDFS文件系统,将实时在线分析数据存储在HBase数据库当中。
Kafka主要实现的是顺序存储,它通过Topic和消息队列的机制,实现了数据快速存储。如果数据采集模块将所有的数据都写入Kafka,会导致Topic 过多,引发磁盘竞争,进而影响集群的性能。因此,利用Fluentd工具将日志文件根据time_slice_format进行分割,并且在路径中加入时间,从而可以根据路径筛选出不同的日志,避免大量的日志产生干扰。
Hadoop 系统主要由分布式文件系统HDFS(Hadoop Distributed File System)、MapReduce 计算模型以及HBase 等组成。文件系统HDFS 和计算模型MapReduce,使用户能充分利用集群的大容量空间存储海量数据和集群高速计算能力开发分布式的应用程序,实现海量数据的毫秒级高速处理[12]。通常完整的日志分析系统支持离线分析和实时在线分析功能。本文利用HDFSSink 将离线日志数据写入HDFS中,HDFSSink 的优势是可以创建 Text 和 Sequence 格式文件,并对文件进行压缩处理。HDFSSink 支持基于时间、数量大小、事件数量的文件周期性滚动,并通过 Event Hearder 属性 TimeStamp 或 Host 来分割数据。将实时在线分析数据存储在数据库HBase 中。由于HBase是一个适合于非结构化数据存储的数据库,利用MapReduce 来处理海量数据,利用Zookeeper 作为其协同服务。
日志分析模块收到特定主题的日志数据后进行数据分析。存储在HBase 中的日志数据处理以后可用于决策分析、预测分析、数据检索及可视化[13]。常用的日志分析方法有关联分析、序列分析、聚类分析等。在实际应用中,日志分析场景是针对具体业务来进行分析,分析的内容包括用户行为、应用性能监控、系统设备性能监控、IoT 设备数据分析和监控、安全、审计和监控、异常探测和归因分析等。本文设计的实时日志分析系统是为了满足企业网络安全监控以及电子数据取证方面的需求,因此系统分析的主要目标是检测异常情况、追溯异常情况源头、监控异常指标和定位系统问题等。
Elasticsearch是一个分布式、高扩展、高实时的搜索与数据分析引擎。Kibana 是一个开源日志分析及可视化平台,为Elasticsearch 提供日志分析的Web 接口,可使用它对日志进行高效的搜索、可视化、分析等各种操作。用户通过浏览器可以创建各种高级图表进行数据分析和展示,也可以使用仪表盘功能汇总多个单操作图表,实时显示查询动态。基于以上分析,本文利用Elasticsearch强大的数据搜索功能和Kibana可视化分析功能,实现从HBase 数据库索引日志文件,向用户直接展示日志数据、告警信息和日志统计信息等。
本文将使用VMware虚拟机搭建分布式集群实验环境,在2台PC服务器上总共虚拟化4台计算机组成群组,每台计算机配置2个虚拟内核,2 GB内存,50 G磁盘存储空间。操作系统为CentOS,根据表1所示安装部署Hadoop、HBase、Kafka、Elasticsearch 和Kibana。按照默认配置,NameNode 节点和JobTracker 部署在同一个节点上,其余每个节点上都部署为DataNode和TaskTracker。
系统测试采集的数据源来自某单位信息中心管理的Web 服务器、防火墙以及数据平台上运行的应用系统的日志文件。其中Web 日志文件为文本文件记录日志,将其流式数据保存为CSV类型文件。采集的日志数据根据设定的规则,进行分级归档管理。以Web日志文件为分析对象,系统实时统计了用户在网站上的页面浏览量PV、独立访客UV、查询和IP 地址等信息。
表1 集群部署情况
伴随着各种应用软件的普及,系统日志量呈现指数增长态势,大规模的网络日志数据需要进行实时分析,但是日志文件存在数据格式、存储方式不统一和数据分析流程复杂等缺点,导致实时网络日志分析系统设计面临诸多困难,系统复杂性较高。因此,本文采用模块化的设计思想,将日志数据采集模块、传输模块与分析模块分离,降低系统的耦合性。设计的日志数据收集模块具有高并发、低时延的数据接入能力。利用文件分级归档管理机制可以对日志数据文件进行优化存储,避免对Kafka 集群产生干扰,实现了负载均衡。通过将Fluentd工具集成在日志收集模块,来解决日志文件格式不统一的问题。在可视化分析方面,利用Elasticsearch 和Kibana 实现了日志文件高效的搜索、可视化分析。从实验仿真的结果来看,本文所做的一些针对性的开发工作,可以缩短数据处理时延,提升服务集群高并发处理能力,满足日志实时分析性能要求。