韓 巖 李 曉
(1.中國科學院新疆理化技術研究所,新疆 烏魯木齊 830011; 2.中國科學院大學,北京 100049)
日志是一個完整系統里面重要的功能組成部分,其利用特定的形式準確并且規范地表達出系統產生的所有行為,依據對日志的分析不僅可以對系統自身的性能進行有效的優化,而且當系統發生故障時,能夠準確、及時地定位錯誤,方便加以修正。
目前,隨著互聯網web2.0的迅速發展,一個企業級的服務器每天產生日志信息是相當可觀的,日志分析研究多集中在如何挖掘數據,而對如何存儲海量數據研究較少。這主要是因為很多日志分析系統采用了關系數據庫存儲或簡單的順序存儲,如商用的Oracle數據庫,免費的MySQL。采用關系數據庫存在效率低下的缺點,簡單的順序存儲又存在功能不夠強大、查詢效率低等不足。因此日志處理缺乏一種能高效查詢、適合存儲海量數據的管理系統做支撐。現在處理海量日志系統的方案有很多,大部分是基于分布式的原理來實現解決的。本文提出一種Fluent與MongoDB相結合的方法來完成海量日志的存儲。
對于海量日志存儲與查詢,LZ是一個廣告公司的技術人員,需要對500M行(5億行)的log信息進行存儲和數據分析工作,并提出了自己的三種想法:
(1)將海量數據存在MySQL中并對每一個字段做索引。
(2)將以上數據存在MongoDB中并建立索引。
(3)將所有行加載到Hadoop中,通過MapReduce進行數據分析。
第一方案選擇MySQL的原因:MySQL是一個開放源碼的小型關系型數據庫管理系統,軟件本身具有體積小、速度快、總體擁有成本低的特點。MySQL是跨操作系統、支持多線程、支持多種存儲引擎和查詢速度快的數據庫管理系統。MySQL具有關系數據庫的特征,基本可以反映出關系數據庫的特性。
第二種方案選擇MongoDB的原因:MongoDB是分布式文檔存儲數據庫,它的特點是高性能、易部署、易使用,存儲數據非常方便。它支持的數據結構非常松散,是類似JSON的BSON格式,因此可以存儲比較復雜的數據類型。MongoDB的文檔模型自由靈活,可以讓你在開發過程中暢順無比。對于大數據量、高并發、弱事務的互聯網應用,MongoDB可以應對自如。MongoDB內置的水平擴展機制提供了從百萬到十億級別的數據量處理能力,完全可以滿足Web2.0和移動互聯網的數據存儲需求,其開箱即用的特性也大大降低了中小型網站的運維成本。
第三種方案選擇Hadoop的原因:Hadoop是一個能夠讓用戶輕松架構和使用的分布式計算平臺。用戶可以輕松地在Hadoop上開發和運行處理海量數據的應用程序。它主要有以下幾個優點:
(1)高可靠性:Hadoop按位存儲和處理數據的能力值得人們信賴。
(2)高擴展性:Hadoop是在可用的計算機集簇間分配數據并完成計算任務的,這些集簇可以方便地擴展到數以千計的節點中。
(3)高效性:Hadoop能夠在節點之間動態地移動數據,并保證各個節點的動態平衡,因此處理速度非常快。
(4)高容錯性:Hadoop能夠自動保存數據的多個副本,并且能夠自動將失敗的任務重新分配。
(5)低成本:Hadoop是開源的,項目的軟件成本因此會大大降低。
針對以上三種解決方案對處理海量的日志信息共同特征,解決海量日志存取主要解決以下幾個問題:
(1)高并發讀寫:現今的網站都是實時的生成動態頁面,及時提供動態信息,所以數據庫的并發負載很高。尤其是電子商務網站,每秒可以是上百萬的請求。
(2)海量數據的高效存儲與訪問:高效的解決海量數據的讀取是最核心的問題之一。對海里數據而言,如果數據存儲速度較慢,就會造成網絡堵塞甚至網絡癱瘓。如果數據庫的查詢性能較低,就不能及時滿足用戶查詢需求。
(3)高擴展性與可用性:在增加較少硬件成本下,較大提高軟件的性能與負載能力,保證其擴展性是可行的。另外,很多服務是實時的、不間斷的,所以保證其可用性也是必要的。
因為日志最主要是寫入與查詢操作,所以用以上三種想法分別對10萬、100萬、1000萬條數據只進行讀寫效率的測試。目的是為了驗證海量日志數據存儲與查詢有效性和可行性。
實驗日志數據格式如表1:

表1 日志格式
實驗說明:在單機環境下,分別對10萬、100萬、1000萬條數據只進行讀寫效率的測試。以下實驗是5次運行的平均結果。

圖1 單機批量插入數據

圖2 MySQL批量插入性能監控圖

圖3 MongoDB批量插入性能監控圖

圖4 單機批量查詢數據
實驗環境:單機條件下,在Eclipse下使用Java編寫開發的項目。分別對MySQL、Hadoop和MongoDB進行批量插入(原因:數據量大,逐條插入效率低)與查詢實驗。
(1)批量插入數據
單機環境下,批量插入數據的實驗結果如圖1。
在批量插入數據時,對MySQL、MongoDB監控信息如圖2、圖3。
(2)查詢數據
在實驗數據中隨機查詢100條數據所用的時間,查詢數據實驗結果如圖4。
在查詢數據時,對MySQL、MongoDB監控信息如圖5、圖6。
(3)實驗結果
實驗結論:在數據量較小的情況下,無論是批量插入還是查詢基本都是同一個數據量級上,都能滿足用戶的需求; 但隨著數據量的增大,數據庫建立索引后查詢效率明顯增加了,也增大了存儲空間。通過圖2與圖3可知,MongoDB最大插入速度是MySQL最大插入速度的近700倍。通過圖5與圖6可以得知,MongoDB最大查詢速度是MySQL最大查詢速度的近2倍。
實驗說明:在集群環境下,分別對10萬、100萬、1000萬條數據只進行讀寫效率的測試。以下實驗是5次運行的平均結果。
實驗環境:集群條件下,在Eclipse下使用Java編寫開發的項目。分別對MySQL、Hadoop和MongoDB進行實驗。
集群環境如下:①MySQL集群:是在虛擬機下以Amoeba為代理服務器3臺MySQL數據庫構成一個集群;②Hadoop集群:是在虛擬機下3個結點,1個master結點,2個datanode結點;③MongoDB集群:是在虛擬機下由MongoDB構建的3組復制集,每組3個分片,3個Configsvr,1個路由節點。
(1)批量插入數據
實驗結果如圖7。
(2)查詢數據
在實驗數據中隨機查詢100條數據所用的時間,查詢數據實驗結果如圖8。
(3) 實驗結果
實驗結論:在集群環境下,滿足單機條件下的結論,但時間略微有點增加的主要原因是集群的啟動與集群之間數據通信。隨著數據量的增大,三類不同的集群在插入與查詢數據的時間都有所降低,并且MongoDB在查詢數據上表現出明顯的優勢。總之,無論是在單機環境下還是在集群環境下,MongoDB都表現出自己獨特的優勢,適合作為海量日志的數據倉庫。
通過以上實驗結果說明MongoDB可以作為海量日志的數據倉庫,以下是用Fluent采集日志信息存儲到MongoDB或集群中的原理與過程。
(1)整個系統工作原理如圖9。
(2) 實現步驟:
a在Linux下,安裝MongoDB或MongoDB集群以及fluent-plugin-mongo。
b修改/etc/fluent/Fluentd.conf相關配置,使得Fluent采集信息能存儲到MongoDB中。
① 配置輸入信息:
type tail
format apache2
path /var/log/apache2/access_log
tag mongo.apache.access
② 配置單機輸出信息:
type mongo
database apache
collection access
host localhost
port 27017
flush_interval 10s
③ 配置復制集輸出信息:
type mongo_replset
database apache
collection fmongo
nodes ip1:port1, ip2:port2,…
flush_interval 10s
(3) 測試結果
a測試命令:
$ ab -n 100000 -c 100 http://ip地址/
b輸出結果如圖10.

圖5 MySQL查詢性能監控圖

圖6 MongoDB查詢性能監控圖

圖7 集群批量插入數據

圖8 集群批量查詢數據

圖9 整個系統工作原理

圖10 輸出結果
本文通過驗證MongoDB存儲與查詢高效性,然后與Fluent相結合構造一個日志采集系統。這種方式可以滿足海量日志采集與存儲工作,將日志信息直接存儲到數據庫中,對日志的“增刪改查”更方便、更高效,而且日志信息可以進行分布式的存儲。但這種方式也有很多不足,例如:單機情況下存儲數據不穩定性,集群情況下存儲數據的不平衡性和負載均衡的問題等。后續工作還有MongoDB集群的優化和日志分析系統的實現等任務。
[1]白超,楊靜,吳建國.基于并行計算的海量日志分析系統實現[J].計算機技術與發展,2013,23(7):80-83.
[2]王兆永. 面向大規模批量日志數據存儲方法的研究[D]. 成都: 電子科技大學,2011.
[3]nosqlfan Inc.. MySQL、MongoDB 還是Hadoop ? [EB/OL].[2010-09-02]. http://blog.nosqlfan.com/html/510.html.
[4]鄒貴金.深入云計算:MongoDB管理與開發實戰詳解[M].北京:中國鐵道出版社,2013:72-205.
[5]Kristina Cbodorow, Micbael Dirolf.MongoDB權威指南[M]. 北京:人民郵電出版社,2011:45-152.
[6]程苗,陳華平.基于Hadoop的Web日志挖掘[J].計算機工程,2011,37(11):37-39.
[7]李存琛.海量數據分布式存儲技術的研究與應用[D]. 北京: 北京郵電大學,2013.
[8]孫巍,譚成翔.基于Amoeba中間件的分布式數據庫管理系統[J].計算機與現代化.2013,02:153-156.
[9]張華強.關系型數據庫與NoSQL數據庫[J].電腦知識與技術,2011,7(20):4802-4804.