
摘要:該文對開源的天兔(Lepus)數據庫監控系統進行深入分析,理清了系統功能各模塊的MVC架構設計。在此基礎上,修改了針對主機操作系統、mongodb數據庫監控的代碼,按照現有架構設計思路,在企業需求基礎上全新開發存儲區域網絡SAN交換設備的監控與告警功能,同時,利用開源hMailServer構建與本系統配套的郵件發送服務,完善了企業內網環境告警郵件發送機制。
關鍵詞:數據庫監控 ?CodeIgniter ?Lepus ?SNMP ?SAN ?hMail
中圖分類號:TP311.5 ? ? ? ? ? 文獻標識碼:A ? ? ? ?文章編號:1672-3791(2021)09(c)-0000-00
Development Practice of Enterprise Database Monitoring System
LIU Junjun
(CHN Energy Zhunneng Group Co., Ltd., Information Center,Ordos,Inner Mongolia Autonomous Region,010300 China)
Abstract: This paper deeply analyzes the open source Lepus database monitoring system, and clarifies the MVC architecture design of the system function. On this basis, the code for monitoring the host OS and mongodb database is modified. According to the existing architecture design ideas, the monitoring and alarm functions of SAN switch equipment in storage area network are newly developed on the basis of enterprise requirements. At the same time, with the open source hmailserver used to build the mail sending system, we improved the alarm sending mechanism of enterprise intranet environment.
Key Words: Database monitoring; CodeIgniter; Lepus; SNMP; SAN; HMail
企業信息化建設發展經歷了從傳統的每個信息系統一套獨立底層基礎硬件到如今統一底層平臺,共享統一虛擬平臺或云平臺的架構。同時企業數據分布也在不斷變化,從最初各個信息系統各自獨立式建設,每個系統一個后臺數據庫,各系統的后臺數據呈現孤島式分布,到企業對各系統數據統一倉庫式存放,并對來自不同信息系統數據綜合分析利用,再到統一數據平臺建設。數據庫的監控維護工作伴隨著企業信息化發展各個階段。企業在未建成統一數據平臺階段,需要一套數據庫監控系統來幫助運維人員掌握企業核心數據庫及底層主機、存儲、SAN網絡的運行狀態,以便在故障發生時,可快速定位故障以恢復業務。
1 Lepus的架構
天兔Lepus是開源的企業數據庫監控系統,其主要功能、軟件結構、數據采集方式、可擴展性這個幾個方面的內容已在筆者另一論文[1]闡述。此文將詳細闡述Lepus的設計架構,并做新的功能開發。從整體看,Lepus數據庫監控系統的軟件設計分兩部分:前端web展示、后端監控數據采集與告警管理(簡稱作業調度)。
1.1 ?Web前端展示
1.1.1 目錄結構
Lepus的Web前端使用PHP框架CodeIgniter[2]設計開發。CodeIgniter簡稱CI,是一種基于MVC[3]模型的應用框架,具有開源免費、輕量級、速度非???、基于段的URL的特性。分段式URL對于人類是友好的,如example.com/index.php/classA/functionA/ID表示調用控制器類classA的functionA函數并傳入參數ID(ID字段可選)。同時CI提供自定義路由控制功能,用戶可在application/config/routes.php文件中配置路由規則自定義特定URI的處理類和函數。CI框架提供豐富的參考類庫,類庫位于system/libraries目錄,如常用的form_validation表單驗證類?;贑I框架的web編碼中,控制器類函數通過使用模型類的方法從后端數據庫查得數據,后將數據傳遞給控制器對應視圖將數據按照視圖定義顯示出來,完成用戶點擊事件驅動下的MVC流程(見圖1)。
Lepus的web應用程序主要目錄分布為:模型類在application\models目錄下,視圖頁面在application\views目錄下,控制器類在application\controllers目錄下,php文件名同類名(控制器類、模型類)一致,視圖php文件與加載該視圖的類名稱一致。
1.1.2 Web登錄與儀表盤
登錄邏輯由控制器login類定義,當打開登錄URL時控制器類login加載視圖目錄下的login.php呈現登錄頁面,點擊頁面登錄按鈕提交用戶登錄信息時控制器login類中index函數對用戶登錄信息核驗,先驗證用戶輸入信息有效性,利用CI框架工具類form_validation相關函數對用戶和密碼兩個域驗證,驗證通過后調用模型user_model類的check_user函數獲得后臺MySQL庫中合法用戶的信息來驗證登錄信息,為進一步提高安全性,用戶密碼在后臺MySQL庫lepus中的admin_user表中使用了md5密文方式存儲,驗證成功跳轉至base_url,即控制器index類的index函數所加載的視圖頁。控制器index類的index函數加載模型lepus_model類,將后臺lepus數據庫db_status表中監控對象狀態信息顯示至視圖頁application\views\index\index.php。登錄中用戶輸入信息的核驗和用戶密碼的md5密文存儲可有效防御SQL注入攻擊[4]和用戶密碼的泄露威脅,提升系統安全性。
登錄后呈現給用戶五部分功能:儀表盤、配置中心、監控內容、告警面板、用戶權限。因用戶在頁面點擊各功能模塊時將驅動對應模塊控制器類加載相應視圖頁,因此需理清各功能模塊MVC類及加載視圖頁面定義。下面簡要介紹各功能MVC類定義及視圖頁面定義情況。儀表盤功能在用戶登錄成功后或已登錄用戶點擊儀表盤菜單時被加載,其MVC類及視圖頁的定義與用戶驗證成功后的頁面跳轉相同。
1.1.3 配置中心
配置中心含兩類功能,一是全局配置,另一是各類監控對象的配置。監控對象分類指mysql、Oracle、mongodb、sqlserver、redis、OS這些類型對象。全局配置功能包括各類監控對象監控開關、監控頻率、告警配置、郵件/短信告警配置。全局配置實現由settings控制器類加載視圖settings\index.php頁面,其間加載模型option_model類,所有全局配置信息保存至lepus數據庫的options表。監控對象配置功能實現各類監控對象添加、編輯、刪除至回收站以及回收站中對象管理各功能。以Oracle監控對象為例,管理Oracle監控對象的功能實現通過控制器類servers_oracle加載views\servers_oracle目錄下頁面實現,如添加Oracle類監控對象則加載add.php頁面,編輯監控對象加載edit.php頁面,依此類推,控制器類中加載模型類servers_oracle_model將所有Oracle類監控對象配置信息保存至lepus數據庫db_servers_oracle表,期間加載位于system/libraries的工具庫form_validation類驗證用戶提交信息的有效性。其他類監控對象配置功能實現與此類似:用XXX代表監控對象,對應的控制器類為servers_XXX,視圖頁面在views\servers_XXX目錄下,加載的模型類為servers_XXX_model,最終配置信息存儲在表db_servers_XXX中。各類監控對象不同僅在監控模型存在差異。
1.1.4 監控對象狀態展示
如對于MySQL有健康監控、資源監控、鍵緩存監控、InnoDB監控、復制監控、表空間分析、慢查詢分析、AWR報告共7項內容,對于Oracle監控僅有健康監控、表空間監控這2項內容,監控模型差異就體現在這里。以Oracle監控展示為例,健康監控功能由模型類lp_oracle的index函數加載views\oracle\index.php實現,此頁面每個監控目標添加了一個超鏈接,鏈接頁面繪制了健康信息圖,即加入時間維度信息以展示過去一段時間監控目標的狀態曲線,健康信息圖由模型類lp_oracle的chart函數加載views\oracle\chart.php頁面實現,表空間監控功能是由模型類lp_oracle的tablespace函數加載views\oracle\tablespace.php頁實現,lp_oracle類加載oracle_model類、os_model類、option_model類、servers_oracle_model類來從lepus數據庫的options表、db_servers_oracle表中查詢得到用戶之前對于監控目標的配置選項,并以此為依據將oracle_status表、oracle_status_history表、oracle_tablespace表、oracle_tablespace_history表中的信息展示在所加載的視圖頁。其他監控對象狀態展示與此類似:XXX對象的YYY功能(除健康監控功能)由模型類lp_XXX的YYY函數加載views\XXX\YYY.php實現,XXX對象健康監控功能由index函數加載index.php頁面實現。
1.1.5 歷史告警展示功能
歷史告警展示即為告警面板模塊告警事件列表功能。告警事件列表是由控制器類alarm的index函數加載views\alarm\index.php頁面實現,由于告警信息較多時需要分頁顯示,因此加載CI工具庫pagination類來對告警信息按照每頁顯示30條的設置分多頁顯示,需展示的歷史告警存于lepus數據庫的alarm_history表,需加載模型類alarm_model取出需展示的告警數據展示于各分頁中。
1.1.6 用戶權限維護
Lepus默認定義了4種角色:Administrator、IT-DBA、IT-Developer、guest_group?;诮巧啥x不同角色用戶,系統默認有admin、guest兩用戶,分屬Administrator、guest_group角色。權限分配針對角色,通過規定是否可訪問菜單項實現權限分配,Administrator角色擁有全部權限的定義及分配權。用戶權限模塊有用戶管理、角色管理、授權管理、菜單管理、權限節點共5項功能,對應控制器類分別為user、role、auth、menu、privilege,加載模型類為user_model、role_model、auth_model、menu_model、privilege_model,數據庫訪問涉及admin_user表、admin_role表、admin_role_privilege表、admin_menu表、admin_privilege表。admin用戶可通過訪問授權管理、菜單管理、權限節點三菜單來開發新的菜單。
1.1.7 語言支持
Lepus支持簡體中文、英文兩種語言。CI框架支持用戶自定義多種語言支持,用戶定義的語言文件存放在application\language目錄下,zh-hans目錄存放簡體中文語言文件,english目錄存放英文語言文件。語言文件中關聯數組$lang存放頁面字符串元素的特定語言字符串。在定義新菜單時,需同時在不同種語言文件中分別增加新菜單的語言定義字符串才能在頁面上正常顯示出菜單內容。
1.2 后端作業調度
1.2.1 后端作業主程序
Lepus后端任務有數據采集作業、告警作業兩類。在后端作業執行環境安裝后,數據采集、告警作業各功能模塊位于程序目錄/usr/local/lepus下。后端各類作業程序啟動通過執行shell腳本/usr/local/lepus/lepus實現,腳本根據程序當前運行情況啟動主程序lepus.py。主程序使用多進程設計,每種數據采集、告警作業任務創建一獨立進程。數據采集、告警進程在一個無限循環中反復執行,執行完一次數據采集任務,則根據配置選項中采集頻率要求休眠一段時間。如前所述,前端Web展示部分已做好Lepus選項配置,配置信息存儲于lepus數據庫的options表,此處,后端數據采集程序將根據options表已有信息來執行各數據采集、告警產生與發送等作業。
1.2.2 數據采集作業
主程序lepus.py啟動一項數據采集作業是通過執行程序目錄下對應作業的python程序實現。啟動XXX類監控目標的數據采集作業則發出python check_XXX.py指令,例如Oracle類目標數據采集作業啟動時會發出python check_oracle.py指令。以Oracle類目標數據采集作業為例,作業主進程P0先將當前各個監控目標的狀態數據從當前狀態表oracle_status、oracle_tablespace轉存到歷史狀態表oracle_status_history、oracle_tablespace_history,同時刪除兩當前狀態表中數據,后從db_servers_oracle表獲得監控目標信息,依次為該類型各監控目標創建一獨立子進程來執行狀態數據采集作業,假設有n個監控目標,則依次創建P1、P2、...、Pi、...、Pn子進程,使用列表plist=[P1、P2、...、Pi、...、Pn]管理各子進程。在Pi子進程中:針對目標i,先嘗試連接目標數據庫,若連接失敗,則在oracle_status表中插入一條監控目標連接狀態為0的數據,若連接成功,則獲取監控目標信息插入db_status表(已有目標信息時跳過此步驟),后通過與監控目標數據庫連接獲得database_status、uptime、version、session_total等信息,在oracle_status表中插入一條附帶上述信息且連接狀態為1的數據,接下來獲得監控目標數據庫表空間信息,如表空間名字、最大可用空間、使用率等信息存入lepus庫oracle_tablespace表,最后關閉數據庫連接。作業主進程P0等待所有子進程執行完畢后,按照option表中frequency_monitor的值休眠若干秒后進入下輪循環。
1.2.3 告警作業
告警作業根據監控目標當前狀態完成告警信息的生成、存儲、發送,與數據采集作業類似,由后端作業主程序通過python alarm.py指令啟動。在監控程序后臺lepus數據庫內,與告警相關的表有3個,分別是alarm_temp、alarm與alarm_history,設計3張表是為了實現配置告警發送休眠時間的功能,即可配置當異常發生時,告警在發送了所配置的特定次數后將休眠特定時間,而非反復發送同類型告警,待休眠時間過去再發送、再休眠,如此往復。alarm_temp表存放當前告警休眠周期內的告警信息摘要,alarm表存放新產生的還沒有發送通知郵件或短信的告警信息,alarm_history表存放歷史告警信息。以Oracle類監控目標為例,在Oracle類目標的一個告警作業循環周期內,首先檢查alarm_temp表中告警在當前時間是否已陳舊并刪除陳舊告警信息,后根據oracle_status表中監控目標狀態信息及db_servers_oracle表中告警配置信息判斷并生成告警,對每個監控目標逐一進行判斷,若目標的連接狀態異常,先檢查alarm_temp表中alarm_type字段不為none的數據條目數來決定是否將此次產生告警信息通過郵件或短信進行發送,具體為通過在信息中將自動send_mail設為1或0來實現,并且將產生的告警信息加入alarm_temp與alarm表,接著更新db_status表中監控目標的連接狀態信息,若目標的連接狀態正常,則先檢查alarm_temp表并刪除其中所有關于監控目標連接狀態異常的告警信息,若刪除了一條及以上告警,則說明監控目標剛從連接異常的狀態中恢復,于是將一條監控目標正常的告警信息加入alarm表,之后檢查數據庫的其他告警點,如總會話數、活動會話數、等待會話數,當這些狀態值超出所配置的critical、warning告警閾值,則生成一條告警信息加入alarm_temp與alarm表,執行類似上述的告警發送與否的判斷過程并更新db_status表監控目標狀態信息,緊接著檢查監控目標表空間狀態并生成告警加入到alarm_temp與alarm表,完成上述準備工作進入到告警郵件或短信的發送過程。告警發送前要將告警信息逐條從alarm表取出,檢查全局告警發送開關與每條告警的send_mail標記,按照配置信息表所配郵件/短信協議信息,編輯告警信息發送,最后將alarm表中告警全部轉移到alarm_history表,再將alarm表清空。
1.3功能修改與開發
1.3.1 OS監控功能修改
OS監控目標無法連接時,主機健康監控頁面會出現多行同一監控目標狀態信息,通過對OS監控后端作業代碼的分析,發現問題出在向os_status表插入目標新狀態前沒有將之前狀態數據先行刪除,針對問題修改,在check_os.sh中增加相應語句可排除問題。
1.3.2 ?mongodb監控功能修改
筆者企業mongodb所用版本為3.2.7,直接使用Lepus對生產環境mongodb目標監控出錯。按照Lepus官方所述安裝pymongo2.7模塊會因認證模式問題無法連接mongodb,需根據服務器環境python版本選擇兼容版本的pymongo,筆者綜合考慮python、mongodb、pymongo三者版本的兼容性,選擇pymongo3.3,經測試可成功實現mongodb類監控目標的認證連接。通過對目標數據庫運行狀態數據分析,將代碼中利用repl['secondary']判斷mongodb實例主從地位的代碼改為使用repl['ismaster']判斷,同時將mappedWithJournal狀態數據查詢代碼去除。通過以上改動,成功利用Lepus對生產環境mongodb目標的監控。
1.3.3 SAN交換機監控功能開發
企業現有SAN[5]設備為博科fabric產品,日常管理中維護人員比較關注設備在線情況、設備端口的光功率情況,因此需設計兩個功能頁面,一個頁面展示所有設備的在線/離線狀態,另一頁面以表格形式展示在線設備的接口光功率信息。需要在前端Web、后端作業分別添加對應功能模塊。前端Web部分,首先要在Web端用戶權限的菜單管理模塊添加配置SAN監控目標、查看SAN監控目標在線狀態、查看SAN監控目標接口光功率等功能的菜單、實現功能的URL(對應MVC框架的控制器類、函數),在權限節點模塊定義權限,在授權管理模塊將定義權限分配給具體用戶,然后在application\language\zh-hans與english目錄中的語言文件中添加菜單對應的語言字符串定義。配置SAN類型監控目標需新建servers_san控制器類、servers_san_model模型類、views\servers_san\index.php等頁面,在lepus數據庫創建db_servers_san表存放目標配置信息。查看SAN監控目標在線狀態及接口光功需新建lp_san控制器類、san_model模型類、views\san\index.php與optical_power.php兩個頁面,在lepus數據庫中創建san_status、san_status_history、san_int_opti_power、san_int_opti_power_history四張表存放監控目標的當前/歷史狀態、接口光功率的當前/歷史值。后端作業部分需要實現SAN監控目標的檢查作業模塊check_san.py,將檢查中采集到的數據填入lepus數據庫的對應狀態表,SAN檢查作業通過SNMP協議獲得設備狀態值,需要先在SAN交換機端配置只讀團體字。再將檢查作業加入到后端作業主程序,最后在告警管理作業中加入SAN監控目標告警信息生成模塊,以便在目標離線、光功率降至臨界值以下時向管理員發送告警郵件或短信。
1.3.4 內網郵件告警的實現
為實現監控告警的及時發送,需要在內網環境配置SMTP服務。選擇內網中有權訪問互聯網的服務器,安裝hMailServer[6],建立test.com域,在域內創建lepus@test.com賬戶,通過此賬戶,可方便地將Lepus告警及時送達管理員的外網郵箱,對于啟用垃圾郵件過濾功能的公網郵箱,可將發送郵件告警的賬戶加入到白名單中。
2 結語
Lepus數據庫監控系統有望成為各類新監控功能的孵化平臺。通過上述分析總結與開發完善工作,可幫助企業建立真正掌握在自己手中的獨立高效、易于維護的基礎設施監控平臺。
參考文獻
[1]劉軍軍.基于Lepus企業數據庫監控系統研究與應用[J].電腦編程技巧與維護,2021(8):95-96,134.
[2]童瑩萍.基于Codeigniter的面向對象程序設計網絡教學平臺設計與研究[J].工業控制計算機,2017,30(12):35-36.
[3]陳帥.基于MVC的NOSS+報表管理系統的設計與實現[D].長春:吉林大學,2020.
[4]孔平凡.Web應用常見安全漏洞分析與防范對策研究[D].武漢:華中科技大學,2018.
[5]奚軍.基于SAN架構的開放式網絡安全數據存儲系統設計[J].現代電子技術,2020,43(15):82-85.
[6]李玉峰.基于hMailServer與SpamAssassin的垃圾郵件過濾服務器的搭建[J].內蒙古農業大學學報:自然科學版,2017,38(1):89-92.
作者簡介:劉軍軍(1982—),男,碩士,工程師,主要從事企業信息基礎設施建設與維護方面的工作。
DOI:10.16661/j.cnki.1672-3791.2110-5042-2373