《微服務(wù)設(shè)計(jì)》,Building Microservices孽鸡,作者Sam Newman蹂午,譯者崔力強(qiáng)栏豺、張駿,人民郵電出版社豆胸,2016年奥洼。
筆記中有些內(nèi)容直接引用原書。
================================================================
第八章監(jiān)控
微服務(wù)系統(tǒng)出了問題晚胡,要通過服務(wù)的監(jiān)控灵奖、日志的篩選、網(wǎng)絡(luò)延遲的判斷等各方面去發(fā)現(xiàn)問題估盘,要處理的點(diǎn)很多瓷患,該如何辦?答案是:監(jiān)控小的服務(wù)遣妥,然后聚合起來看整體擅编。
1.單一服務(wù),單一服務(wù)器
首先監(jiān)控主機(jī):CPU箫踩、內(nèi)存等沙咏。可以使用監(jiān)控軟件Nagios或者像New Relic這樣的托管服務(wù)來幫助監(jiān)控主機(jī)班套。接著查看服務(wù)器日志肢藐,可以使用命令行工具掃描日志,使用logrotate移除舊的日志吱韭。最后監(jiān)控應(yīng)用程序本身吆豹,至少要監(jiān)控服務(wù)響應(yīng)時(shí)間±砼瑁可以通過查看運(yùn)行服務(wù)的Web服務(wù)器或者服務(wù)日志完成痘煤。進(jìn)一步可以追蹤報(bào)告中錯(cuò)誤出現(xiàn)的次數(shù)。
2.單一服務(wù)猿规,多個(gè)服務(wù)器
仍然要監(jiān)控每個(gè)主機(jī)的資源使用情況衷快,需要聚合各主機(jī)的信息來分析,也需要對單個(gè)主機(jī)信息進(jìn)行深入分析姨俩≌喊危可以采用Nagios。對于日志环葵,如果只有幾個(gè)主機(jī)调窍,可以用像ssh-multiplexers這樣的工具,在多個(gè)主機(jī)上運(yùn)行相同的命令张遭。用一個(gè)大顯示屏邓萨,運(yùn)行g(shù)rep “Error” app.log來定位錯(cuò)誤。對于響應(yīng)時(shí)間,可以在負(fù)載均衡器中跟蹤缔恳,負(fù)載均衡器本身也需要跟蹤宝剖。
3.多個(gè)服務(wù),多個(gè)服務(wù)器
通過日志和應(yīng)用程序指標(biāo)的集中收集和聚合來定位問題歉甚。
4.日志诈闺,日志,更多的日志
可以用logstash铃芦,解析多種日志格式雅镊,發(fā)送到下游系統(tǒng)。Kibana是基于ElasticSearch查看日志的系統(tǒng)刃滓。
5.多個(gè)服務(wù)的指標(biāo)跟蹤
需要長時(shí)間收集系統(tǒng)運(yùn)行指標(biāo)仁烹,以了解其模式,從而判斷異常咧虎∽跨郑可以用Graphite來方便地從新的主機(jī)收集指標(biāo),查看聚合后的數(shù)據(jù)砰诵。
6.服務(wù)指標(biāo)
Linux上安裝collectd并指向Graphite時(shí)征唬,會有大量的指標(biāo)。像Nginx或Varnish這樣的支撐子系統(tǒng)茁彭,也會提供很多信息总寒,如響應(yīng)時(shí)間、緩存命中率理肺。對于應(yīng)用程序摄闸,強(qiáng)烈建議公開自己服務(wù)的基本標(biāo)準(zhǔn)。這樣可以:了解系統(tǒng)各個(gè)功能的使用情況妹萨;了解用戶如何使用我們的系統(tǒng)年枕,從而得知如何改進(jìn);我們永遠(yuǎn)不知道哪些數(shù)據(jù)是有用的乎完,因此要暴露一切數(shù)據(jù)熏兄,通過指標(biāo)系統(tǒng)來處理。Codahale的Metrics庫(運(yùn)行于JVM)可以存儲指標(biāo)树姨,并能將數(shù)據(jù)發(fā)送給Graphite摩桶。
7.綜合監(jiān)控
對于系統(tǒng)服務(wù)的監(jiān)控,可以采用合成事務(wù)的方式娃弓,確保系統(tǒng)行為在語義上的正確性典格,這種技術(shù)因此常被稱為語義監(jiān)控岛宦。創(chuàng)建假事件給系統(tǒng)處理台丛,監(jiān)控處理行為就是一個(gè)合成事務(wù)的例子。
實(shí)現(xiàn)語義監(jiān)控⊥烀梗可以采用針對指定服務(wù)或整個(gè)系統(tǒng)的端到端測試進(jìn)行語義監(jiān)控防嗡。但要確保測試的數(shù)據(jù)和實(shí)時(shí)的數(shù)據(jù)相匹配,還要確保不會產(chǎn)生副作用侠坎。
8.關(guān)聯(lián)標(biāo)識
要能夠像查看堆棧一樣查看由請求引起的調(diào)用鏈蚁趁。可以使用關(guān)聯(lián)標(biāo)識(ID)实胸,在觸發(fā)第一個(gè)調(diào)用時(shí)他嫡,生成一個(gè)GUID,然后將其傳遞給所有的后續(xù)調(diào)用庐完,日志中保存該關(guān)聯(lián)標(biāo)識钢属,就能通過查看日志進(jìn)行跟蹤。每個(gè)服務(wù)都應(yīng)知道傳遞關(guān)聯(lián)標(biāo)識门躯∠常可用Zipkin進(jìn)行跨多個(gè)系統(tǒng)邊界跟蹤調(diào)用。Zipkin有點(diǎn)重讶凉,需要自定義客戶端并且支持收集系統(tǒng)染乌。傳遞關(guān)聯(lián)標(biāo)識需要在所有服務(wù)中保持一致,可以通過統(tǒng)一的庫來進(jìn)行懂讯,實(shí)現(xiàn)該庫時(shí)需要盡量減少其依賴荷憋。
9.級聯(lián)
級聯(lián)故障很危險(xiǎn),監(jiān)控系統(tǒng)之間的集成點(diǎn)非常關(guān)鍵褐望。每個(gè)服務(wù)應(yīng)該追蹤和顯示其下游服務(wù)的健康狀態(tài)台谊,然后將這些信息匯總,整合到一個(gè)畫面譬挚」Γ可以用庫實(shí)現(xiàn)一個(gè)斷路器網(wǎng)絡(luò)調(diào)用,幫助你更優(yōu)雅地處理級聯(lián)故障和功能降級减宣。如JVM上的Hystrix盐须,提供了挺好的監(jiān)控功能。
10.標(biāo)準(zhǔn)化
監(jiān)控領(lǐng)域的標(biāo)準(zhǔn)化很關(guān)鍵漆腌,可以利用工具贼邓,例如提供預(yù)配置的虛擬機(jī)鏡像,鏡像內(nèi)置logstash和collectd闷尿,還有一個(gè)公用的應(yīng)用程序庫塑径,使其與Graphite容易交互。
11.考慮受眾
不同的人對于數(shù)據(jù)進(jìn)行深入分析的需求不一樣填具。需要考慮:他們現(xiàn)在需要知道什么统舀,他們之后想要什么匆骗,他們?nèi)绾蜗M(fèi)數(shù)據(jù)。定量信息的圖形化顯示可以參考Stephen Few的《Information Dashboard Design: Displaying Data for At-a-Glance Monitoring》一書誉简。
12.未來
存儲業(yè)務(wù)指標(biāo)的系統(tǒng)通常無法直接碉就、實(shí)時(shí)地訪問,而存儲運(yùn)營指標(biāo)的系統(tǒng)卻可以闷串。如果能有通用的事件路由系統(tǒng)瓮钥,使兩者能聚合用于生成報(bào)告,則整體架構(gòu)會更加簡單烹吵。Riemann是一個(gè)事件服務(wù)器碉熄,允許高級的聚合和事件路由。Netflix開源的Suro類似肋拔。聚合的數(shù)據(jù)可以分發(fā)到不同的系統(tǒng)具被,如Storm、Hadoop或Kibana只损。
13.總結(jié)
對每個(gè)服務(wù):跟蹤請求響應(yīng)時(shí)間一姿、錯(cuò)誤率和應(yīng)用程序級指標(biāo);跟蹤所有下游服務(wù)的健康狀態(tài)跃惫,如調(diào)用時(shí)間叮叹、錯(cuò)誤率;標(biāo)準(zhǔn)化如何收集和存儲指標(biāo)爆存;以標(biāo)準(zhǔn)格式講日志記錄到一個(gè)標(biāo)準(zhǔn)位置蛉顽;監(jiān)控底層操作系統(tǒng)。
對系統(tǒng):聚合CPU等主機(jī)層級的指標(biāo)和程序級指標(biāo)先较;確保指標(biāo)存儲工具可以在系統(tǒng)和服務(wù)級別做聚合携冤,也能查看單臺主機(jī)信息;指標(biāo)存儲工具允許維護(hù)數(shù)據(jù)足夠長時(shí)間闲勺,以了解趨勢曾棕;使用單個(gè)可查詢工具對日志進(jìn)行聚合和存儲;強(qiáng)烈考慮標(biāo)準(zhǔn)化關(guān)聯(lián)標(biāo)識的使用菜循;了解什么樣的情況需要行動翘地,并構(gòu)造警報(bào)和儀表盤;調(diào)查對各種指標(biāo)聚合和統(tǒng)一化的可能性癌幕。
更多通用事件處理系統(tǒng)的內(nèi)容可參考作者的書《Lightweight Systems for Realtime Monitoring》衙耕。