王靜
(上海圖書館,上海 200031)
圖書館電子文獻數(shù)據(jù)庫每天都有很多用戶訪問和下載文獻,后臺記錄用戶信息、行為的日志信息大量增長,并發(fā)量也急劇增大。本文以上海圖書館《全國報刊索引》平臺為例,為全文數(shù)據(jù)庫系統(tǒng)的日志管理提供一種解決方案。
上海圖書館《全國報刊索引》平臺日志數(shù)據(jù)記錄了用戶信息、登錄信息、全文下載信息和數(shù)據(jù)庫檢索信息等。平臺日志數(shù)據(jù)特點:①數(shù)據(jù)量大,機構(gòu)用戶900多家,個人用戶近2萬人;平均日登錄數(shù)1萬多次,日檢索信息70多萬條,日全文下載量2萬多條,總?cè)罩緮?shù)量級上億。②數(shù)據(jù)結(jié)構(gòu)松散,不同數(shù)據(jù)調(diào)取和統(tǒng)計分析,需要提供不同的報表。③讀寫操作的高并發(fā)性,隨著個人服務(wù)功能的上線,對數(shù)據(jù)庫訪問的并發(fā)性要求也日益增強。④開發(fā)要更加敏捷:開發(fā)周期短,平臺日志管理系統(tǒng)開發(fā)需在短時間內(nèi)完成。
傳統(tǒng)使用關(guān)系數(shù)據(jù)庫,在日志數(shù)據(jù)管理上結(jié)果松散、讀寫效率不高。為了優(yōu)化日志數(shù)據(jù)的存儲,提高報表效率,逐步建設(shè)開放報表中心的需求,要建立一個有效的日志數(shù)據(jù)管理系統(tǒng)。
MongoDB是一個基于文檔模型的,支持索引、復(fù)制、事務(wù)、分片水平擴展的數(shù)據(jù)庫,非常適用于分析和管理日志。第一,它易擴展,靈活的文檔數(shù)據(jù)模型使得處理數(shù)據(jù)更加直觀;第二,它類似于關(guān)系型數(shù)據(jù)庫,有豐富的數(shù)據(jù)查詢語言,可建立索引和分布式可擴展設(shè)計;第三,它的數(shù)據(jù)以文件形式加載在內(nèi)存中,其插入和查詢效率要優(yōu)于關(guān)系型數(shù)據(jù)庫。
《全國報刊索引》平臺日志管理系統(tǒng)實驗調(diào)研了非關(guān)系型數(shù)據(jù)庫MongoDB和關(guān)系型數(shù)據(jù)庫MySQL,來確定哪種更為適應(yīng)需求。
2.1.1 測試目的
因為日志最主要是寫入與查詢操作,實驗就關(guān)注日志數(shù)據(jù)存儲記錄越來越多的時候,其插入和查詢效率將會受到怎樣的影響。
2.1.2 測試條件
服務(wù)器,Xeon E5-2630,16 G內(nèi)存,Win2008 64位。MongoDB版本:3.0,無任何優(yōu)化配置,單機測試;MySQL版本:5.1.49,無任何優(yōu)化配置,單機測試。數(shù)據(jù)庫接口驅(qū)動:Mon?goDB:PyMongo 2.1.1;MySQL:MySQLdb 1.2.3。
2.1.3 測試方法和結(jié)果
模擬一個用戶登錄信息的格式數(shù)據(jù),數(shù)據(jù)庫中已備有1億條數(shù)據(jù),在此基礎(chǔ)上向數(shù)據(jù)庫里插入數(shù)據(jù)。本次測試,插入數(shù)據(jù)量為1,20,50,100,1000,5000,10000,100000,200000。
插入性能測試,如圖1所示。
圖1 插入速率數(shù)據(jù)
分析:如圖1所示,MongoDB的批量插入性能要優(yōu)于MySQL,隨著插入數(shù)據(jù)量的增大,兩者的速率差距越大。在插入數(shù)據(jù)量小于10000條時,兩者速率基本持平。上漲到10000條以上時,兩者拉開差異,MySQL比MongoDB要慢很多。
查詢功能測試,如圖2所示。
圖2 查詢速率數(shù)據(jù)
分析:如圖2所示,在讀取的數(shù)據(jù)規(guī)模不大時,MongoDB和MySQL都能滿足用戶的需求,但在讀取數(shù)據(jù)規(guī)模變大后,MongoDB的查詢性能明顯優(yōu)于MySQL,甚至相差2倍。
查詢穩(wěn)定性測試,如圖3所示。
圖3 查詢穩(wěn)定性比較
分析:不同數(shù)量級下面每1000條數(shù)據(jù)查詢的時間:縱坐標(biāo)是每查詢1000條數(shù)據(jù)所需要的時間;橫坐標(biāo)是查詢時數(shù)據(jù)庫的數(shù)量,分別為1萬,10萬,20萬,50萬和100萬。MySQL的穩(wěn)定性強于Mon?goDB。
MongoDB穩(wěn)定性雖弱于關(guān)系型數(shù)據(jù)庫,但隨著數(shù)據(jù)量的增大,MongoDB插入查詢效率更高,且存儲結(jié)構(gòu)靈活。最終選取MongoDB做《全國報刊索引》平臺的日志數(shù)據(jù)管理系統(tǒng)。
《全國報刊索引》平臺日志數(shù)據(jù)庫結(jié)構(gòu),如圖4所示。
圖4 報表結(jié)構(gòu)
幾種類型的表設(shè)計:
(1)個人用戶信息表。存儲用戶信息。一對一關(guān)系,userId作為主鍵。
(2)組織用戶信息表。一個組織可以包含多個用戶,一個用戶只能屬于一個組織。一對多的關(guān)系,兩張表,用戶表和組織表,在用戶表中設(shè)計Orgid字段,通過其關(guān)聯(lián)用戶與組織關(guān)系。
(3)用戶下載報表。一個用戶可以下載多個數(shù)據(jù)庫的文章,一個數(shù)據(jù)庫的文章也可以被多個用戶下載。多對多的關(guān)系,采用嵌套的設(shè)計方案:兩張表,Download表存儲下載該數(shù)據(jù)庫的所有用戶。User表存儲用戶所有下載的數(shù)據(jù)庫。
日志管理系統(tǒng)建成后,管理員可以查看用戶在網(wǎng)站的任何行為,也可以查看每個模塊的操作情況,如查詢、新建、刪除、編輯等。系統(tǒng)每月自動生成訪問報表,郵件形式發(fā)送。也可根據(jù)管理員的需要,設(shè)定特定條件,生成報表。例如本月、上月新增機構(gòu)用戶數(shù)、總的機構(gòu)用戶數(shù),本月機構(gòu)原文索取金額、個人原文索取金額等。
報表設(shè)計了圖形化顯示,更直觀生動的體現(xiàn)數(shù)據(jù)趨勢。管理員分析數(shù)據(jù)時,一眼就看清新增用戶的增長趨勢或是各類用戶的數(shù)據(jù)庫使用情況。如圖5所示。
圖5 圖形化報表樣例
運行一段時間后,數(shù)據(jù)量與并發(fā)量快速增長,對存儲帶來了一定壓力。雖然MongoDB帶有自動分片功能,但目前還沒有太多的數(shù)據(jù)需要分片,所以采用副本集來保證自動故障轉(zhuǎn)移。
日志數(shù)據(jù)有一個明顯的特性,就是隨著時間的增加,其價值變得越來越小?;谶@個特性,日志存儲日益增大的問題,解決方案是按照一定的周期進行詳情歸檔,再把具體明細移到其他地方存儲。
目前是每日歸檔,把用戶的登錄信息按日匯總,縮小數(shù)據(jù)量,提高統(tǒng)計效率,降低存儲成本。
在按日期統(tǒng)計用戶登錄信息時,歸檔數(shù)量總與實際數(shù)量不一致。通過查找資料,發(fā)現(xiàn)可能是MongoDB的“時差”問題。當(dāng)MongoDB保存到數(shù)據(jù)庫的時候,默認為UTC時間(世界標(biāo)準(zhǔn)時間),北京時間比UTC時間早8小時,即UTC時間1月21日中午12:00,北京時間是1月21日20:00。解決方法開始是在RoboMongo通過“Options”-“Display Dates in...”-“Local Timezone”來設(shè)置顯示本地時間。但在每次讀取的時,都需要來回進行轉(zhuǎn)換,比較麻煩。后來發(fā)現(xiàn)MongoDB本身提供了解決方法:[BsonDateTimeOptions(Kind=DateTimeKind.Local)]public DateTime OperTime{get;set;}。經(jīng)過處理后,歸檔的數(shù)量與實際數(shù)量終于一致了。
最后結(jié)果如圖6所示。
圖6 MongoDB時差解決方法
MongoDB性能的各項實驗,它具備的高性能、高擴展性、類SQL的豐富查詢和索引等特性,非常適用于上海圖書館《全國報刊索引》的后臺日志管理系統(tǒng)。系統(tǒng)建立后,提高了用戶日志數(shù)據(jù)分析的能力,滿足了業(yè)務(wù)發(fā)展隨時響應(yīng)的需求,提供了專業(yè)報表服務(wù)和圖形化呈現(xiàn)。同時,支持PC端與移動端,增強了基于數(shù)據(jù)記錄基礎(chǔ)上的統(tǒng)計功能,增加詞頻分析功能,完全將讀者的檢索詞形成詞云,保存待進一步分析和利用等。
本文通過MongoDB在上海圖書館《全國報刊索引》日志管理系統(tǒng)中的應(yīng)用,證明它在文獻數(shù)據(jù)庫日志管理上的應(yīng)用可顯著提高文獻數(shù)據(jù)庫日志的管理系統(tǒng)性和查詢效率,而且成本較低。