張華美 陳祥開 龐鑫柏 黃經(jīng)國 黃章榮 洪旭瑜
1) 海南省地震局,海南 海口 570203
2) 新疆維吾爾自治區(qū)地震局, 新疆 烏魯木齊 830011
3) 中國地震臺網(wǎng)中心, 北京 100045
4) 福建省地震局, 福建 福州 350003
保障地球物理站網(wǎng)數(shù)據(jù)的完整性和安全性,是做好防震減災工作的基礎。運維好地球物理站網(wǎng)是極其重要且有意義的工作。
海南地球物理站網(wǎng)有3 個數(shù)據(jù)中心站,1 個區(qū)域中心,共計4 個節(jié)點。2022 年海南地球物理站網(wǎng)在推進數(shù)據(jù)遷移時,將部署在外的服務器節(jié)點,統(tǒng)一遷回海南省地震局的一樓機房。此機房配備雙電流輸入、備用電源、網(wǎng)絡硬件、動環(huán)監(jiān)控等軟硬件設施,符合數(shù)據(jù)服務器部署環(huán)境。海南地球物理站網(wǎng)管理系統(tǒng)是在Suse11 操作系統(tǒng)下部署,數(shù)據(jù)庫采用的是Oracle 10g版本,硬件部署是基于兩臺聯(lián)想SR860 服務器,考慮到系統(tǒng)兼容問題,并兼顧未來發(fā)展國產(chǎn)化系統(tǒng)可變列裝問題,海南地球物理站網(wǎng)采用阿里私有云架構,構建國產(chǎn)化虛擬機平臺,并將數(shù)據(jù)服務器的節(jié)點部署于虛擬機中。目前該平臺已建成并投入使用[1-3]。
應用Django 和Python 技術[4]開發(fā)海南地球物理站網(wǎng)輔助平臺系統(tǒng)(以下簡稱 “輔助平臺” ),可視化的操作[5-6]有助于運維人員落實運維工作時高效有序。根據(jù)運維工作實際,輔助平臺共設計4 大功能模塊,分別為: ① 服務器情況:主要通過頁面獲取并顯示服務器磁盤、數(shù)據(jù)庫和內存的使用情況,有助于運維人員查看軟硬件的現(xiàn)狀; ② 一鍵傳輸:主要將冷備份好的數(shù)據(jù)包,從服務器節(jié)點下載至本地進行二次備份,避免服務器因宕機而丟失數(shù)據(jù),保障數(shù)據(jù)完整性,同時減少使用輔助遠程工具時的重復性操作;③ 一鍵生成報告:主要將每個月的數(shù)據(jù)庫和服務器硬件的使用情況,產(chǎn)出一張Excel 表格報告; ④ 一鍵備份:主要通過按鈕實現(xiàn)前端給后端指令,完成數(shù)據(jù)庫備份。
海南地球物理站網(wǎng)運維,每天檢查一次服務器軟硬件,每周檢查一次數(shù)據(jù)庫,每月至少兩次冷備份,每月將檢查結果整理成Excel 表。這里的每次檢查都需要借助遠程軟件登陸服務器,通過指令查看服務器軟硬件情況。6 臺服務器則需要登陸6 次,重復性動作是6 的倍數(shù)。每次查詢結果,都使用Excel來登記,登陸的服務器密碼,也都整理成Excel 表,每次登陸都得打開查看??此坪唵蔚墓ぷ?,因重復性操作,使得運維起來比較耗時。備份工作也是按照手冊逐步操作,6 臺服務器也就是重復操作6 次。如果服務器增多,重復操作會更多。由于地震行業(yè)設備資源具有異構性、分布性與自治性等特點,既然重復性操作多,那么可使用計算機批處理,使工作變得簡單化,系統(tǒng)化[7-8]。
本研究運用Python 3.8.3 語言基于Django 4.0.4技術開發(fā),數(shù)據(jù)庫使用MySQL 5.7.37 版本。import Python 包有:paramiko,requests,xlwt,os,re,StringIO,BytesIO,datetime,render,cx_Oracle,PyMySQL 等[9]。由于輔助平臺開發(fā)環(huán)境是在內部網(wǎng)絡部署,因此Python 包需要通過其他電腦互聯(lián)網(wǎng)下載包后再上傳至服務器中,方能安裝使用。前端Html 采用免費Vscode 軟件開發(fā),后端使用Virtualenv 虛擬環(huán)境部署開發(fā)環(huán)境。采用Virtualenv 的原因是考慮到在同一臺服務器上,當增加其他項目時,開發(fā)環(huán)境不會因其他項目改變現(xiàn)有環(huán)境,相當于一個獨立生態(tài)圈,有利于后期的運維(圖1)。為了訪問穩(wěn)定,采用Uwsgi 部署應用服務。
圖1 系統(tǒng)結構圖Fig.1 Chart of system structure
系統(tǒng)架構分為3 層:前端、后端和數(shù)據(jù)庫[10-11]。輔助平臺以Python 為基礎語言進行結構設計,使用Virtualenv 虛擬環(huán)境,部署Django 和Uwsgi,其中Django 由App 和Django 文件類組成(圖1),而App 主要由數(shù)據(jù)庫設計models.py、后端處理程序views.py 和靜態(tài)網(wǎng)頁template 組成,Django 則主要由訪問路由url.py 和Django 的配置文件組成,通過url.py 將前端Html 與后端建立連接。業(yè)務通過前端Html 的Ajax 或者JavaScript 調用POST 或GET 方法來響應[12],后端views.py 則處理數(shù)據(jù)層和訪問數(shù)據(jù)庫層。
將Django 部署完畢后,通過在App 層下的models.py 建立數(shù)據(jù)庫表,無需到MySQL 下創(chuàng)建。在models.py下創(chuàng)建數(shù)據(jù)庫表完畢后,執(zhí)行 “python mange.py makemigrations” 和 “python manage.py migrate” 兩條指令,即完成表格的創(chuàng)建。
設計此輔助平臺,共建立了5 張表格:Users,Base_info,Oracle_info,device_info 和do_user (表1),其中Users 表是存儲用戶注冊和登陸;Base_info 表存儲服務器基礎信息參數(shù),主要用于產(chǎn)出Excel 報告所用到的基礎信息;Oracle_info 表存儲地球物理站網(wǎng)數(shù)據(jù)庫Oracle 的表空間參數(shù),也為產(chǎn)出Excel 報告提供參數(shù);device_info 主要存儲服務器的磁盤空間參數(shù);而do_user 用于當執(zhí)行一鍵備份時,前端會彈出再次確認,執(zhí)行此命令需要輸入用戶和密碼,方可執(zhí)行,避免不小心點擊到按鈕[13-15]。
表1 輔助平臺數(shù)據(jù)表Table 1 Auxiliary platform data sheet
輔助平臺主要由4 大模塊組成: ① 服務器情況;② 一鍵傳輸; ③ 一鍵生成報告; ④ 一鍵備份(圖2)。
圖2 功能模塊圖Fig.2 Diagram of functional modules
(1)服務器情況模塊主要由3 部分組成:服務器參數(shù)、磁盤空間和數(shù)據(jù)庫表空間。服務器參數(shù)主要查閱服務器的內存、CPU 和使用的系統(tǒng)情況,展示使用EChart 餅狀圖和表格顯示,并把更新數(shù)據(jù)參數(shù)寫入MySQL 的表Base_info 中;磁盤空間則是查閱服務器的磁盤空間,重點查閱剩余量,使用EChart 餅圖聯(lián)合曲線、表格顯示,并更新數(shù)據(jù)參數(shù)寫入MySQL 表device_info 中;地球物理站網(wǎng)運行的Oracle 數(shù)據(jù)庫表空間讀取出來,并顯示出哪個服務器節(jié)點的數(shù)據(jù)庫表空間最高,便于運維人員做擴容計劃,如果超過70%時,則提醒運維人員,要馬上擴容Oracle 數(shù)據(jù)庫[16-18],并更新數(shù)據(jù)參數(shù)至MySQL 表Oracle_info 中。
(2)一鍵傳輸模塊主要把各節(jié)點已做好冷備份的數(shù)據(jù)包傳輸至移動U 盤,等同于遠程登陸服務器下載數(shù)據(jù)包至本地移動U 盤或者移動硬盤,完成雙重備份。
(3)一鍵生成報告模塊是把一個月的運維檢查工作匯集成一張表格,以表格的形式將檢查的結果下載保存,無需逐個登陸服務器輸入命令查看、登記、計算和匯總,減少重復性登陸和輸入命令,提升工作效率。
(4)一鍵備份模塊主要是遠程登陸服務器,執(zhí)行備份命令,功能有兩個選擇:一種是直接一鍵執(zhí)行各節(jié)點的服務器備份,此命令盡量在夜間執(zhí)行,因為等待時長稍微久一些,從實際工作來看,適合批量備份工作;另一個是以各個節(jié)點的服務器來啟用和關閉,做到有序進行,也是一鍵完成,不需要輸入命令代碼,減少運維人員負擔。
部署開發(fā)環(huán)境極其重要。項目部署在海南省地震局一樓機房服務器,由于禁止互聯(lián)網(wǎng)訪問,所以在部署環(huán)境時,必須要考慮Python 包的安裝問題。在實際項目中,沒有使用PyCharm 軟件做開發(fā)的原因是該軟件不是開源的。此外,當項目從PyCharm 遷移至實體服務器時,編譯因環(huán)境從Windows 變到Linux后,總有Bug 出現(xiàn),需花費大量時間來解決。為了避免此類問題,采用了Virtualenv 虛擬環(huán)境,直接部署在服務器上,等同于圈住開發(fā)環(huán)境,省去后續(xù)運維麻煩。
安裝Python 軟件包的版本必須與之相兼容,而非最新版,否則一些軟件包由于版本過高會產(chǎn)生Bug,甚至根本達不到想要的效果,從而給開發(fā)帶來很大麻煩。
海南地球物理站網(wǎng)輔助平臺系統(tǒng)的設計思路是通過Django 技術進行外圍輔助操作,而不是改變操作,基于此思路,將需求分析模塊化,明確功能目標,從兩方面來獲取數(shù)據(jù)參數(shù):第一從服務器讀取參數(shù),通常運維人員會借用遠程軟件登陸各節(jié)點服務器,通過執(zhí)行指令獲取,現(xiàn)在Django 技術可以通過Python 的一個paramiko 包,模擬用戶遠程登陸,從而執(zhí)行指令代碼,再從指令得出的結果讀取我們想要的數(shù)據(jù),存入創(chuàng)建好的MySQL 數(shù)據(jù)庫表中;另一方面是讀地球物理站網(wǎng)Orcale 數(shù)據(jù)庫表空間,通常我們有3 種方式來查閱數(shù)據(jù)庫表空間: ① 使用 “toad for oracle” 軟件來查閱; ② 遠程登陸到服務器,進入到數(shù)據(jù)庫里,輸入命令查閱; ③ 登陸地球物理管理系統(tǒng)區(qū)域中心查閱表空間,其中第3 種是我們日常工作常用的方法,但是利用此方法獲取的結果,有時候qzdata、system 和sysaux 會顯示串行,有時運維人員會看錯行。此外,還需要逐個看哪個節(jié)點數(shù)據(jù)庫表空間超過70%的使用率,需要及時擴容[19-20]。以任何方式獲取數(shù)據(jù)庫表空間都是可以的,但對于運維人員,更希望只要使用一個軟件,或者一個平臺,就能把所有該干的活都做完即可,最好能一鍵完成。地球物理站網(wǎng)輔助平臺是把所需功能集中在一起,僅需要登陸此平臺一次就可進行運維檢查,包括備份、傳輸、產(chǎn)出Excel 表,重復性的工作交給電腦。為此,項目采用的是Python 里的cx_Oracle 包,模擬登陸數(shù)據(jù)庫,模擬輸入指令,并把結果返回前端oraclehtml.html,有需要的數(shù)據(jù)則寫入MySQL 數(shù)據(jù)庫中,為產(chǎn)出Excel 做準備。常用的代碼是使用paramiko 包,做一個連接服務器的方法getConnectionSSH(),使用時調用該方法即可連接到服務器,而連接服務器的Oracle 方法是用了cx_Oracle 包里的connection()方法,主要是連接Oracle 后,讀取表空間和操作數(shù)據(jù)庫命令sql 時,變得很簡單。
實現(xiàn)一鍵備份時,采用paramiko 模擬登陸服務器,通過命令command= “sh/opt/install/stoprun.sh” 關閉應用端,通過命令command= “sh/opt/install/run.sh”開啟應用端;使用cx_Oracle 包連接Oracle后,通過命令command= “shutdown immediate”、command=“l(fā)snrctl stop” ,關閉數(shù)據(jù)庫和監(jiān)聽,通過命令command=“startup”、command= “l(fā)snrctl start” ,啟動數(shù)據(jù)庫和監(jiān)聽。最后使用paramiko 模擬登陸服務器,執(zhí)行備份指令,結果通過Ajax 和js 交互到前端,便于運維人員查閱備份結果。在備份時,如果運維人員使用“一鍵全部備份” ,則需要再次確認輸入用戶和密碼,以確保操作是明確的一鍵全部備份,而不是誤擊。只要輸入用戶和密碼正確,執(zhí)行備份指令需要調用程序并行操作,以節(jié)省時間。如果運維人員選擇“單個服務器備份” ,就需要點擊彈出是否繼續(xù)的再次確認信息。
一鍵傳輸主要采用paramiko 包模擬SSH 遠程登陸,將指定的備份壓縮包下載至本地,此過程僅需要運維人員輸入本地路徑,考慮到下載至本地的壓縮包,等同于遠程拷貝機制,可以使用并行執(zhí)行。此外,下載進度需要呈現(xiàn)到前端,方便運維人員查閱下載情況。
一鍵產(chǎn)出Excel 報告,是將各節(jié)點服務器的3 大情況,磁盤使用、內存以及數(shù)據(jù)庫表空間使用情況,匯集成一張表。當用戶點擊時,直接調用xlwt 包,制作Excel 表,并把參數(shù)填寫至表格。由于Excel 文件數(shù)據(jù)量不大,因此使用BytesIO 就可以實現(xiàn)傳輸功能。
在實現(xiàn)功能模塊時,最大的難點在于一鍵傳輸。由于輔助平臺是部署在一臺物理機(為了方便區(qū)分,我們暫且稱為物理機1)上,通過物理機1 做業(yè)務邏輯,從其他服務器下載備份壓縮包至本地,而本地不是物理機1 本身,而是運維人員所使用的電腦本地,等同于物理機1 是中轉站,原設想使用BytesIO 去做,發(fā)現(xiàn)壓縮包太大,有些包能達到幾十GB,傳輸大小受限。之后,想到另一個辦法是將所有的文件上傳至物理機1,再下載至本地的邏輯業(yè)務,但問題是壓縮文件過大,集中到物理機1,會使得物理機1 磁盤空間負荷大[21]。又想到另外方案,將壓縮包存入數(shù)據(jù)庫中,本地即可與物理機1 變成點對點的傳輸,可在操作過程中發(fā)現(xiàn)壓縮包需要經(jīng)過兩次傳輸,且數(shù)據(jù)大,等待時間太長,與實際應用效果相差太大。若用C/S 結構開發(fā),就沒什么難點,但用B/S 結構開發(fā),還得考慮資源使用問題,就變得困難了。
最終方案是編寫好點對點傳輸程序,放在運維人員的電腦本地,然后當用戶點擊 “一鍵傳輸” 時,后端執(zhí)行調用本地cmd,執(zhí)行命令程序,這樣就變成了電腦端與各地球物理站網(wǎng)節(jié)點間的傳輸。采用多線程同步傳輸提高工作效率,節(jié)省傳輸時間。
海南地球物理站網(wǎng)輔助平臺系統(tǒng)(圖3),設計之初,源于機構改革后,業(yè)務融合,業(yè)務人員不足,在系統(tǒng)運維方面缺少相關業(yè)務人員,一旦運維人員出差期間正好到了冷備份和查閱管理系統(tǒng)時間點,工作會被滯后。為了保障地球物理站網(wǎng)數(shù)據(jù)的連續(xù)性、完整性和安全性,提升運維工作實效,使運維工作簡單化,研制輔助平臺系統(tǒng)非常必要。沒應用該平臺前,運維人員基本上都會使用遠程軟件來逐個登陸服務器節(jié)點,輸入指令并獲取想要的信息,然后記錄下來,等到月底時再做一個總結,做冷備份也是如此,重復性工作繁多。為了能讓無計算機基礎的同事也知道如何運維,通常會編寫一本運維手冊,運維人員根據(jù)手冊逐個敲打命令行,看似問題解決了,實際上無意間命令行多了一個空格或者*號鍵,都可能會把數(shù)據(jù)庫弄崩。
圖3 海南地球物理站網(wǎng)輔助平臺系統(tǒng)Fig.3 Hainan geophysical station network auxiliary platform system
輔助平臺從登陸端就設定了3 種情況的邏輯判定: ① 密碼不能為空; ② 密碼錯誤; ③ 賬戶不存在,請重新輸入。運維人員登陸后,可以查詢服務器磁盤、內存使用情況和Oracle 數(shù)據(jù)庫表空間使用情況,還可以對服務器的數(shù)據(jù)進行冷備份,冷備份完成后,對備份的數(shù)據(jù)包,進行并行下載。最后,將查詢的結果,通過一鍵生成報告,產(chǎn)出Excel 報告,解放人工查詢,提升工作效率。所有的操作均簡單一鍵完成,業(yè)務的邏輯交給Django 后端運行,使用方便簡單,大大減少運維人員工作量,同時也減少失誤,讓地球物理站網(wǎng)數(shù)據(jù)穩(wěn)定運行[22-26]。
常規(guī)運維方式,會借助各種遠程軟件,逐個遠程登陸服務器,輸入用戶名和密碼,進入系統(tǒng)后以指令的方式查閱情況,到冷備份時,按照手冊步驟,逐個登陸服務器,逐個輸入命令進行備份,重復性操作多,且容易遺漏,甚至會因輸入命令錯誤造成數(shù)據(jù)庫丟失。相比常規(guī)做法,海南地球物理站網(wǎng)輔助平臺系統(tǒng)具有如下特點:
(1)運維的功能在一個輔助平臺上,運維人員只要登陸一次該平臺,即可完成運維的服務器軟硬件和數(shù)據(jù)庫檢查、數(shù)據(jù)庫備份和備份數(shù)據(jù)包下載至移動硬盤等工作;
(2)基本上都是一鍵完成工作,使得重復性工作批量處理;
(3)可視化操作讓運維工作變得簡單化;
(4)輔助平臺基于開源開發(fā),便于推廣部署。