王端莊,霍 星,劉 洋,陸 垚
(中國鐵道科學研究院集團有限公司 電子計算技術研究所,北京 100081)
中國鐵路95306貨運電子商務系統(簡稱:鐵路95306)旨在為客戶提供高效便捷的全方位貨運服務,為鐵路貨運需求受理及營銷管理提供基本前提。鐵路95306在提升客戶服務質量、降低社會物流成本、增強鐵路貨運競爭力、推動鐵路貨運市場化改革及促進鐵路貨運又好又快發展等方面發揮著重要作用。因此,實時監控鐵路95306運行狀態,及時發現和解決其運行風險和問題,保障鐵路95306穩定運行,從而確保貨運業務的連續性,對鐵路貨運意義重大[1]。
本文基于鐵路95306日常運行維護(簡稱:運維)監控需求,從業務應用的視角設計鐵路95306運行監控系統(簡稱:運行監控系統),及時、準確、全面地反映鐵路95306的運行狀況,為鐵路95306的運維工作提供有力技術支撐。
運行監控系統采用模塊化分層設計思想,圍繞不同監控目的,設計集中探測、日志采集、數據接入等監控源數據采集組件;根據監控數據的不同存儲、使用需要,設計多元化數據存儲結構;圍繞運行監控業務目標[2],構建微服務應用功能集群。運行監控系統總體架構如圖1所示。
基于不同采集手段設計相應的功能組件,實現對鐵路95306運行數據、關鍵日志數據、網絡流量數據等監控源數據的采集。
采用多種存儲技術手段(包括數據轉換、數據聚合、數據觀測分析等),實現對監控源數據的存儲和處理。
采用微服務技術框架,搭建服務網關,提供統一的訪問服務和接入認證,實現監控告警、運維處置、基礎管理等各類業務功能,滿足鐵路95306日常運行監控需要。同時,應用緩存技術提高運行監控系統整體性能。
采用Vue、ECharts等技術框架,結合Grafana等可視化工具向用戶提供可視化界面,包括各類儀表盤、圖表及報告等。
運行監控系統針對鐵路95306架構特點,以全面、準確反映鐵路95306運行情況、及時發現其隱患并提高運維效率為目標進行功能設計,提供鐵路95306各節點運行狀態、訪問流量、處理性能、核心業務及雙活運行等監控能力,實現鐵路95306故障和風險的及時告警、預警功能,提升鐵路95306應用程序、配置的更新管理和相關故障自動處理能力。運行監控系統功能設計如圖2所示。

圖2 運行監控系統功能
2.1.1 運行狀態監控
提供對鐵路95306業務微服務、技術中間件、后臺任務、平臺即服務(PaaS,Platform as a Service)平臺及關鍵外部依賴服務等健康狀態的實時探測監控;提供對鐵路95306內/外網數據傳輸通道可用性的實時監測;提供對上下游系統關鍵數據共享情況(包括待共享量、積壓量等)的實時監測。
2.1.2 訪問流量監控
提供鐵路95306訪問量、獨立訪客量的監控功能;提供對鐵路95306各應用模塊、各微服務單位時間內請求流量的實時監控功能;提供按應用模塊、統一資源定位器(URL,Uniform Resource Locator)等不同粒度對鐵路95306請求量、訪問客戶端、響應時間等的監控分析能力;支持按照內、外部用戶等不同用戶類型,PC端、移動端等不同渠道進行多維度的流量監控分析,實現訪問流量的全鏈路跟蹤;提供慢響應、錯誤響應、惡意訪問等異常流量的甄別分析和監控功能。
2.1.3 處理性能監控
提供鐵路95306網站及移動端關鍵頁面加載時間、關鍵功能響應時間的監控功能;提供鐵路95306后臺任務執行時間的統計和效率分析,實現鐵路95306相關慢結構化查詢語言數據庫(SQL,Structured Query Language server database)的監控統計;提供鐵路95306文件等數據可用存儲空間的監控;提供對鐵路95306運行日志的統計分析能力,實現基于分析結果發掘、提示系統潛在風險的功能。
2.1.4 核心業務監控
提供鐵路95306核心業務運行情況的監控和預警功能,及時反映鐵路貨運全流程業務運行服務狀況;提供鐵路95306階段運輸需求、日運輸需求、訂箱等關鍵業務提報筆數的實時監控功能;提供單位時間內運單受理及貨物裝、發、到、卸、交付等數據量的監控功能;提供系統簽名、簽章及登錄次數等常用服務使用量的監控功能。
2.1.5 雙活運行監控
配套鐵路95306雙活機制,實現鐵路95306雙活運行監控;提供鐵路95306雙中心流量分布及走向的監控功能;提供鐵路95306運行所需要的結構化數據、文件數據等在兩中心差異情況下的比對監測功能等。
基于監控數據,提供對鐵路95306運行狀態、系統訪問流量、系統處理性能、核心業務及雙活運行等方面各類異常情況的實時告警通知功能;支持對單一事件、多類關聯事件及長期持續事件等復雜場景下形成的異常問題或風險進行告警的能力;提供各類告警閾值條件的分項設置和查詢功能;提供相關告警信息模板內容的編輯維護功能;提供各類應用相關責任人信息的維護管理功能;實現基于短信、郵件及系統通知等方式向相應責任人推送告警信息的功能。
基于鐵路95306日常運維需要,提供相關應用程序集群的一鍵部署和啟停管理功能,實現相關系統運行配置信息的調整發布,實現雙中心應用部署和配置信息的協同管理。
配套鐵路95306雙中心流量路由機制,提供鐵路95306雙中心流量的一鍵調配和切換管理功能,為鐵路95306單中心故障的應急處置提供有效技術保障手段。
基于鐵路95306用戶體系,提供相關服務的權限控制管理功能;提供所有監控對象的信息查詢和維護管理功能;基于標準服務和探測機制實現監控數據的采集匯聚;提供對監控數據分析處理任務的統一配置管理功能。
鐵路95306部署運行涉及的中間件種類繁雜,整體部署節點近千個,且不同模塊部署模式差異性大;此外,鐵路95306提供網站、移動端及微信服務等多種接入渠道,服務接入層級多,流量鏈路長且與上下游系統的對接交互關系復雜。為充分應對和解決以上難點,本文采用集中探測、日志收集、數據接入、數據存儲、告警通知、運維處置及前端展現等技術,實現鐵路95306近千個服務節點健康狀態的實時監測和告警。
基于運行監控系統總體架構對鐵路95306服務節點、部署單元進行全面梳理,形成服務節點清單,完成服務節點的編號、探測信息配置等,構建運行監控系統的集中探測模塊,實現對鐵路95306各類設備設施及業務的實時監測。
集中探測模塊采用集群模式進行部署,同時,基于Redis建立集中化、原子性的序列分配機制,各探測服務程序節點運行過程中動態獲取序列,根據序列值從服務節點清單獲取待探測節點的信息(服務節點編號=序列值mod服務節點清單長度),通過服務節點配置的探測方式及其他探測信息,動態調用相應的探測方法,完成該節點的運行狀況探測,并記錄探測結果信息。基于該探測機制,對既有系統基本沒有侵入性,且探測服務應用具有很好的線性擴展能力[3],簡單增加集群數量即可顯著提升探測效率。集中探測模塊實現邏輯如圖3所示。

圖3 集中探測模塊實現邏輯
針對鐵路95306各場景的探測方式選擇如下。
(1)業務應用:均采用HTTP方式調用業務應用專門的監控監測接口或能反映其運行狀態的其他服務接口進行探測。
(2)中間件:根據中間件類型采用HTTP或集成其連接客戶端方式實現可連接性、可用性的探測,或基于Telnet方式簡單探測其存活性。
(3)專項設備:對于鐵路95306中部署的外系統前置服務器及相關安全設備,采用Ping、Telnet方式實現其存活性的探測[4]。
(4)PaaS平臺、大數據平臺等復雜軟件:集成相應軟件開發工具包(SDK, Software Development Kit)實現對其核心組件運行狀態及可用性的探測。
(5)核心業務數據:鐵路95306中核心業務數據均采用關系型數據庫進行存儲,通過簡單SQL語句實現對核心業務數據變化量的探測。
鐵路95306基于Nginx中間件,結合NJS(Nginx JavaScript)構建流量路由管控模塊,承載鐵路95306內、外網訪問流量的接入和路由,實現雙中心流量的轉發控制,該模塊運行日志的收集是分析鐵路95306整個訪問流量、雙中心流量等的重要前提和手段;另外,鐵路95306內、外網均結合三方工具或組件構建部署了關鍵的應用模塊(如安全平臺代理程序、電子簽章軟件等),其運行日志同樣對鐵路95306整體運行狀況的監控和分析起到重要作用,但尚未納入鐵路95306日志歸集平臺。運行監控系統需要通過在目標服務器部署代理程序的方式實現對該部分日志的實時收集[5]。日志收集模塊實現邏輯如圖4所示。

圖4 日志收集模塊實現邏輯
日志收集程序基于Spring框架條件配置原理,在程序啟動階段自動識別所部署的網絡環境、服務器環境,實現采集日志類型、文件位置、數據接入通道路徑等配置信息的配套創建和加載,解決代理程序部署環境差異帶來的影響,實現一次打包即可在各類環境部署,便捷化程序本身的運維管理。
同時,日志收集程序實現日志文件的按行高效讀取,在服務器本地準實時地記錄日志讀取位置,支持程序中斷重啟后對日志文件的接續讀取。根據鐵路95306相關應用的標準化日志輸出格式,在日志收集程序中實現對日志的按行解析、結構化轉化和少量簡單的擴展處理,為后續日志信息的多維度監控、分析提供前提保障。
運行監控系統數據接入模塊按照接收、緩沖和消費分層進行設計。
(1)數據接收層:為數據源采集程序提供高效的API接口,實現監控數據的接收,并在數據寫入緩沖層后立即進行響應,保障采集程序傳遞數據的效率。
(2)數據緩沖層:通過消息隊列實現,為接收層提供高效的寫入性能,實現數據采集和數據存儲之間的解耦;同時,為監控數據的數據庫寫入提供緩沖作用。
(3)數據消費層:提供可線性擴展的數據消費能力,完成緩沖層數據向數據庫的推送寫入,并根據需要在數據消費過程中完成數據的轉換、包裝;提供數據觀測過濾機制,便于集成告警通知等程序完成對監控數據的實時觀測、識別和過濾。
運行監控系統采用MongoDB數據庫的固定集合存儲各類運行日志[6]、探測結果信息等時序數據。對每一類日志采用獨立的集合進行存儲,結合日志量和留存周期設置合適的集合大小。基于MongoDB固定集合機制,實現監控過程中時序數據的高效插入和讀取,同時避免了歷史數據的定期處理等問題;基于MongoDB副本集等特性,保障監控數據的高可用性和易擴展性。
運行監控系統采用PostgreSQL存儲各類聚合分析結果及其他運行監控相關關系型數據,構建監控數據聚合處理任務,實現對監控數據的準實時聚合分析,并將分析結果進行存儲,使監控數據更加直觀、立體、易用,同時彌補了序列化數據存儲周期較短的問題。
運行監控系統自定義研發系統異常發現規則,采用觀測器的形式進行封裝,通過在監控數據采集、數據分析環節集成,實現對服務節點探測信息、日志聚合分析信息的觀測和識別,基于異常發現規則及時捕捉系統異常發生、恢復等情況。告警通知模塊為各類告警源提供統一的告警信息接入應用程序接口(API,Application Programming Interface)基于Spring框架Event信息傳遞機制,實現松耦合、易擴展的告警、通知處理流程[7]。告警通知模塊實現邏輯如圖5所示。

圖5 告警通知模塊實現邏輯
(1)告警信息標準化:對多種類型的告警信息按照告警級別、業務類型、告警對象等進行格式化分類處理,并按照標準形式發布告警事件。
(2)告警處理引擎:監聽并接收告警事件,通過告警規則匹配、聚合告警信息,實現多類告警信息的聯合處理,生成最終向用戶展現的告警內容;同時,結合通知規則生成通知信息,按照標準形式發布通知事件。
(3)通知服務:監聽并接收通知事件,針對系統通知、短信、郵件及三方接口等多種通知方式注冊不同類型的事件監聽器,根據通知規則完成相應方式的告警通知。
通過運維處置模塊實現所納管應用程序部署信息的管理,采用專門的服務器部署運維處置模塊程序,實現其與納管應用服務器之間的SSH(Secure SHell)端口連通;基于Linux遠程拷貝命令實現程序包、配置信息等文件向對應服務器的分發功能;結合日常運維工作經驗,在相應服務器中預置相關的管理腳本,通過運維處置模塊程序遠程調用相關Shell腳本實現相關應用的統一管理[8]。
通過預置相關故障應對處理規則,基于運行監控結果,設計對相關系統故障的自動處理機制(如基于服務節點探測結果,持續一定時間內探測發現運行異常時,自動對該節點進行重啟操作),一定程度補強鐵路95306的故障自愈能力。
采用Vue、ECharts等技術框架結合Grafana等可視化工具進行前端展現界面的構建。
按照鐵路95306統一界面風格進行運行監控系統相關管理、交互類界面的研發,采用iframe方式嵌入Grafana相關監控面板;在Grafane中配置監控數據源,基于配置方式高效實現美觀、豐富的監控展現界面,簡化前端開發工作量。
使用Nginx進行前端靜態資源的部署和Grafana界面的代理訪問,同時關閉Grafana自身的認證機制,依賴鐵路95306認證服務實現對Grafana監控面板的訪問認證,從而實現運行監控系統與鐵路95306用戶體系、鑒權認證機制等的融合。
本文設計的運行監控系統部分功能已應用于鐵路95306生產運維實踐中,證明了系統在實際運用中的有效性和可靠性。
運行監控系統采用直觀的可視化效果和音頻效果提供了相關內容的監控告警功能,包括提供鐵路95306近千個服務節點健康狀態的實時監測和告警,且可在1 min內完成所有服務節點的探測;提供鐵路貨運階段運輸需求、日運輸需求及運單等信息向后置生產作業系統共享情況的實時監控;實現不同網絡環境下近百個應用節點運行日志的收集,目前,日志收集延時可達到5 s以內。
運行監控系統為一線運維及監控值班人員發現系統問題、處理解決問題、防止故障的進一步擴大提供了有效的支撐手段。其運維處置模塊多次在鐵路95306大型施工、維護過程中,有計劃地完成雙中心流量切換,實現了施工過程對業務服務的零影響。應用表明,運行監控系統大幅提高了鐵路95306日常故障處理能力和處置效率,最大程度保障了業務的連續性。
本文設計并實現了鐵路95306運行監控系統,從多個維度及時、準確、全面地反映了鐵路95306的運行狀況,為鐵路95306的運維工作提供有力技術支撐,運用效果良好,滿足了實際生產運行需要。
此外,運行監控系統相關功能設計和關鍵技術實現具有較強的普適性,具備在其他相似系統推廣使用的可行性。下一步,將持續優化運行監控系統,提高監控效率,并結合機器學習、大數據分析等技術[9],實現更加豐富、智能的運行監控功能,推動鐵路95306運維的自動化和智能化發展。