劉一田,劉士進,郭 偉,何 翔
(南瑞集團公司(國網電力科學研究院),南京 210003)
柔性微服務監控框架①
劉一田,劉士進,郭 偉,何 翔
(南瑞集團公司(國網電力科學研究院),南京 210003)
微服務細化了服務的粒度,針對微服務的監控是微服務管理需要面對的核心問題,以可擴展全鏈路應用服務監控為目標,在已有服務管理層之上設計實現了一種柔性微服務監控框架,用于監控微服務狀態和不斷變化的服務負載,與已有的分布式監控架構相比,這種監控框架靈活度更高,對服務變化的感知能力更強,使用Raft算法增強了數據一致性,避免了單點故障的情況,經試驗分析,代價更小,在實際項目中驗證了框架及方法的有效性.
柔性; 微服務監控; 智能分析告警
微服務的特點決定了應用功能模塊的部署是分布式的,以往在單體架構應用環境下,所有的業務都在同一個服務器上,服務器出現錯誤和異常時可以快速定位和處理問題,但是在微服務的架構下,大部分功能模塊都是單獨部署運行的,彼此通過預先編排的無狀態服務交互,前后臺業務流會經過多個微服務的處理和傳遞,因此,如何實時采集系統及應用服務的訪問及異常信息,根據業務流的錯誤和異常信息統計分析以輔助快速定位問題并告警,靈活可擴展的配置告警,以及能及時跟蹤業務流的處理順序和結果等技術是微服務監控的關鍵所在.
以Zabbix為代表的傳統分布式監控技術更傾向于提供系統級的監控點和指標[1],不能快速定位到系統問題的根本原因.Google公司研發的Dapper[2]分布式跟蹤系統為服務器上每一次發送和接收動作來收集跟蹤標識符和時間戳事件,每次RPC服務調用被稱為一個 Span,用戶的 URL 請求是根 Span A,如果根 Span調用了RPC服務B和C,則B、C為A的子Span,這樣整個請求就被建模為由A為根的Span樹,被稱為一個 Trace.每個 Span 由 trace_id,span_id,parent_id 組成,通過parentId和spanId就可以有序地把所有的關系串聯起來,達到記錄業務流的作用,從而實現端到端的追蹤能力,通過對 Span 計時,可以統計性能數據.但是Dapper只提供調用時間的追蹤,而不提供如錯誤追蹤,業務監控等功能,無法較好滿足業務系統日常業務應用監控的需求.淘寶鷹眼是基于網絡調用日志的分布式跟蹤系統,它可以分析網絡請求在各個分布式系統之間的調用情況,從而得到處理請求的調用鏈上的入口URL、應用服務的調用關系,從而找到請求處理瓶頸,定位錯誤異常的根源位置.同時,業務方可以在調用鏈上設置業務埋點日志,使各個系統的網絡調用與實際業務內容得到關聯.需要一定的代碼植入,且擴展性略差.
本文設計的柔性微服務監控框架結合上述框架各自的典型優勢技術,分別從各方面進行了改進和提升.在數據采集上報組件技術方面,通過應用服務器中間件代理組件,通過業務無侵入的方式提升了采集的定制化能力和可靠性; 在采集數據轉換和合并方面,采用Raft[3]一致性算法,將數據處理后分發到數據存儲和告警服務,確保數據的一致性和準確性; 在告警組件方面,基于配置下發的告警處理策略及可復用的告警策略模板,提高告警的定制化處理能力; 在統計分析組件方面,基于聚類分析算法,對實時和歷史數據進行統計分析,將分析后數據發往消息總線對應的訂閱主題,進行智能告警判定裁決,提高告警準確度; 在監控展示方面,通過配置可視化定制告警參數,支持用戶自定義監控所需的服務指標、JVM等指標,提高監控的自主性.
本文設計的柔性微服務監控框架結構如圖1所示.其主要具備如下特征.

圖1 柔性微服務監控框架結構
(1)架構設計高可用.整個系統無核心單點,易運維,易部署.
(2)低侵入性.盡可能少侵入或者無侵入其他業務系統,對于使用方透明,減少開發人員的負擔.
(3)告警策略靈活和自發現.支持策略模板、模板繼承和覆蓋、多種告警方式、支持回調動作,可以隨時決定所收集數據的范圍和粒度.
(4)支持最大告警次數、告警級別設置、告警恢復通知、告警暫停、不同時段不同閾值、支持維護周期,支持告警合并.
(5)時效性高、擴展性好.從數據的收集和產生,到數據計算處理和最終展現都盡可能快; 生產環境每秒30萬次數據收集、告警、存儲、繪圖,可持續水平擴展.
(6)決策支持.提煉分析數據從DevOps角度并提供決策支持服務.
(7)自助分析儀表板.多維度的數據展示,用戶自定義儀表板等功能,提升更細粒度的用戶自助分析應用體驗.
柔性微服務監控框架的執行流程分為八個步驟,分別介紹如下.
(1)統一配置管理中心統一維護監控和告警策略配置,配置的變更自動發布到消息總線的約定主題上,配置管理支持集群、負載均衡及高可用.
(2)監控策略服務作為監控代理的輔助工具,從消息總線訂閱監控策略配置,監控代理根據監控配置收集微服務狀態信息; 微服務實例從消息總線指定主題訂閱監控代理地址,作為數據上報的地址; 告警判定組件從消息總線訂閱告警策略配置,作為告警的判定依據; 監控策略包括監控告警閾值、特殊定制的采集項,IP白名單等,監控代理將特殊采集項信息上報給監控策略服務.
(3)監控策略服務根據統計信息發布不可用的微服務實例狀態到消息總線指定主題,統一配置管理中心訂閱相應主題后及時更新監控狀態.客戶端代理庫作為微服務中間件代理,應用通過代理將服務埋點、調試、異常等信息采集到監控代理服務實例.
(4)監控代理網關依據監控策略對監控信息進行篩選,將篩選后的數據發布到消息總線指定告警主題.
(5)告警判斷組件和數據存儲和歸檔組件通過一致性哈希數據轉換合并工具將發布的消息通知訂閱到本地進行存儲.
(6)告警判定組件從消息總線訂閱告警策略和微服務統計信息,并依據告警策略和服務統計信息等參數,初步告警加權判定,根據判斷結果告警并以郵件等方式處理.
(7)監控聚類分析組件定時從數據存儲中獲取歷史數據,進行聚類學習和訓練,分析出服務調用的調用鏈等信息,并將分析結果提交給消息總線指定監控主題分發.重復告警判定流程.
(8)監控展示組件支持指定的環境、應用和服務指標配置定制,根據定制參數實時展示監控圖表,實現良好的自助分析效果.
柔性微服務監控框架采用JSON格式的策略模板支持快速配置定義監控和告警策略; 微服務實例的客戶端代理動態獲取代理網關地址,將日志及埋點信息上報給監控代理組件; 監控代理組件根據監控和告警策略,篩選過濾所需的監控統計信息并發布到消息總線指定主題; 告警判定組件從消息總線訂閱告警策略及數據統計信息,形成初步判斷結果并發布到告警通知事件; 數據存儲歸檔組件訂閱的上報數據進行聚類統計分析,聚合結果存儲歸檔并再次發布到消息總線作為告警判斷組件的輸入,同時用戶可通過監控儀表板調用查詢組件監控及自助分析統計指標.根據上述框架的設計,需要實現五個主要關鍵技術組件:(1)高可用的統一配置管理中心.(2)無侵入的微服務實例客戶端代理.(3)高可用及高性能的消息總線.(4)靈活可復用的監控及告警策略模板.(5)聚類分析的統計算法.
(1)高可用統一配置中心
框架采用動態路由的高可用代理及分布式一致性Raft[3]算法作為統一配置中心集群環境下負載均衡、統一配置的一致性及高可用,實現配置管理集群實例在節點故障重啟時對請求透明化.如圖2所示.

圖2 高可用統一配置中心
統一配置管理集群由高可用代理節點對外統一暴露靜態固定端口,而高可用代理本身監控配置管理節點的狀態變更信息,當配置管理節點集群中出現節點不可用、動態擴充配置管理節點等狀況時,高可用代理及時更新路由表.
配置信息的高可用技術基于Raft算法,集群中的節點分為 leader、follower、candidate 三種角色,由leader響應客戶端請求并確保響應結果的一致性.統一配置管理節點集群首先選舉一個leader節點,由leader節點對外提供服務,當配置更新時,leader節點發出命令,并在確保集群中多數節點都已完成命令操作后,返回正確響應給請求對象.如果一個follower在選舉超時的時間周期里沒有收到leader的信息,就進入新的選舉周期,自身轉成候選人candidate角色,給自己投票,發起選舉,并重寫產生leader以繼續提供高可用一致性服務.
(2)無侵入的微服務實例客戶端代理
系統實施監控的方式分為兩類:一類是內嵌式,一類是伴隨式.對大型分布式系統來講,伴隨式是一種更加合適的結構[4].
框架采用伴隨式的中間件劫持技術實現微服務實例的客戶端代理,業務系統應用開發時只需關注業務功能實現.中間件劫持就是將我們自己的代碼行為植入到中間件的各種行為中.實現劫持和監控主要依靠四種關鍵行為:應用啟動,停止,接收請求,響應回復.對JavaEE應用服務器的劫持核心是根據classloader的加載時機,在classloader的樹型層次上獲得優先加載權,從而可以改變這些行為.如圖3所示.

圖3 無侵入的微服務實例客戶端代理
通過中間件劫持技術,全自動的收集微應用實例、微服務實例及服務接口的信息.這些信息包括應用唯一標識、服務名、服務實例的URI、服務接口的URI、服務接口的元數據(類,方法,入參出參,注解,部署描述符)等統計信息.其中,服務類型和方法通過Java的反射方式提取信息; Annotation通過注解掃描工具提取具有相關注解的類,然后通過注解API提取注解信息; 部署描述符通過WebAppClassLoader獲取web.xml,spring-config.xml,log4j.xml等部署描述符文件路徑,然后使用文檔對象模型解析提取關注的標簽信息.最后調用特定服務接口獲取服務實例的內存、CPU等信息,并動態獲取監控代理網關的地址,將統計數據上報給代理網關.
(3)靈活可復用的監控及告警策略模板
框架采用靈活可復用的監控及告警策略模板,以JSON格式描述,如表1所示.

表1 監控策略模板描述
主機域是一組采用相同監控策略機器的集群,監控策略模板支持繼承和策略覆蓋,模板和主機域綁定后,主機下的機器會自動應用該模板的所有策略,節點進出主機域時,相關的模板會自動關聯或者解除.服務上下線不需要手動來變更監控,從而在提高效率的同時降低了遺漏和誤報警.策略模板支持以表達式方式動態添加監控及告警策略,如圖4所示.

圖4 監控及告警策略模板定義
(4)高可用及高性能的消息總線
為了實現在分布式環境下的即時消息通知,并保障消息的高性能傳輸,框架采用高性能分布式消息總線 Apache Kafka[5]組件實現消息的發布/訂閱功能,并使用多個節點組成集群以保障消息總線的高可用.通信模式采用發布/訂閱模式,使消息按照特定的主題甚至內容進行分發,應用程序可以根據主題接收到所需要的消息.發布/訂閱功能使得發送者和接收者之間的耦合關系變得更為松散,發送者和接收者不必關心消息的發送和接收地址,而只是根據消息的主題進行消息的收發.
(5)聚類分析的統計算法
統計分析采集日志的主要目標包括分析服務調用全過程鏈、用戶在導航或瀏覽網站時生成的點擊流或單擊路徑、發生系統宕機之前的事件的日志、用戶在系統關鍵操作順序的事務記錄、根據一段時間內用戶的互動來預測服務取消或其他不良結果的記錄.
框架算法綜合了順序分析、聚類分析方法和Markov鏈分析,以識別數據分類及其順序并進行動態信任決策[6].分析算法的特點之一是使用順序數據,此數據通常表示數據集狀態之間的一系列事件或轉換,如圖5所示.

圖5 聚類分析的統計算法
為了對本文提出的柔性微服務監控框架進行驗證,在一個真實的環境中進行了案例的部署和研究.案例環境由16臺8核8 G內存的PC服務器(HPDL 380 G4 378735-AA1)組成,其中數據庫、微服務實例、監控代理節點、統一配置管理節點、消息總線節點、日志歸檔節點、告警節點比例為1:8:1:2:2:1:1,數據庫和應用服務采用國家電網公司智能運檢系統的測試數據庫和經過拆分的微應用服務,微服務實例以Docker容器形式運行.通過loadrunner模擬并發600用戶的微服務訪問,通過監控策略和告警模板定制統計了服務響應時間超過5秒的URL及異常信息,觀察柔性微服務監控框架的效率和穩定性,評估客戶端代理庫對應用的性能影響,試驗結果如表2所示.

表2 客戶端代理對應用性能的影響
驗證結果表明,柔性微服務監控框架在大并發吞吐量時保證了高可用和高效,但也發現了一些問題,針對小規模的應用現有框架的部署架構略顯復雜,客戶端代理庫會在生產模式下會產生微小的性能損耗,尚有提升空間.目前,柔性微服務監控框架已在國網智能運檢系統中實現并應用,取得了較好的應用效果.
本文研究了傳統分布式系統監控技術及基于服務調用鏈的分布式系統追蹤技術,在此基礎上,設計了柔性微服務監控框架,給出了高可用配置中心、無侵入的微服務實例客戶端代理、靈活可復用的監控告警模板等創新點,闡述了該框架的架構設計及關鍵實現技術.最后,以國網智能運檢系統的微服務應用案例為背景,給出了柔性微服務監控框架的應用驗證評估,驗證結果、效率評估及生產運行實踐表明,該框架提升了分布式系統中微服務監控管理的靈活度、效率和問題定位準確度,提高了電網應用信息系統的服務水平.后續將針對遺留問題持續改進優化該框架.
1Zabbix.Enterprise-class monitoring system.http://www.zabbix.com/functionality.
2Sigelman BH,Barroso LA,Burrows M,et al.Dapper,a largescale distributed systems tracing infrastructure.Google Technical Report dapper-2010-l,2010.
3Ongaro D,Ousterhout J.In search of an understandable consensus algorithm.Proc.of the 2014 USENIX Annual Technical Conference.Philadelphia,PA,USA.2014.305–319.
4劉東紅,郭長國,王懷民,等.監控使能的分布式軟件系統構造方法.軟件學報,2011,22(11):2610–2624.
5Kafka Apache.A distributed streaming platform.http://kafka.apache.org/intro.
6李小勇,桂小林,毛倩,等.基于行為監控的自適應動態信任度測模型.計算機學報,2009,32(4):664–674.
Flexible Microservice Monitoring Framework
LIU Yi-Tian,LIU Shi-Jin,GUO Wei,HE Xiang
(NARI Group Corporation(State Grid Electric Power Research Institute),Nanjing 210003,China)
Microservices refine the granularity of services,and the monitoring of flexible microservices is the core of the microservices management.With the aim of extending the full-link application service monitoring,a flexible microservices monitoring framework is designed and implemented on the existing service management layer to monitor the microservices status and the changing service load.Compared with the existing distributed monitoring architecture,the framework is more flexible,more aware of service changes.The Raft algorithm is used to enhance data consistency and avoid single point failure.The experimental analysis shows that the cost is smaller,and the validity of the framework and the method is verified in the actual project.
flexible; microservices monitoring; intelligent analysis and alarm
劉一田,劉士進,郭偉,何翔.柔性微服務監控框架.計算機系統應用,2017,26(10):139–143.http://www.c-s-a.org.cn/1003-3254/6006.html
國網電力科學研究院科技項目(524606160150)
2017-01-19; 采用時間:2017-02-20