
摘要:該文對開源的天兔(Lepus)數據庫監(jiān)控系統進行深入分析,理清了系統功能各模塊的MVC架構設計。在此基礎上,修改了針對主機操作系統、mongodb數據庫監(jiān)控的代碼,按照現有架構設計思路,在企業(yè)需求基礎上全新開發(fā)存儲區(qū)域網絡SAN交換設備的監(jiān)控與告警功能,同時,利用開源hMailServer構建與本系統配套的郵件發(fā)送服務,完善了企業(yè)內網環(huán)境告警郵件發(fā)送機制。
關鍵詞:數據庫監(jiān)控 ?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
企業(yè)信息化建設發(fā)展經歷了從傳統的每個信息系統一套獨立底層基礎硬件到如今統一底層平臺,共享統一虛擬平臺或云平臺的架構。同時企業(yè)數據分布也在不斷變化,從最初各個信息系統各自獨立式建設,每個系統一個后臺數據庫,各系統的后臺數據呈現孤島式分布,到企業(yè)對各系統數據統一倉庫式存放,并對來自不同信息系統數據綜合分析利用,再到統一數據平臺建設。數據庫的監(jiān)控維護工作伴隨著企業(yè)信息化發(fā)展各個階段。企業(yè)在未建成統一數據平臺階段,需要一套數據庫監(jiān)控系統來幫助運維人員掌握企業(yè)核心數據庫及底層主機、存儲、SAN網絡的運行狀態(tài),以便在故障發(fā)生時,可快速定位故障以恢復業(yè)務。
1 Lepus的架構
天兔Lepus是開源的企業(yè)數據庫監(jiān)控系統,其主要功能、軟件結構、數據采集方式、可擴展性這個幾個方面的內容已在筆者另一論文[1]闡述。此文將詳細闡述Lepus的設計架構,并做新的功能開發(fā)。從整體看,Lepus數據庫監(jiān)控系統的軟件設計分兩部分:前端web展示、后端監(jiān)控數據采集與告警管理(簡稱作業(yè)調度)。
1.1 ?Web前端展示
1.1.1 目錄結構
Lepus的Web前端使用PHP框架CodeIgniter[2]設計開發(fā)。CodeIgniter簡稱CI,是一種基于MVC[3]模型的應用框架,具有開源免費、輕量級、速度非常快、基于段的URL的特性。分段式URL對于人類是友好的,如example.com/index.php/classA/functionA/ID表示調用控制器類classA的functionA函數并傳入參數ID(ID字段可選)。同時CI提供自定義路由控制功能,用戶可在application/config/routes.php文件中配置路由規(guī)則自定義特定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函數所加載的視圖頁??刂破鱥ndex類的index函數加載模型lepus_model類,將后臺lepus數據庫db_status表中監(jiān)控對象狀態(tài)信息顯示至視圖頁application\views\index\index.php。登錄中用戶輸入信息的核驗和用戶密碼的md5密文存儲可有效防御SQL注入攻擊[4]和用戶密碼的泄露威脅,提升系統安全性。
登錄后呈現給用戶五部分功能:儀表盤、配置中心、監(jiān)控內容、告警面板、用戶權限。因用戶在頁面點擊各功能模塊時將驅動對應模塊控制器類加載相應視圖頁,因此需理清各功能模塊MVC類及加載視圖頁面定義。下面簡要介紹各功能MVC類定義及視圖頁面定義情況。儀表盤功能在用戶登錄成功后或已登錄用戶點擊儀表盤菜單時被加載,其MVC類及視圖頁的定義與用戶驗證成功后的頁面跳轉相同。
1.1.3 配置中心
配置中心含兩類功能,一是全局配置,另一是各類監(jiān)控對象的配置。監(jiān)控對象分類指mysql、Oracle、mongodb、sqlserver、redis、OS這些類型對象。全局配置功能包括各類監(jiān)控對象監(jiān)控開關、監(jiān)控頻率、告警配置、郵件/短信告警配置。全局配置實現由settings控制器類加載視圖settings\index.php頁面,其間加載模型option_model類,所有全局配置信息保存至lepus數據庫的options表。監(jiān)控對象配置功能實現各類監(jiān)控對象添加、編輯、刪除至回收站以及回收站中對象管理各功能。以Oracle監(jiān)控對象為例,管理Oracle監(jiān)控對象的功能實現通過控制器類servers_oracle加載views\servers_oracle目錄下頁面實現,如添加Oracle類監(jiān)控對象則加載add.php頁面,編輯監(jiān)控對象加載edit.php頁面,依此類推,控制器類中加載模型類servers_oracle_model將所有Oracle類監(jiān)控對象配置信息保存至lepus數據庫db_servers_oracle表,期間加載位于system/libraries的工具庫form_validation類驗證用戶提交信息的有效性。其他類監(jiān)控對象配置功能實現與此類似:用XXX代表監(jiān)控對象,對應的控制器類為servers_XXX,視圖頁面在views\servers_XXX目錄下,加載的模型類為servers_XXX_model,最終配置信息存儲在表db_servers_XXX中。各類監(jiān)控對象不同僅在監(jiān)控模型存在差異。
1.1.4 監(jiān)控對象狀態(tài)展示
如對于MySQL有健康監(jiān)控、資源監(jiān)控、鍵緩存監(jiān)控、InnoDB監(jiān)控、復制監(jiān)控、表空間分析、慢查詢分析、AWR報告共7項內容,對于Oracle監(jiān)控僅有健康監(jiān)控、表空間監(jiān)控這2項內容,監(jiān)控模型差異就體現在這里。以Oracle監(jiān)控展示為例,健康監(jiān)控功能由模型類lp_oracle的index函數加載views\oracle\index.php實現,此頁面每個監(jiān)控目標添加了一個超鏈接,鏈接頁面繪制了健康信息圖,即加入時間維度信息以展示過去一段時間監(jiān)控目標的狀態(tài)曲線,健康信息圖由模型類lp_oracle的chart函數加載views\oracle\chart.php頁面實現,表空間監(jiān)控功能是由模型類lp_oracle的tablespace函數加載views\oracle\tablespace.php頁實現,lp_oracle類加載oracle_model類、os_model類、option_model類、servers_oracle_model類來從lepus數據庫的options表、db_servers_oracle表中查詢得到用戶之前對于監(jiān)控目標的配置選項,并以此為依據將oracle_status表、oracle_status_history表、oracle_tablespace表、oracle_tablespace_history表中的信息展示在所加載的視圖頁。其他監(jiān)控對象狀態(tài)展示與此類似:XXX對象的YYY功能(除健康監(jiān)控功能)由模型類lp_XXX的YYY函數加載views\XXX\YYY.php實現,XXX對象健康監(jiān)控功能由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角色。權限分配針對角色,通過規(guī)定是否可訪問菜單項實現權限分配,Administrator角色擁有全部權限的定義及分配權。用戶權限模塊有用戶管理、角色管理、授權管理、菜單管理、權限節(jié)點共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用戶可通過訪問授權管理、菜單管理、權限節(jié)點三菜單來開發(fā)新的菜單。
1.1.7 語言支持
Lepus支持簡體中文、英文兩種語言。CI框架支持用戶自定義多種語言支持,用戶定義的語言文件存放在application\language目錄下,zh-hans目錄存放簡體中文語言文件,english目錄存放英文語言文件。語言文件中關聯數組$lang存放頁面字符串元素的特定語言字符串。在定義新菜單時,需同時在不同種語言文件中分別增加新菜單的語言定義字符串才能在頁面上正常顯示出菜單內容。
1.2 后端作業(yè)調度
1.2.1 后端作業(yè)主程序
Lepus后端任務有數據采集作業(yè)、告警作業(yè)兩類。在后端作業(yè)執(zhí)行環(huán)境安裝后,數據采集、告警作業(yè)各功能模塊位于程序目錄/usr/local/lepus下。后端各類作業(yè)程序啟動通過執(zhí)行shell腳本/usr/local/lepus/lepus實現,腳本根據程序當前運行情況啟動主程序lepus.py。主程序使用多進程設計,每種數據采集、告警作業(yè)任務創(chuàng)建一獨立進程。數據采集、告警進程在一個無限循環(huán)中反復執(zhí)行,執(zhí)行完一次數據采集任務,則根據配置選項中采集頻率要求休眠一段時間。如前所述,前端Web展示部分已做好Lepus選項配置,配置信息存儲于lepus數據庫的options表,此處,后端數據采集程序將根據options表已有信息來執(zhí)行各數據采集、告警產生與發(fā)送等作業(yè)。
1.2.2 數據采集作業(yè)
主程序lepus.py啟動一項數據采集作業(yè)是通過執(zhí)行程序目錄下對應作業(yè)的python程序實現。啟動XXX類監(jiān)控目標的數據采集作業(yè)則發(fā)出python check_XXX.py指令,例如Oracle類目標數據采集作業(yè)啟動時會發(fā)出python check_oracle.py指令。以Oracle類目標數據采集作業(yè)為例,作業(yè)主進程P0先將當前各個監(jiān)控目標的狀態(tài)數據從當前狀態(tài)表oracle_status、oracle_tablespace轉存到歷史狀態(tài)表oracle_status_history、oracle_tablespace_history,同時刪除兩當前狀態(tài)表中數據,后從db_servers_oracle表獲得監(jiān)控目標信息,依次為該類型各監(jiān)控目標創(chuàng)建一獨立子進程來執(zhí)行狀態(tài)數據采集作業(yè),假設有n個監(jiān)控目標,則依次創(chuàng)建P1、P2、...、Pi、...、Pn子進程,使用列表plist=[P1、P2、...、Pi、...、Pn]管理各子進程。在Pi子進程中:針對目標i,先嘗試連接目標數據庫,若連接失敗,則在oracle_status表中插入一條監(jiān)控目標連接狀態(tài)為0的數據,若連接成功,則獲取監(jiān)控目標信息插入db_status表(已有目標信息時跳過此步驟),后通過與監(jiān)控目標數據庫連接獲得database_status、uptime、version、session_total等信息,在oracle_status表中插入一條附帶上述信息且連接狀態(tài)為1的數據,接下來獲得監(jiān)控目標數據庫表空間信息,如表空間名字、最大可用空間、使用率等信息存入lepus庫oracle_tablespace表,最后關閉數據庫連接。作業(yè)主進程P0等待所有子進程執(zhí)行完畢后,按照option表中frequency_monitor的值休眠若干秒后進入下輪循環(huán)。
1.2.3 告警作業(yè)
告警作業(yè)根據監(jiān)控目標當前狀態(tài)完成告警信息的生成、存儲、發(fā)送,與數據采集作業(yè)類似,由后端作業(yè)主程序通過python alarm.py指令啟動。在監(jiān)控程序后臺lepus數據庫內,與告警相關的表有3個,分別是alarm_temp、alarm與alarm_history,設計3張表是為了實現配置告警發(fā)送休眠時間的功能,即可配置當異常發(fā)生時,告警在發(fā)送了所配置的特定次數后將休眠特定時間,而非反復發(fā)送同類型告警,待休眠時間過去再發(fā)送、再休眠,如此往復。alarm_temp表存放當前告警休眠周期內的告警信息摘要,alarm表存放新產生的還沒有發(fā)送通知郵件或短信的告警信息,alarm_history表存放歷史告警信息。以Oracle類監(jiān)控目標為例,在Oracle類目標的一個告警作業(yè)循環(huán)周期內,首先檢查alarm_temp表中告警在當前時間是否已陳舊并刪除陳舊告警信息,后根據oracle_status表中監(jiān)控目標狀態(tài)信息及db_servers_oracle表中告警配置信息判斷并生成告警,對每個監(jiān)控目標逐一進行判斷,若目標的連接狀態(tài)異常,先檢查alarm_temp表中alarm_type字段不為none的數據條目數來決定是否將此次產生告警信息通過郵件或短信進行發(fā)送,具體為通過在信息中將自動send_mail設為1或0來實現,并且將產生的告警信息加入alarm_temp與alarm表,接著更新db_status表中監(jiān)控目標的連接狀態(tài)信息,若目標的連接狀態(tài)正常,則先檢查alarm_temp表并刪除其中所有關于監(jiān)控目標連接狀態(tài)異常的告警信息,若刪除了一條及以上告警,則說明監(jiān)控目標剛從連接異常的狀態(tài)中恢復,于是將一條監(jiān)控目標正常的告警信息加入alarm表,之后檢查數據庫的其他告警點,如總會話數、活動會話數、等待會話數,當這些狀態(tài)值超出所配置的critical、warning告警閾值,則生成一條告警信息加入alarm_temp與alarm表,執(zhí)行類似上述的告警發(fā)送與否的判斷過程并更新db_status表監(jiān)控目標狀態(tài)信息,緊接著檢查監(jiān)控目標表空間狀態(tài)并生成告警加入到alarm_temp與alarm表,完成上述準備工作進入到告警郵件或短信的發(fā)送過程。告警發(fā)送前要將告警信息逐條從alarm表取出,檢查全局告警發(fā)送開關與每條告警的send_mail標記,按照配置信息表所配郵件/短信協議信息,編輯告警信息發(fā)送,最后將alarm表中告警全部轉移到alarm_history表,再將alarm表清空。
1.3功能修改與開發(fā)
1.3.1 OS監(jiān)控功能修改
OS監(jiān)控目標無法連接時,主機健康監(jiān)控頁面會出現多行同一監(jiān)控目標狀態(tài)信息,通過對OS監(jiān)控后端作業(yè)代碼的分析,發(fā)現問題出在向os_status表插入目標新狀態(tài)前沒有將之前狀態(tài)數據先行刪除,針對問題修改,在check_os.sh中增加相應語句可排除問題。
1.3.2 ?mongodb監(jiān)控功能修改
筆者企業(yè)mongodb所用版本為3.2.7,直接使用Lepus對生產環(huán)境mongodb目標監(jiān)控出錯。按照Lepus官方所述安裝pymongo2.7模塊會因認證模式問題無法連接mongodb,需根據服務器環(huán)境python版本選擇兼容版本的pymongo,筆者綜合考慮python、mongodb、pymongo三者版本的兼容性,選擇pymongo3.3,經測試可成功實現mongodb類監(jiān)控目標的認證連接。通過對目標數據庫運行狀態(tài)數據分析,將代碼中利用repl['secondary']判斷mongodb實例主從地位的代碼改為使用repl['ismaster']判斷,同時將mappedWithJournal狀態(tài)數據查詢代碼去除。通過以上改動,成功利用Lepus對生產環(huán)境mongodb目標的監(jiān)控。
1.3.3 SAN交換機監(jiān)控功能開發(fā)
企業(yè)現有SAN[5]設備為博科fabric產品,日常管理中維護人員比較關注設備在線情況、設備端口的光功率情況,因此需設計兩個功能頁面,一個頁面展示所有設備的在線/離線狀態(tài),另一頁面以表格形式展示在線設備的接口光功率信息。需要在前端Web、后端作業(yè)分別添加對應功能模塊。前端Web部分,首先要在Web端用戶權限的菜單管理模塊添加配置SAN監(jiān)控目標、查看SAN監(jiān)控目標在線狀態(tài)、查看SAN監(jiān)控目標接口光功率等功能的菜單、實現功能的URL(對應MVC框架的控制器類、函數),在權限節(jié)點模塊定義權限,在授權管理模塊將定義權限分配給具體用戶,然后在application\language\zh-hans與english目錄中的語言文件中添加菜單對應的語言字符串定義。配置SAN類型監(jiān)控目標需新建servers_san控制器類、servers_san_model模型類、views\servers_san\index.php等頁面,在lepus數據庫創(chuàng)建db_servers_san表存放目標配置信息。查看SAN監(jiān)控目標在線狀態(tài)及接口光功需新建lp_san控制器類、san_model模型類、views\san\index.php與optical_power.php兩個頁面,在lepus數據庫中創(chuàng)建san_status、san_status_history、san_int_opti_power、san_int_opti_power_history四張表存放監(jiān)控目標的當前/歷史狀態(tài)、接口光功率的當前/歷史值。后端作業(yè)部分需要實現SAN監(jiān)控目標的檢查作業(yè)模塊check_san.py,將檢查中采集到的數據填入lepus數據庫的對應狀態(tài)表,SAN檢查作業(yè)通過SNMP協議獲得設備狀態(tài)值,需要先在SAN交換機端配置只讀團體字。再將檢查作業(yè)加入到后端作業(yè)主程序,最后在告警管理作業(yè)中加入SAN監(jiān)控目標告警信息生成模塊,以便在目標離線、光功率降至臨界值以下時向管理員發(fā)送告警郵件或短信。
1.3.4 內網郵件告警的實現
為實現監(jiān)控告警的及時發(fā)送,需要在內網環(huán)境配置SMTP服務。選擇內網中有權訪問互聯網的服務器,安裝hMailServer[6],建立test.com域,在域內創(chuàng)建lepus@test.com賬戶,通過此賬戶,可方便地將Lepus告警及時送達管理員的外網郵箱,對于啟用垃圾郵件過濾功能的公網郵箱,可將發(fā)送郵件告警的賬戶加入到白名單中。
2 結語
Lepus數據庫監(jiān)控系統有望成為各類新監(jiān)控功能的孵化平臺。通過上述分析總結與開發(fā)完善工作,可幫助企業(yè)建立真正掌握在自己手中的獨立高效、易于維護的基礎設施監(jiān)控平臺。
參考文獻
[1]劉軍軍.基于Lepus企業(yè)數據庫監(jiān)控系統研究與應用[J].電腦編程技巧與維護,2021(8):95-96,134.
[2]童瑩萍.基于Codeigniter的面向對象程序設計網絡教學平臺設計與研究[J].工業(yè)控制計算機,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].內蒙古農業(yè)大學學報:自然科學版,2017,38(1):89-92.
作者簡介:劉軍軍(1982—),男,碩士,工程師,主要從事企業(yè)信息基礎設施建設與維護方面的工作。
DOI:10.16661/j.cnki.1672-3791.2110-5042-2373