備注說(shuō)明:相關(guān)總結(jié)屬于個(gè)人學(xué)習(xí)筆記,請(qǐng)勿商用,感興趣的可在極客時(shí)間訂閱該《喬新亮的CTO成長(zhǎng)復(fù)盤》專欄學(xué)習(xí),謝謝~
要想深刻理解監(jiān)控的概念,我們首先要學(xué)會(huì)問(wèn)自己:為什么要做監(jiān)控系統(tǒng)?這就像許多工作方法論里強(qiáng)調(diào)的一樣,做事先問(wèn)目的 —— “start with why”。
監(jiān)控的目標(biāo)是及時(shí)發(fā)現(xiàn)系統(tǒng)的問(wèn)題,并盡可能快地做出相應(yīng)的動(dòng)作,讓系統(tǒng)一直處于健康的狀態(tài)。
監(jiān)控,可以拆分為“監(jiān)”和“控”分別理解,也就是“監(jiān)視”和“控制”
例子
服務(wù)器的 CPU 負(fù)載突然飆升
“最近線上有什么版本變動(dòng)嗎?都回退了嗎?”
研發(fā)同學(xué):只會(huì)退了指定版本沒(méi)有 會(huì)退到上一個(gè)版本。
真的都回退了嗎?
同學(xué)一拍腦門,猶豫地說(shuō)道:“我在數(shù)據(jù)庫(kù)里加了條索引,不過(guò)這肯定不會(huì)導(dǎo)致負(fù)載異?!?br>
刪除索引后一切正常了。。
IT 團(tuán)隊(duì)的系統(tǒng)監(jiān)控體系,到底出了什么問(wèn)題?
生產(chǎn)環(huán)境應(yīng)急恢復(fù)的最大挑戰(zhàn)在于根因分析,即找到問(wèn)題的根本原因,這往往是耗時(shí)最久的工作。
常規(guī)的操作
- 發(fā)現(xiàn)問(wèn)題后,立即聯(lián)系各相關(guān)系統(tǒng)負(fù)責(zé)人,以便共同排查問(wèn)題;
- 要求大家在一分鐘之內(nèi)回復(fù):自己治下的系統(tǒng)或服務(wù)是否健康(這里要將“健康”的定義想清楚,如,響應(yīng)時(shí)間是否增加超過(guò) 30% 等);
- 進(jìn)行根因分析,確認(rèn)導(dǎo)致問(wèn)題的系統(tǒng)、服務(wù);(人員規(guī)模也會(huì)越來(lái)越大,花費(fèi)的時(shí)間就會(huì)脫離控制。)
- 完成系統(tǒng)恢復(fù)工作。
針對(duì):根因分析
首先,我們要確認(rèn)異常是外因?qū)е?,還是內(nèi)因?qū)е隆?br>
比如,服務(wù)響應(yīng)慢,既可能是因?yàn)橥獠空{(diào)用量變大,也可能是因?yàn)閮?nèi)部進(jìn)程繁忙,導(dǎo)致 I/O 、內(nèi)存、網(wǎng)絡(luò)資源發(fā)生爭(zhēng)搶。這步判斷相對(duì)來(lái)說(shuō)比較耗時(shí)間,只有當(dāng)調(diào)查足夠充分時(shí),結(jié)果才可能浮出水面;
無(wú)論是內(nèi)因還是外因,都要“順藤摸瓜”,繼續(xù)進(jìn)行排查,最后進(jìn)行恢復(fù)。
有效的方法:
流控和版本回退,簡(jiǎn)單、粗暴、實(shí)用。
流控,就是做好程序的并發(fā)流量控制;
版本回退,就是在生產(chǎn)環(huán)境的發(fā)布出現(xiàn)問(wèn)題時(shí),及時(shí)回退到上一個(gè)版本。
生產(chǎn)環(huán)境出現(xiàn)問(wèn)題,原因:變化。
“變化”大三類:
- 外部用戶請(qǐng)求量增大;
- 產(chǎn)品發(fā)布,一般包括代碼發(fā)布、配置發(fā)布、SQL 腳本發(fā)布等;
- 依賴資源變化,一般是計(jì)算、存儲(chǔ)、網(wǎng)絡(luò)基礎(chǔ)設(shè)施情況變差,比如磁盤存在壞道等。
優(yōu)化過(guò)的操作
- 發(fā)現(xiàn)問(wèn)題后,立即聯(lián)系各相關(guān)系統(tǒng)負(fù)責(zé)人,以便共同排查問(wèn)題;
- 要求大家在一分鐘之內(nèi)回復(fù):自己治下的系統(tǒng)或服務(wù)是否健康(這里要將“健康”的定義想清楚,如,響應(yīng)時(shí)間是否增加超過(guò) 30% 等)
- 此處組織兩批研發(fā)力量,并行工作。第一批解決專業(yè)問(wèn)題,繼續(xù)跟進(jìn)問(wèn)題的定位和調(diào)試
- 第二批負(fù)責(zé)消滅變化,對(duì)有變化的模塊進(jìn)行回退,對(duì)于外部請(qǐng)求數(shù)量升高的模塊啟動(dòng)流控; 恢復(fù)系統(tǒng)
核心
對(duì)于任何組件,都有以下兩種手段同時(shí)存在: 流控手段; 發(fā)布回退手段。
認(rèn)知轉(zhuǎn)變
在生產(chǎn)環(huán)境,研發(fā)人員應(yīng)該尋找并消滅“變化”。從尋找 bug 到尋找變化。
剛才例子復(fù)盤
- 錯(cuò)誤一:負(fù)責(zé)發(fā)布的同學(xué),沒(méi)有按規(guī)定回退至穩(wěn)定版本,而是詢問(wèn)開(kāi)發(fā)同學(xué)的意見(jiàn),并以其意見(jiàn)為準(zhǔn);
- 錯(cuò)誤二:相關(guān)負(fù)責(zé)人,因?yàn)榧僭O(shè)“一條索引不會(huì)導(dǎo)致故障”而知情不報(bào),導(dǎo)致系統(tǒng)無(wú)法完全回退;
- 錯(cuò)誤三:十幾名團(tuán)隊(duì)成員沒(méi)有將精力聚焦在線上業(yè)務(wù)恢復(fù)方面,而是試圖在生產(chǎn)環(huán)境查找 bug。
程序員總覺(jué)得找到問(wèn)題才是高手,回退解決不了問(wèn)題。
記住:
要改變自己潛意識(shí)找bug的第一想法,我們的目標(biāo)是:即使找不到 bug,依然可以做好故障恢復(fù)。
生產(chǎn)環(huán)境永遠(yuǎn)不允許調(diào)試問(wèn)題,出現(xiàn)問(wèn)題立刻回退,查問(wèn)題要去測(cè)試環(huán)境。
對(duì)于復(fù)雜系統(tǒng)不好回滾,可以參考亞馬遜:大版本立項(xiàng),小版本上線 —— 梳理好各模塊的依賴關(guān)系,將各個(gè)系統(tǒng)、各個(gè)服務(wù)獨(dú)立發(fā)布。當(dāng)然,這也需要依賴服務(wù)版本化和 CI 能力的支持。
總結(jié)
要做到監(jiān)視一切,分析一切,控制一切,
“眼”能看見(jiàn)所有,“腦”能洞察一切,“手”能一手遮天,
一切業(yè)務(wù)數(shù)字化,一切數(shù)據(jù)可視化,一切控制可觸發(fā)
監(jiān)控的目的是讓系統(tǒng)一直處于健康狀態(tài),具體手段則可分為“監(jiān)視”和“控制”兩種;要做好控制,一個(gè)重要的方法是做好流控和版本回退。因?yàn)樵诖蟛糠智闆r下,消除變化就等于消除異常。
不單是技術(shù)、業(yè)務(wù)系統(tǒng)需要做好監(jiān)控,研發(fā)管理、團(tuán)隊(duì)管理都要做好監(jiān)控。
關(guān)于研發(fā)管理,我們?cè)凇案呖捎迷O(shè)計(jì)”部分曾提到:風(fēng)險(xiǎn)是經(jīng)由開(kāi)發(fā)環(huán)境、SIT 環(huán)境、壓測(cè)環(huán)境、PRE 環(huán)境,進(jìn)入生產(chǎn)環(huán)境的。所以我們要做的是嚴(yán)格檢查各個(gè)環(huán)境下的異常。
所謂研發(fā)管理規(guī)范,應(yīng)該為代碼版本進(jìn)入下一個(gè)環(huán)境設(shè)置準(zhǔn)入標(biāo)準(zhǔn)。對(duì)于任何異常,都有負(fù)責(zé)人進(jìn)行修正。
對(duì)于團(tuán)隊(duì)管理,我們常常說(shuō),組織是結(jié)果導(dǎo)向的,但管理工作是過(guò)程導(dǎo)向的。關(guān)注過(guò)程自然就會(huì)得到好的結(jié)果,只盯著結(jié)果往往什么也得不到。
對(duì)于一個(gè)項(xiàng)目、一個(gè)產(chǎn)品,乃至于團(tuán)隊(duì)的健康度,管理者有沒(méi)有在關(guān)鍵節(jié)點(diǎn)設(shè)置監(jiān)控?