朱 艷,張海龍,冶鑫晨,王 杰,王萬瓊,托乎提努爾,李 嘉,張 萌
(1. 中國科學院新疆天文臺,新疆 烏魯木齊 830011;2. 中國科學院大學,北京 100049;3. 中國科學院射電天文重點實驗室,江蘇 南京 210008)
由于天文觀測的特殊性,望遠鏡觀測臺站與天文數據存儲中心往往相距遙遠,觀測產生的科學數據需要通過專線傳輸到數據中心永久存儲,傳輸的數據專線長期暴露在外會產生多種問題,導致數據傳輸中斷。數據傳輸過程中需要控制系統與詳細的日志系統以便及時發現問題,并在故障修復后重新傳輸數據,若有直觀的展示和可視化管理界面,將極大地方便數據管理員進行數據統計與分析。數據傳輸過程中的日志記錄和之后對日志的分析查詢是天文數據傳輸系統的重要組成部分,也是本文的主要內容。本文以新疆天文臺觀測數據在傳輸過程中遇到的問題為基礎,設計并開發了一套數據傳輸日志系統,實現數據查詢、統計、分析等功能。
文[1-2]研發了下一代歸檔系統[注]https://github.com/ICRAR/ngas(Next Generation Archive System, NGAS),主要目標是處理來自望遠鏡的大數據流,該系統很好地滿足了不斷增長的數據傳輸與管理需要。NGAS提供用戶基于URL命令的接口,支持包括歸檔、檢索在內的幾十個命令。目前,NGAS已經應用在多個數據中心的數據傳輸中,ALMA,MWA,FAST產生的數據已經使用NGAS進行傳輸,目前上海天文臺也計劃使用NGAS進行數據傳輸。
rsync是一款數據鏡像備份工具,可實現本地主機與遠程主機上的文件同步, rsync僅傳送本地與遠程兩個位置的數據差異部分,數據傳輸效率較高[3]。rsync執行日志默認輸出到syslog,支持指定同步日志文件位置和定制日志文件的具體字段。rsync存在記錄日志信息單一的問題,無法滿足海量天文數據傳輸過程中狀態判斷和問題發現,真實的天文數據傳輸過程需要更為詳盡的日志內容。
日志審計跟蹤發生在對象上的活動,在軟件系統中起輔助作用,在滿足需求的情況下應盡量簡單高效。已經存在成熟、優秀的日志系統,如Glog[注]https://github.com/google/glog等,由于框架龐大導致開銷也大[4]。NGAS與rsync都不支持日志多目的地輸出,rsync也不提供日志輪轉功能。日志文件輪轉配置、多目的地輸出、存儲數據按天或按文件夾的統計結果寫入日志文件與數據庫表中等需求都是已有日志系統無法滿足的。
新疆天文臺在南山建有26 m射電望遠鏡,其本部位于南山觀測站以北約100 km。望遠鏡觀測到的原始數據經專線傳輸到新疆天文臺本部進行異地備份[5],本日志系統以rsync軟件工具為基礎。
如圖1,日志系統包括日志收集、存儲、檢索3部分。通過日志收集器進行日志的收集,收集器對本機上觀測數據存儲目錄定時掃描并進行處理,根據配置文件中的數值選擇掃描的間隔時間。存儲服務進程接收到收集器的輸出信息后存儲為數據庫表內容,同時存入日志文件。日志檢索系統根據管理員檢索條件顯示日志信息,控制后臺服務程序(服務的啟動、關閉、重啟等),修改配置文件。

圖1 日志系統結構圖
Fig.1 Log system structure
圖2為日志系統后臺程序實現細節圖。
監控腳本:執行監控任務的腳本,共有兩個監控腳本,彼此監控。
控制腳本:根據配置文件內容,控制各個腳本的輸入參數,如腳本內容的循環間隔等。
監控對象:由檢查更新和數據寫入兩部分組成。檢查更新腳本通過檢測發送接收兩端數據對比來確定是否需要同步數據備份,該腳本只存在接收端日志系統中。數據寫入由文件信息數據和統計信息數據組成。文件信息寫入腳本記錄最新一次存儲目錄掃描后新增的文件信息,統計信息腳本負責統計存儲根目錄與其下的各個文件夾以及每日的增量信息。

圖2 實現細節圖
Fig.2 Implementation details
1.2.1 互相監控體系
shell腳本在Linux系統運行中可能會非正常退出或異常結束,日志系統必須隨時監測保證整套系統正常運行。監控腳本1、監控腳本2、監控對象組成了一個牢固的互相監控體系。監控腳本1與監控腳本2彼此互相監控,監控對象同時被兩個監控腳本監控。監控腳本主要任務是檢查腳本進程的運行狀態,腳本一旦不在進程列表中會被立刻喚醒。這樣的監控體系可以保證監控對象一直處在運行狀態,保證日志系統在無人值守的情況下能夠長時間穩定運行。
1.2.2 Linux 實現
控制腳本需要同時運行多個腳本,就需要啟動多個后臺進程,系統采用在執行腳本命令后加&操作符實現多線程,即:
./script_name.sh &
加&操作符會對SIGINT信號免疫,表示該條命令將在子shell中執行,但該條命令所在終端被關閉,進程也被關閉。實現真正后臺執行應在語句前面加上nohup,對SIGHUP信號免疫,即:
nohup./script_name.sh &
監控對象包含多個腳本,通過shell的多線程技術實現一個控制腳本啟動多個腳本。監控對象內腳本若停止運行將被控制腳本喚醒。
新疆天文臺數據傳輸日志系統的后臺程序由shell腳本組成,日志檢索系統由Qt語言在集成環境Qt Creator內完成。
shell是用戶使用Linux系統的橋梁,接收用戶鍵入的命令并送入內核執行。shell腳本是用shell命令組成的程序,shell作為一種編程語言,也有分支控制結構和循環結構等普通編程語言具有的特點,在Linux上統計信息使用命令組合可以方便得到統計結果。
Qt是一個跨平臺C++圖形用戶界面應用程序開發框架,Qt語言模塊化程度高且可重用性較好,Qt簡化了開發和維護圖形用戶應用程序的任務[6],內部的組件通過Qt特有的信號槽機制通信[7]。
數據傳輸日志系統的日志包括兩部分:(1)記錄數據存儲在本地機器上的處理后的統計日志,稱為普通日志,這種日志以文件形式存儲在以日期命名的log文件中,有數據存入就會產生新日志文件;(2)使用日志檢索系統產生的如登錄、退出系統記錄,界面操作的相關日志,記錄用戶行為軌跡,稱為系統日志,這類日志的命名規則由配置文件決定,配置文件中日志文件輪轉提供大小和時間兩個選項。另外普通日志中的某些信息需要寫入數據庫表中。
(1)普通日志
普通日志寫入文本文件,同時也將某些字段寫入數據庫表中,其輸出格式如下:
[
-e.g.:
[2018-06-04 19:28:22][INFO]/data/2014/2014011871493.342018-04-13 13:30:25
字段意義對應如下:
(2)系統日志
系統日志以文本形式寫入文件,其輸出格式如下:
e.g.:
SYSTEM_LOGIN|2018-06-20 18:23:21|sam|logon|logindialog.cpp|INFO=log into system,SUCCEED
字段含義如下:
(1)文件表(files):記錄每個文件的文件名、文件大小、文件存儲時間、文件最后修改時間、文件的md5值。
(2)天文數據表(data):記錄設備上天文數據的存儲信息,包括數據總量(單位MB)、存儲路徑內數據總個數、存儲時間與最后修改時間(用戶可以設置記錄數據的間隔時間,如2 min)。
(3)文件夾表(folder):記錄存儲路徑根目錄下的各文件夾的數據信息,包括自增字段、文件夾遍歷次數、文件夾名稱、該文件夾下存儲的總數據量、該文件夾包括的數據文件總個數、文件夾記錄時間、文件夾最后修改時間、根目錄下文件夾總個數。
(4)每日數據增量表(dayData):記錄每日天文數據存儲路徑下數據的變化信息,包括自增字段、當日日期、當日增加的數據總量、當日增加的文件總個數、備用字段。
(5)每日文件夾數據增量表(dayFolderData):記錄天文數據存儲路徑根目錄下各文件夾每天數據變化信息,包括自增編號字段、當日日期、文件夾名稱、該文件夾存儲數據總量、該文件夾下存儲文件總個數、該文件夾當日增加的數據總量、該文件夾下當日增加的文件總個數、根目錄下文件夾總個數。
(6)腳本程序監控表(proc_status):記錄后臺腳本程序的運行狀態、4個腳本(分別為寫數據腳本、控制腳本、每日數據統計腳本、rsync數據傳輸腳本)、更新時間。
上述6張表的字段信息如表1。

表1 數據庫表結構Table 1 Database table structure

(續表1)
日志檢索系統主要為系統管理員服務,通過一個友好的操作界面讓使用者更加方便地查詢和操作日志,為了便于控制整套天文數據傳輸日志系統,通過界面控制后臺運行程序開啟、停止或重啟,更改配置文件參數達到控制日志輸出行為的目的。
如圖3,日志檢索系統由4部分組成,分別為普通日志檢索、分類日志查詢、日志備份、參數管理控制。
如圖4,用戶成功登錄后頁面顯示發送端和接收端存儲數據情況,包括兩端的系統狀態和各自存儲的總文件量、總文件數。系統狀態列出磁盤設備已占用空間大小、占用比例、可用空間等信息。

圖3 日志檢索系統結構
Fig.3 Structure of log retrieval system
3.2.1 普通日志檢索(Log Retrievel)
如圖5,普通日志檢索界面展示詳細的文件記錄,包括文件名、文件大小、文件生成時間。支持檢索某一段存儲時間內的記錄,時間可精確到某一天的某一秒,支持關鍵字檢索。關鍵字是文件名或者文件名的一部分,頂部可選擇sender或者receiver按鈕檢索發送端或接收端的數據。底部的backup按鈕支持備份當前檢索的數據到本地默認目錄,備份目錄在Configure頁中修改。

圖4 發送端與接收端數據存儲情況一覽
Fig.4 Summary of data storage at the sender and receiver

圖5 普通日志文件檢索
Fig.5 Ordinary Log file retrieval
3.2.2 分類日志查詢(System Log)
此界面分類顯示系統日志內容,系統日志是指用戶使用日志檢索系統所產生的一系列日志信息。系統日志可查看系統登錄日志與系統操作日志兩類。
圖6展示了系統日志概覽,包括日志分類和各自的數量。如圖7,系統登錄日志記錄每個用戶登入或登出系統的時間、登錄狀態、動作(登入或登出)以及相關描述。如圖8,系統的操作日志詳細記錄了用戶使用本系統的行為軌跡,給出了用戶操作的時間、操作的內容(如查詢操作、備份操作等)、操作的狀態(成功或失敗)和操作的詳細描述。

圖6 日志概覽Fig.6 Log overview

圖7 不同類型日志查詢(登錄日志)
Fig.7 Different types of log queries (logging log)

圖8 不同類型日志查詢(操作日志)
Fig.8 Different types of log queries (operation log)
3.2.3 參數管理控制(Configure)
此界面可以控制后臺服務的啟動、關閉、重啟,對參數進行設置。
圖9系統配置界面,自動顯示已有的參數及參數內容:
OrdinaryLogBackupDir:普通日志遠程備份到本地的默認路徑
SystemLogBackupDir:系統日志備份默認路徑
OrdinaryLogMaxSize:普通日志單個文件最大值,默認值為5 MB,若單個日志文件超過設定的最大值,則將日志寫入另一個新文件中。
OrdinaryLogInterval:寫入日志文件的間隔時間,也就是后臺程序掃描根目錄的間隔時間,默認間隔2 min。
MonitorInterval:后臺程序監控的時間間隔,即檢測后臺各shell程序的運行狀態的間隔時間,默認間隔5 min。
界面中3個checkbox的設置分別對應OrdinaryLogMaxSize,OrdinaryLogInterval和MonitorInterval,更改設置后需點擊restart(重啟)按鈕重啟后臺服務程序。Start與stop按鈕表示后臺服務的開啟和停止。
3.2.4 日志備份(Backup)
此界面分為普通日志備份和系統日志備份兩種,普通日志備份支持數據發送服務器或接收服務器上的日志備份,系統日志備份支持軟件界面的日志備份。
如圖10,系統日志文件備份可備份今天以前、半年前、一年前的本地日志,默認配置頁面的備份路徑;普通日志備份支持用戶選擇的起始日期內的日志文件,包括按每個文件、每個文件夾、存儲路徑根目錄每日變化的所有日志的壓縮打包下載,默認配置頁面中的備份路徑。

圖9 系統配置
Fig.9 System configuration

圖10 日志備份
Fig.10 Log backup
在日志系統的基礎上,通過html5,AJAX,PHP等相關技術建立了數據傳輸可視化頁面,如圖11。可視化頁面上可顯示傳輸系統的工作情況,便于系統管理員及相關人員了解數據的傳輸情況。可視化頁面分為6部分:(1)通過柱狀統計圖顯示當日的數據存入和發送情況;(2)通過柱狀統計圖顯示過去一周的數據情況;(3)通過調用后臺服務器的狀態監控數據,顯示發送服務器與接收服務器的狀態,一旦出現異常會通過警報程序自動發送提醒;(4)通過餅狀圖顯示服務器的存儲情況,管理人員可通過直觀的顯示判斷是否需要增加存儲設備;(5)通過調用日志記錄顯示正在進行的傳輸情況;(6)通過曲線圖顯示過去一小時的數據傳輸速率。

圖11 可視化界面
Fig.11 Visualization page
可視化系統將數據傳輸的日志內容較為直觀地顯示出來,為系統管理員提供了極大的便捷,可輔助判斷系統的運行情況,及時發現系統存在的問題。可視化頁面采用模塊化開發技術,將來可以嵌入到大型觀測裝置的中控系統。
根據新疆天文臺數據傳輸的實際需求,構建了日志收集-存儲服務-日志檢索的日志系統架構,在數據發送服務器與接收服務器上搭建了日志系統的后臺服務程序。提出了腳本程序間互監控系統,完成了數據傳輸中對文件信息、文件md5校驗值記錄的普通日志,與按天、按存儲數據文件夾記錄的統計日志。另外,在數據接收服務器端的系統具有自動檢測數據更新的功能。
日志檢索系統作為客戶端軟件安裝在第三方設備上,軟件讀取配置文件信息,自動連接數據發送服務器端與數據接收服務器端數據庫。實現了按時間、關鍵字檢索兩端遠程服務器日志信息,備份由檢索結果組成的日志信息。查看軟件本地產生的登錄、操作等不同類別日志,壓縮備份本地日志。實現了對服務器兩端配置文件參數修改,提供用戶對服務器兩端系統的啟動、停止、重啟功能。實現了數據傳輸的可視化,通過WEB形式顯示日志內容,可以輔助系統管理員了解傳輸系統的運行狀態,采用模塊化開發技術,便于后期的移植和復用。