周康生,張 興,王新安,雍珊珊,李柏杭,張 丹
(1.北京大學(xué)深圳研究生院 地震監(jiān)測預(yù)測技術(shù)研究中心,廣東 深圳 518055;2.武漢大學(xué) 計算機學(xué)院,湖北 武漢 430072)
日志可以記錄下系統(tǒng)運行過程中所產(chǎn)生的關(guān)鍵信息,并且按照某種規(guī)范表達出來,有助于運維人員和開發(fā)人員了解系統(tǒng)運行狀態(tài),快速定位系統(tǒng)問題[1-3]。規(guī)范和充分的日志是良好代碼質(zhì)量的必要因素,也是軟件故障診斷的重要手段[4]。隨著計算機技術(shù)的發(fā)展,大規(guī)模的軟件系統(tǒng)層出不窮,日志對于系統(tǒng)的重要性越來越明顯。文獻[5]對Apache httpd, OpenSSH, PostgreSQL和Squid等常用開源軟件進行了分析,結(jié)果表明,平均每30行代碼中就有一行是日志;文獻[5-6]通過對部分大規(guī)模開源軟件的失效報告進行隨機采樣分析,發(fā)現(xiàn)77%的系統(tǒng)失效可以歸結(jié)為幾類常見的錯誤診斷模式,而其中57%的錯誤沒有記錄日志信息,導(dǎo)致運維人員需要花費大量的精力來定位錯誤。文獻[7]對微軟內(nèi)部的54個經(jīng)驗豐富的開發(fā)人員進行了調(diào)查研究,并得出結(jié)論:適量的日志對于故障診斷起著非常重要的作用。
在一個計算機應(yīng)用系統(tǒng)中可能會包含很多的信息設(shè)備,所有設(shè)備產(chǎn)生的日志信息總量是巨大的,如果將所有信息都進行記錄,將會影響整個系統(tǒng)的性能。因此,盡量減少計算機資源占用率并且高效地收集日志數(shù)據(jù)是日志系統(tǒng)設(shè)計的重點。此外,日志系統(tǒng)若將這些數(shù)據(jù)收集起來,卻不加以處理,如此海量的日志數(shù)據(jù)將會極大地增加系統(tǒng)運維人員的工作量。北京大學(xué)深圳地震監(jiān)測預(yù)測技術(shù)研究中心研發(fā)的多分量地震監(jiān)測預(yù)測系統(tǒng)AETA正在全國地震高發(fā)區(qū)域大規(guī)模布設(shè),經(jīng)過統(tǒng)計和分析發(fā)現(xiàn),目前單臺服務(wù)器每天需要處理100萬條以上的日志,而大量的日志信息和數(shù)據(jù)并發(fā)量過多地擠占了服務(wù)器的處理能力和處理時間。因此,為了改變這種現(xiàn)狀,需要設(shè)計一套日志系統(tǒng),規(guī)范化日志的描述、采集和存儲,并且對收集到的日志進行統(tǒng)計分析,提高服務(wù)器的資源利用率,降低系統(tǒng)維護人員的運維成本。
多分量地震監(jiān)測預(yù)測系統(tǒng)AETA由地聲傳感探頭、電磁傳感探頭、數(shù)據(jù)處理終端,及監(jiān)測數(shù)據(jù)云平臺和數(shù)據(jù)分析系統(tǒng)組成,如圖1所示。
圖1 多分量地震監(jiān)測預(yù)測系統(tǒng)AETA系統(tǒng)框架
傳感探頭感知來自地下的電磁擾動和地聲信號,數(shù)據(jù)處理終端實時采集數(shù)據(jù)并通過互聯(lián)網(wǎng)(有線或無線)將數(shù)據(jù)傳輸?shù)皆破脚_進行特征提取、持久化存儲和異常分析等。
截止目前,在中國地震局的支持下,AETA系統(tǒng)布設(shè)范圍已覆蓋了河北、四川、云南、西藏、廣東和臺灣等地區(qū),其中在四川布設(shè)密度最大,布設(shè)數(shù)量已達100余套,基本覆蓋四川全境重點區(qū)域[8-14]。AETA系統(tǒng)具有跨區(qū)域布設(shè)、布設(shè)數(shù)量大等特點,通過現(xiàn)場分析來定位問題和了解設(shè)備運行狀況成本高、效率低,而日志技術(shù)可以記錄軟件的運行軌跡,進而回溯軟件運行過程,快速定位問題所在;如果能夠?qū)⒃O(shè)備記錄的日志數(shù)據(jù)傳送到數(shù)據(jù)中心,并進行持久化存儲,就可以在本地對日志數(shù)據(jù)進行分析來達到定位問題的目的,從而降低運維成本。因此,設(shè)計一個日志系統(tǒng)對AETA系統(tǒng)的運維管理具有重要的作用。
AETA日志系統(tǒng)是基于AETA數(shù)據(jù)采集系統(tǒng)設(shè)計的,由日志數(shù)據(jù)采集層、日志數(shù)據(jù)匯集層、持久化存儲層和日志數(shù)據(jù)展示層組成,如圖2所示。
圖2 AETA日志系統(tǒng)框架
日志數(shù)據(jù)采集層負責(zé)對設(shè)備的日志信息和狀態(tài)信息進行采集,并將數(shù)據(jù)規(guī)范化處理,然后按照約定的應(yīng)用層傳輸協(xié)議將數(shù)據(jù)傳輸至日志數(shù)據(jù)匯聚層;其中,日志數(shù)據(jù)源是業(yè)務(wù)數(shù)據(jù)處理應(yīng)用程序,而終端日志采集器完成日志數(shù)據(jù)的采集、規(guī)范化處理和傳輸。
匯聚層主要分為兩個部分:任務(wù)管理部分和數(shù)據(jù)分揀中心。任務(wù)管理部分包括任務(wù)分揀中心、各類任務(wù)調(diào)度中心和任務(wù)管理中心,負責(zé)管理采集層的設(shè)備(終端和探頭),檢測設(shè)備的運行狀態(tài),實現(xiàn)設(shè)備任務(wù)分解、協(xié)同等調(diào)度工作;數(shù)據(jù)分揀中心負責(zé)接收采集層上傳的電磁數(shù)據(jù)、地聲數(shù)據(jù)、日志數(shù)據(jù)和狀態(tài)數(shù)據(jù),將數(shù)據(jù)分類處理,然后將處理好的數(shù)據(jù)送入入庫隊列,由入庫隊列統(tǒng)一入庫;持久化存儲層采用MySQL數(shù)據(jù)庫和Linux文件系統(tǒng)存儲數(shù)據(jù),其中日志數(shù)據(jù)全部存儲在MySQL數(shù)據(jù)庫中。持久化存儲層通過對數(shù)據(jù)庫中的數(shù)據(jù)進行分析,生成事件、告警、視圖等元素的基本信息。展示層通過B/S方式展現(xiàn)用戶界面,通過數(shù)據(jù)預(yù)取技術(shù)將用戶可能關(guān)心的數(shù)據(jù)預(yù)先緩存到用戶本地,提高展示的效率,方便用戶使用。此外,還可為用戶提供配置任務(wù)、優(yōu)先級別、閾值和域名的接口,為用戶提供個性化服務(wù)。
日志數(shù)據(jù)采集層部署在數(shù)據(jù)處理終端,主要完成數(shù)據(jù)處理終端日志的收集、處理和傳輸功能。由圖3所示,日志數(shù)據(jù)采集層主要由數(shù)據(jù)處理應(yīng)用和終端日志采集器組成,其中數(shù)據(jù)處理應(yīng)用是AETA系統(tǒng)數(shù)據(jù)采集的關(guān)鍵應(yīng)用,也是日志數(shù)據(jù)的來源,而終端日志采集器則通過管道(一種進程間通信方式)或者持久化存儲設(shè)備獲取數(shù)據(jù)處理應(yīng)用產(chǎn)生的日志數(shù)據(jù)。終端日志采集器通過HTTP協(xié)議與云服務(wù)器通信,將日志內(nèi)推發(fā)送到服務(wù)器。每一次的數(shù)據(jù)發(fā)送都是一個發(fā)向服務(wù)器的HTTP請求,服務(wù)器在接收到HTTP請求后,將其放入待處理請求隊列,并為每一個請求設(shè)置超時時間,對于超時的請求則直接丟棄。
圖3 日志數(shù)據(jù)采集層
數(shù)據(jù)處理應(yīng)用總是在實時處理來自傳感探頭的數(shù)據(jù),為了比較完備地記錄軟件運行過程中的關(guān)鍵信息,會產(chǎn)生大量的日志。如果每產(chǎn)生一條日志就向服務(wù)器發(fā)送,則服務(wù)器會同時接收到大量的HTTP請求。由于服務(wù)器的處理能力有限,將會導(dǎo)致待處理請求隊列中大量的請求超時失效。因此,為了降低終端日志采集器向服務(wù)器發(fā)送HTTP請求的頻率,在日志數(shù)據(jù)采集層對收集到的日志作了合并處理。
表1是系統(tǒng)日志合并協(xié)議,其中TerminalId是該數(shù)據(jù)處理終端的編號,表示日志內(nèi)容來自于哪臺終端設(shè)備;LogNums表示合并的日志條數(shù),以便于后續(xù)對日志內(nèi)容進行解析處理;LogFlagN作為分隔多條日志的標(biāo)志;LogN則代表單條日志的內(nèi)容,如表2所示。其中Time記錄該條日志產(chǎn)生的Uinx時間戳。數(shù)據(jù)處理終端除了能夠記錄數(shù)據(jù)處理應(yīng)用產(chǎn)生的日志,還能夠?qū)㈦娫春蛡鞲刑筋^的運行狀況以日志的形式記錄下來。
表1 多分量地震監(jiān)測預(yù)測系統(tǒng)AETA日志合并協(xié)議
表2 多分量地震監(jiān)測預(yù)測系統(tǒng)AETA單條日志內(nèi)容格式
因此用DeviceType來表示該條日志記錄的是哪個設(shè)備的信息,Dev01、Dev02和Dev03為約定的標(biāo)識,分別代表終端、電源和探頭;Loglength和LogContent分別代表日志長度和日志內(nèi)容;LogType代表日志的類型或者等級。
雖然日志合并能夠很大程度上減少服務(wù)器由于日志請求帶來的高并發(fā)量,但是,日志合并需要等待多條日志才能進行合并處理,降低了日志的實時性。為了保證部分關(guān)鍵的日志能夠?qū)崟r發(fā)送到服務(wù)器,對日志內(nèi)容按照事件的嚴重程度進行了分級。管道是一種進程間通信機制,對于嚴重級別高的日志通過管道機制直接發(fā)往終端日志采集器,由終端日志采集器對日志進行處理后直接發(fā)往服務(wù)器;對于實時性要求不高的日志內(nèi)容,存儲在數(shù)據(jù)處理終端的持久化存儲設(shè)備中。終端日志采集器每隔一定的時間從持久化存儲設(shè)備中讀取一定量的日志進行合并處理后再發(fā)往服務(wù)器。國外成熟的系統(tǒng)軟件,都對日志和告警進行了分級定義,以syslog為例,將日志分為八種安全級別,分別為緊急、告警、嚴重、錯誤、警告、通知、信息和調(diào)試[15];借鑒于syslog的日志分級方式和對多分量地震監(jiān)測預(yù)測系統(tǒng)AETA的業(yè)務(wù)需求分析,將日志內(nèi)容分為5個級別,如表3所示。
表3 多分量地震監(jiān)測預(yù)測系統(tǒng)AETA五種日志級別的含義
對于日志級別為0-1的日志內(nèi)容,日志一旦產(chǎn)生,數(shù)據(jù)處理應(yīng)用程序?qū)⑼ㄟ^管道機制將日志信息直接傳遞給終端日志采集器。終端日志采集器接收到級別為0-1的日志,將日志按照約定的規(guī)范處理好后直接發(fā)往服務(wù)器。系統(tǒng)在接收到此類日志后,通過短信、郵件等方式將信息傳遞給運維人員,同時用紅色大字傳遞到運維人員辦公電腦,并發(fā)出警告聲音提醒運維人員進行處理;對于2-3級的日志數(shù)據(jù)則不保證日志的實時性。數(shù)據(jù)處理應(yīng)用程序在產(chǎn)生2-3級的日志后,先將日志數(shù)據(jù)記錄到持久化存儲設(shè)備中,然后由終端日志采集器周期性地從持久化存儲設(shè)備中讀取日志數(shù)據(jù)進行合并后再發(fā)往服務(wù)器,系統(tǒng)在接收到此類日志后直接錄入數(shù)據(jù)庫,不做報警提示。圖4是持久化存儲設(shè)備中的日志文件目錄結(jié)構(gòu),按天創(chuàng)建日志文件夾,文件夾內(nèi)文件名按序列號從001開始命名,每小時加1,每天最多24,每個小時內(nèi)的日志寫入同一個文件內(nèi)。對于每一個日志文件都有相對應(yīng)的index文件,詳細記錄了每條日志數(shù)據(jù)的地址、長度和讀取標(biāo)志,用來描述日志文件中日志數(shù)據(jù)的讀取位置,是否已讀等信息;對于第4級日志,只有在軟件調(diào)試、問題定位的時候才會打開,設(shè)備正常運行時關(guān)閉,軟件將不會產(chǎn)生級別為4的日志,從而節(jié)省存儲空間和處理時間。
圖4 持久化存儲目錄結(jié)構(gòu)
日志數(shù)據(jù)匯聚層部署在阿里云服務(wù)器,既要完成系統(tǒng)業(yè)務(wù)數(shù)據(jù)的匯集,也要完成日志數(shù)據(jù)的匯集,其中系統(tǒng)業(yè)務(wù)數(shù)據(jù)又包括電磁數(shù)據(jù)、地聲數(shù)據(jù)、數(shù)據(jù)處理終端狀態(tài)數(shù)據(jù)。如圖2所示,日志數(shù)據(jù)匯聚層主要有任務(wù)管理功能和數(shù)據(jù)分揀功能。
任務(wù)管理功能又分三個子功能:任務(wù)分揀功能、任務(wù)調(diào)度功能和任務(wù)管理功能。任務(wù)分揀功能定期訪問持久化存儲獲取新任務(wù),解析任務(wù)為子任務(wù)或者命令,然后將任務(wù)或者命令分類(可按照業(yè)務(wù)分類或者其他)。任務(wù)調(diào)度功能接收任務(wù)分揀中心解析分類后的任務(wù)或者命令,根據(jù)系統(tǒng)的資源或者設(shè)備狀態(tài)調(diào)度任務(wù),并將調(diào)度后的任務(wù)輸入任務(wù)隊列。任務(wù)管理功能響應(yīng)數(shù)據(jù)處理終端的任務(wù)請求,為數(shù)據(jù)處理終端返回需要完成的任務(wù)。
數(shù)據(jù)分揀功能主要完成系統(tǒng)業(yè)務(wù)數(shù)據(jù)和日志數(shù)據(jù)的接收、分類和入庫。圖5為數(shù)據(jù)分揀功能邏輯架構(gòu)。
數(shù)據(jù)分揀功能按照數(shù)據(jù)類型的不同分為不同的業(yè)務(wù)類別,其中電磁和地聲數(shù)據(jù)簡稱為D類業(yè)務(wù),數(shù)據(jù)處理終端狀態(tài)數(shù)據(jù)簡稱S類業(yè)務(wù),日志數(shù)據(jù)簡稱L類業(yè)務(wù)。如圖5所示,“接待員”模塊用于將各種請求分類和判斷請求是否符合約定。例如,數(shù)據(jù)請求中包含有l(wèi)ogfile的請求被歸類為日志數(shù)據(jù),即L類業(yè)務(wù);數(shù)據(jù)請求中包含datapost的請求被歸類為電磁或者地聲數(shù)據(jù),即D類業(yè)務(wù),對于格式和參數(shù)不符合約定的請求直接返回“result=fail”。
圖5 數(shù)據(jù)分揀功能邏輯架構(gòu)
數(shù)據(jù)分揀功能擬采用四種線程池來完成三種業(yè)務(wù)的處理,預(yù)留線程池是在各類業(yè)務(wù)線程池已經(jīng)超過最大線程數(shù)的情況下,處理優(yōu)先級別高的請求,其中各類線程池的線程數(shù)閾值以及業(yè)務(wù)類別的優(yōu)先級可由運維人員配置。資源調(diào)度模塊負責(zé)為“接待員”發(fā)送來的請求分配線程資源進行處理。以日志類業(yè)務(wù)為例,資源調(diào)度器會根據(jù)日志類線程總數(shù)x1、日志類線程數(shù)閾值n1判斷是否在日志類線程池中建立線程處理此請求中的數(shù)據(jù)。如果x1 數(shù)據(jù)分揀功能對業(yè)務(wù)進行分類并劃分優(yōu)先級,通過資源調(diào)度器分配線程池資源來處理請求,可以在很大程度上避免在大流量情況下服務(wù)器資源耗盡,服務(wù)宕機的現(xiàn)象。 日志數(shù)據(jù)匯集層對合并后的數(shù)據(jù)進行解析并放入入庫隊列。由于日志數(shù)據(jù)不會被高頻訪問,對實時性要求也不高,因此入庫隊列中的日志數(shù)據(jù)會存儲到關(guān)系型數(shù)據(jù)庫MySQL集群中。表4即為關(guān)系型數(shù)據(jù)庫MySQL的數(shù)據(jù)庫表設(shè)計。 表4 MySQL數(shù)據(jù)庫表 在軟件出現(xiàn)故障時,可以通過查詢故障終端在出現(xiàn)故障時間范圍內(nèi)的日志數(shù)據(jù)來定位問題,對于運維人員來說工作量較小。但是,由于數(shù)據(jù)處理終端和傳感探頭通常部署在干擾較小的野外或山洞,電力和網(wǎng)絡(luò)等環(huán)境是設(shè)備正常運行必要條件。因此運維工作除了排查故障外,還需要能夠掌握布設(shè)在外的各臺設(shè)備的運行情況。 對于經(jīng)常斷電重啟、網(wǎng)絡(luò)中斷的區(qū)域,需要及時安排當(dāng)?shù)刂蛋嗳藛T去現(xiàn)場檢修電力和網(wǎng)絡(luò)。面對大量的日志,運維人員如果一條條查看日志來判斷電力或者網(wǎng)絡(luò)環(huán)境是否穩(wěn)定,顯然工作量巨大。因此,采用批處理技術(shù),按日志類型、日志內(nèi)容按天進行統(tǒng)計。運維人員可以通過查詢?nèi)罩緮?shù)據(jù)統(tǒng)計表,快速了解到某臺設(shè)備在某一天或某一段時間內(nèi)的重啟次數(shù)、斷網(wǎng)次數(shù)以及各級別日志的數(shù)據(jù)量。對于地震高風(fēng)險區(qū)域,日志數(shù)據(jù)統(tǒng)計表可以高效地了解該區(qū)域設(shè)備的運行環(huán)境,對于電力、網(wǎng)絡(luò)或者設(shè)備不穩(wěn)定的區(qū)域可以及時進行檢修,保證震前數(shù)據(jù)采集的完整性。 日志數(shù)據(jù)展示層用于向用戶直接展示日志數(shù)據(jù)、告警信息和日志統(tǒng)計信息等。由于日志數(shù)據(jù)存儲層是分布在多個數(shù)據(jù)庫上的,存儲在不同的物理主機上,因此,如何實現(xiàn)對底層多數(shù)據(jù)源訪問的支持,同時達到日志數(shù)據(jù)展示層用戶對底層多數(shù)據(jù)源無感知的效果,是日志數(shù)據(jù)展示層設(shè)計的重要問題。 因此,將日志數(shù)據(jù)展示層劃分為數(shù)據(jù)服務(wù)層和數(shù)據(jù)應(yīng)用層。數(shù)據(jù)服務(wù)層將數(shù)據(jù)應(yīng)用層和日志數(shù)據(jù)存儲層隔離開來,借助數(shù)據(jù)服務(wù)層的代理功能解決上述多數(shù)據(jù)源訪問和透明化的問題。數(shù)據(jù)應(yīng)用層即日志數(shù)據(jù)展示網(wǎng)頁。該網(wǎng)頁的主要功能是使得運維人員在界面友好的網(wǎng)頁端即可完成對日志數(shù)據(jù)、告警信息和日志統(tǒng)計信息的查詢操作。 數(shù)據(jù)服務(wù)層的主體是AETA數(shù)據(jù)訪問中間件。數(shù)據(jù)訪問中間件是平臺應(yīng)用層和持久化存儲層之間的中間代理,所有數(shù)據(jù)應(yīng)用層數(shù)據(jù)請求均經(jīng)過該中間件代理。 數(shù)據(jù)訪問中間件主要包括配置信息服務(wù)aeta_niddleware_AR和數(shù)據(jù)接口服務(wù)aeta_midleware_DS。配置信息服務(wù)提供用戶驗證、權(quán)限查詢等接口,保證數(shù)據(jù)應(yīng)用層應(yīng)用的用戶登陸、權(quán)限控制等基礎(chǔ)功能;數(shù)據(jù)接口服務(wù)是日志數(shù)據(jù)存儲層的對外數(shù)據(jù)接口,向用戶提供統(tǒng)一的數(shù)據(jù)訪問接口。該服務(wù)響應(yīng)數(shù)據(jù)應(yīng)用層的數(shù)據(jù)請求,將對日志數(shù)據(jù)存儲層的操作結(jié)果返回給接口調(diào)用者。數(shù)據(jù)服務(wù)接口aeta_midleware_DS對外提供基于HTTP的訪問接口,代理外部應(yīng)用向數(shù)據(jù)庫的所有操作請求。 該項目基于Spring框架開發(fā),其帶來的依賴注入機制實現(xiàn)了模塊解耦,簡化了開發(fā)流程;持久化框架選擇了MyBatis,該框架依靠XML或注解配置SQL語句,將SQL與程序代碼剝離開來,能很大程度上簡化應(yīng)用對持久化存儲層的訪問過程。配置信息服務(wù)aeta_niddleware_AR的接口技術(shù)方案與數(shù)據(jù)接口服務(wù)aeta_midleware_DS類似。 數(shù)據(jù)應(yīng)用層即日志數(shù)據(jù)展示網(wǎng)頁。日志數(shù)據(jù)展示網(wǎng)頁的總體邏輯結(jié)構(gòu)自底向上,可以分為五層,分別是DTO層、DAO層、Service層和Action層以及表現(xiàn)層。網(wǎng)站的MVC框架選擇了穩(wěn)定的Struts2,未選用數(shù)據(jù)庫持久化框架。DTO層,指Data Transfer Object,即數(shù)據(jù)傳輸對象層;DAO層,指Data Access Object,即數(shù)據(jù)獲取對象層。 由于數(shù)據(jù)服務(wù)層已經(jīng)將所有對日志數(shù)據(jù)存儲層的操作封裝,日志數(shù)據(jù)展示網(wǎng)站的數(shù)據(jù)操作均可通過數(shù)據(jù)服務(wù)層完成。因此DAO層不再負責(zé)與數(shù)據(jù)庫的交互,僅負責(zé)與數(shù)據(jù)服務(wù)層交互的細節(jié)。Service層,基于DAO層提供的數(shù)據(jù)操作能力,為Action層提供必要的業(yè)務(wù)方法支撐。Action層擔(dān)任著MVC結(jié)構(gòu)中的控制器角色,負責(zé)處理用戶特定請求并將結(jié)果轉(zhuǎn)發(fā)到不同的表現(xiàn)層組件。表現(xiàn)層,即MVC框架中的View視圖,由服務(wù)器端的Action層生成,用戶端接收并解析后即可在瀏覽器中展示。表現(xiàn)層的基本頁面使用JSP技術(shù)編寫,頁面渲染基于CSS文件,頁面交互采用了JavaScript技術(shù)。此外,頁面上的部分組件使用到了jQuery和Bootstrap庫。 文中設(shè)計并實現(xiàn)了一套應(yīng)用于多分量地震監(jiān)測預(yù)測系統(tǒng)AETA的日志系統(tǒng),已穩(wěn)定運行1年左右,能夠高效地處理來自250個臺站的日志數(shù)據(jù),運維人員定位故障平均耗時1小時。實踐表明,該系統(tǒng)能夠有效地收集日志數(shù)據(jù)并進行展示,提高了運維人員的工作效率。 在未來的設(shè)計中,可以進一步優(yōu)化數(shù)據(jù)庫的設(shè)計,采用讀寫分離技術(shù),降低數(shù)據(jù)庫的壓力,并使用非關(guān)系型數(shù)據(jù)庫redis或者Hbase等,將關(guān)鍵日志存儲在非關(guān)系型數(shù)據(jù)庫中,提高日志數(shù)據(jù)查詢的效率。3.3 日志數(shù)據(jù)存儲層
3.4 日志數(shù)據(jù)展示層
4 結(jié)束語