何長鵬
(甘肅政法大學公安技術學院,甘肅蘭州 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 實現了日志文件高效的搜索、可視化分析。從實驗仿真的結果來看,本文所做的一些針對性的開發工作,可以縮短數據處理時延,提升服務集群高并發處理能力,滿足日志實時分析性能要求。