《微服務設計》閱讀筆記(八) 監控
《微服務設計》,Building Microservices,作者Sam Newman,譯者崔力強、張駿,人民郵電出版社,2016年。
筆記中有些內容直接引用原書。
================================================================
第八章 監控
微服務系統出了問題,要通過服務的監控、日誌的篩選、網路延遲的判斷等各方面去發現問題,要處理的點很多,該如何辦?答案是:監控小的服務,然後聚合起來看整體。
1. 單一服務,單一伺服器
首先監控主機:CPU、內存等。可以使用監控軟體Nagios或者像New Relic這樣的託管服務來幫助監控主機。接著查看伺服器日誌,可以使用命令行工具掃描日誌,使用logrotate移除舊的日誌。最後監控應用程序本身,至少要監控服務響應時間。可以通過查看運行服務的Web伺服器或者服務日誌完成。進一步可以追蹤報告中錯誤出現的次數。
2. 單一服務,多個伺服器
仍然要監控每個主機的資源使用情況,需要聚合各主機的信息來分析,也需要對單個主機信息進行深入分析。可以採用Nagios。對於日誌,如果只有幾個主機,可以用像ssh-multiplexers這樣的工具,在多個主機上運行相同的命令。用一個大顯示屏,運行grep 「Error」 app.log來定位錯誤。對於響應時間,可以在負載均衡器中跟蹤,負載均衡器本身也需要跟蹤。
3. 多個服務,多個伺服器
通過日誌和應用程序指標的集中收集和聚合來定位問題。
4. 日誌,日誌,更多的日誌
可以用logstash,解析多種日誌格式,發送到下游系統。Kibana是基於ElasticSearch查看日誌的系統。
5. 多個服務的指標跟蹤
需要長時間收集系統運行指標,以了解其模式,從而判斷異常。可以用Graphite來方便地從新的主機收集指標,查看聚合後的數據。
6. 服務指標
Linux上安裝collectd並指向Graphite時,會有大量的指標。像Nginx或Varnish這樣的支撐子系統,也會提供很多信息,如響應時間、緩存命中率。對於應用程序,強烈建議公開自己服務的基本標準。這樣可以:了解系統各個功能的使用情況;了解用戶如何使用我們的系統,從而得知如何改進;我們永遠不知道哪些數據是有用的,因此要暴露一切數據,通過指標系統來處理。Codahale的Metrics庫(運行於JVM)可以存儲指標,並能將數據發送給Graphite。
7. 綜合監控
對於系統服務的監控,可以採用合成事務的方式,確保系統行為在語義上的正確性,這種技術因此常被稱為語義監控。創建假事件給系統處理,監控處理行為就是一個合成事務的例子。
實現語義監控。可以採用針對指定服務或整個系統的端到端測試進行語義監控。但要確保測試的數據和實時的數據相匹配,還要確保不會產生副作用。
8. 關聯標識
要能夠像查看堆棧一樣查看由請求引起的調用鏈。可以使用關聯標識(ID),在觸發第一個調用時,生成一個GUID,然後將其傳遞給所有的後續調用,日誌中保存該關聯標識,就能通過查看日誌進行跟蹤。每個服務都應知道傳遞關聯標識。可用Zipkin進行跨多個系統邊界跟蹤調用。Zipkin有點重,需要自定義客戶端並且支持收集系統。傳遞關聯標識需要在所有服務中保持一致,可以通過統一的庫來進行,實現該庫時需要盡量減少其依賴。
9. 級聯
級聯故障很危險,監控系統之間的集成點非常關鍵。每個服務應該追蹤和顯示其下游服務的健康狀態,然後將這些信息匯總,整合到一個畫面。可以用庫實現一個斷路器網路調用,幫助你更優雅地處理級聯故障和功能降級。如JVM上的Hystrix,提供了挺好的監控功能。
10. 標準化
監控領域的標準化很關鍵,可以利用工具,例如提供預配置的虛擬機鏡像,鏡像內置logstash和collectd,還有一個公用的應用程序庫,使其與Graphite容易交互。
11. 考慮受眾
不同的人對於數據進行深入分析的需求不一樣。需要考慮:他們現在需要知道什麼,他們之後想要什麼,他們如何消費數據。定量信息的圖形化顯示可以參考Stephen Few的《Information Dashboard Design: Displaying Data for At-a-Glance Monitoring》一書。
12. 未來
存儲業務指標的系統通常無法直接、實時地訪問,而存儲運營指標的系統卻可以。如果能有通用的事件路由系統,使兩者能聚合用於生成報告,則整體架構會更加簡單。Riemann是一個事件伺服器,允許高級的聚合和事件路由。Netflix開源的Suro類似。聚合的數據可以分發到不同的系統,如Storm、Hadoop或Kibana。
13. 總結
對每個服務:跟蹤請求響應時間、錯誤率和應用程序級指標;跟蹤所有下游服務的健康狀態,如調用時間、錯誤率;標準化如何收集和存儲指標;以標準格式講日誌記錄到一個標準位置;監控底層操作系統。
對系統:聚合CPU等主機層級的指標和程序級指標;確保指標存儲工具可以在系統和服務級別做聚合,也能查看單台主機信息;指標存儲工具允許維護數據足夠長時間,以了解趨勢;使用單個可查詢工具對日誌進行聚合和存儲;強烈考慮標準化關聯標識的使用;了解什麼樣的情況需要行動,並構造警報和儀錶盤;調查對各種指標聚合和統一化的可能性。
更多通用事件處理系統的內容可參考作者的書《Lightweight Systems for Realtime Monitoring》。
BrianZhang:《微服務設計》閱讀筆記(一)微服務BrianZhang:《微服務設計》閱讀筆記(二)演化式架構師BrianZhang:《微服務設計》閱讀筆記(三)如何建模服務BrianZhang:《微服務設計》閱讀筆記(四)集成BrianZhang:《微服務設計》閱讀筆記(五)分解單塊系統BrianZhang:《微服務設計》閱讀筆記(六)部署BrianZhang:《微服務設計》閱讀筆記(七)測試BrianZhang:《微服務設計》閱讀筆記(九)安全BrianZhang:《微服務設計》閱讀筆記(十)康威定律和系統設計BrianZhang:《微服務設計》閱讀筆記(十一)規模化微服務BrianZhang:《微服務設計》閱讀筆記(十二完結篇)總結軟體開發之路推薦閱讀:
※輕鬆理解UML用例圖時序圖類圖的教程
※《微服務設計》閱讀筆記(十)康威定律和系統設計
※並行模式庫PPL應用實戰(一):使用task類創建並行任務
※哈希演算法集合類庫HashLib
※軟體項目開發,全系列規範及約束文件