凌晨,時(shí)針指向兩點(diǎn),我們技術(shù)保障團(tuán)隊(duì)一半的人手還在追查Netflix出錯(cuò)的原因。系統(tǒng)看起來運(yùn)行還算正常,肯定是有哪不對(duì)但我們死活也找不著。查了一個(gè)小時(shí),終于發(fā)現(xiàn)原來是數(shù)據(jù)中心里一臺(tái)服務(wù)器出了問題。我們一直在查找有沒有什么特別明顯的問題,而且數(shù)據(jù)中心有好幾萬臺(tái)服務(wù)器,所以把這個(gè)小淘氣給忽略掉了。
連續(xù)劇《夜魔俠》里面的主角是個(gè)瞎子,但其他的感官異常靈敏。這使他可以察覺到某個(gè)人行為上的些許異常從而判斷出這個(gè)人是否在撒謊。我們也開發(fā)了一個(gè)系統(tǒng)來發(fā)現(xiàn)服務(wù)器之間細(xì)微的差別,差別雖然小,但可能就是這些小的地方出問題。
本文中我們將介紹這一自動(dòng)異常偵測(cè)技術(shù)和問題服務(wù)器的修復(fù)。多虧了它,不然我們恐怕得整天半夜爬起來救火。
現(xiàn)在運(yùn)行Netflix服務(wù)的有好幾萬臺(tái)服務(wù)器,一般出問題的比例不會(huì)超過1%。比如說有一臺(tái)服務(wù)器的網(wǎng)絡(luò)出了點(diǎn)問題導(dǎo)致用戶的連接出現(xiàn)了延遲。雖然運(yùn)行狀態(tài)不理想,但在服務(wù)器健康檢查中是看不出來的。
其實(shí)這種有問題的服務(wù)器還不如直接掛掉。起碼掛掉的話現(xiàn)有的監(jiān)測(cè)系統(tǒng)和工程師能夠發(fā)現(xiàn)它掛了。現(xiàn)在它雖然沒有掛,但影響到了用戶的體驗(yàn),我們的客服還是一樣要接電話聽用戶的抱怨。也不知怎的,幾萬臺(tái)服務(wù)器里總有幾個(gè)要出問題。
圖中不同顏色的線代表某個(gè)服務(wù)器的錯(cuò)誤率。每條線都有峰值然后掉回到零,但紫色代表的這臺(tái)服務(wù)器錯(cuò)誤率一直高于其他服務(wù)器。從圖中你能看出紫色代表的服務(wù)器有異常嗎?有沒有辦法使用這些時(shí)序數(shù)據(jù)來實(shí)現(xiàn)異常偵測(cè)的自動(dòng)化呢?
有一種簡(jiǎn)單的方法是設(shè)置一個(gè)閾值,錯(cuò)誤率高于閾值就報(bào)警,但只適用于錯(cuò)誤率特別高的服務(wù)器而且這種方法有一個(gè)問題就是所有數(shù)據(jù)都會(huì)有尖峰所以可能誤差會(huì)比較大,下面的圖中我們就很難找到一個(gè)合適的閾值,此外使用的閾值也需要定期進(jìn)行調(diào)整因?yàn)榉?wù)器集中使用的時(shí)間和負(fù)載都可能出現(xiàn)變化。我們提高系統(tǒng)可靠性的突破點(diǎn)就是自動(dòng)偵測(cè)那些有問題但用閾值法發(fā)現(xiàn)不了的服務(wù)器。
為了解決這一問題我們使用了聚類分析算法。聚類分析算法的基本原理是將相似程度高的樣本歸到一類。這一算法是非監(jiān)督式的所以我們不需要進(jìn)行數(shù)據(jù)標(biāo)記和提供數(shù)據(jù)。具體的聚類分析算法有很多種,這里我們使用的是Density-Based Spatial Clustering of Applications with Noise (DBSCAN) 算法。
DBSCAN算法原理
DBSCAN算法是Martin Ester、Hans-Peter Kriegel、J rg Sander和徐曉偉在1996年提出的,可以說是聚類分析的典型算法。DBSCAN遍歷所有的數(shù)據(jù)點(diǎn),如果有很多相鄰的數(shù)據(jù)點(diǎn)的話就歸為一類。為了在DBSCAN算法中衡量數(shù)據(jù)點(diǎn)是否相鄰我們需要一個(gè)判斷距離的方法。 這里可視化了DBSCNAN算法運(yùn)行的過程,如果感興趣的話可以看下。
使用DBSCAN算法尋找異常服務(wù)器
要找出有異常的服務(wù)器,我們先要指定一個(gè)指標(biāo),比如之前我們提到的錯(cuò)誤率。接下來就要收集一段時(shí)序數(shù)據(jù)并使用DBSCAN算法來進(jìn)行處理找出發(fā)生異常的服務(wù)器。比如下面這幅圖中涂成粉紅色的就是從Netflix時(shí)序數(shù)據(jù)平臺(tái)中收集的部分。
除了測(cè)量的指標(biāo),我們還需要指定將服務(wù)器標(biāo)記為異常的最短持續(xù)時(shí)間。探測(cè)到異常之后就交由我們的報(bào)警系統(tǒng)來進(jìn)行以下處理:
發(fā)郵件或者打電話聯(lián)系負(fù)責(zé)人
服務(wù)器下線但不停止
收集服務(wù)器數(shù)據(jù)以供進(jìn)一步調(diào)查
停止服務(wù)器等待擴(kuò)展系統(tǒng)進(jìn)行替換
參數(shù)的選擇
DBSCAN算法中需要設(shè)置兩個(gè)參數(shù):Eps和MinPts。意思分別是判斷數(shù)據(jù)點(diǎn)是否相鄰的半徑和定義一個(gè)集群所需要的數(shù)據(jù)點(diǎn)的最小個(gè)數(shù)。這里我們的參數(shù)是根據(jù)現(xiàn)有的異常服務(wù)器數(shù)目使用模擬退火算法逆推出來的。這種逆推的方式簡(jiǎn)化了參數(shù)的設(shè)置所以現(xiàn)在Netflix有好幾個(gè)項(xiàng)目組都在用我們這個(gè)系統(tǒng)。
為了對(duì)這個(gè)系統(tǒng)的有效性進(jìn)行評(píng)估,我們已經(jīng)在生產(chǎn)環(huán)境中進(jìn)行了測(cè)試。我們一共收集了一個(gè)星期的數(shù)據(jù),然后將人工識(shí)別出的異常服務(wù)器與算法識(shí)別出的異常服務(wù)器進(jìn)行了對(duì)比。下面是測(cè)試的結(jié)果
這個(gè)結(jié)果顯示我們這個(gè)偵測(cè)系統(tǒng)雖然不是100%準(zhǔn)確但是效果很不錯(cuò)了。根據(jù)我們的自身情況來說也不用完全做到一點(diǎn)都不差,因?yàn)榫退惆岩粋€(gè)正常運(yùn)行的服務(wù)器給關(guān)掉了也不會(huì)對(duì)用戶體驗(yàn)造成多大影響,因?yàn)閿U(kuò)展系統(tǒng)馬上就能加一個(gè)新的服務(wù)器進(jìn)來。有這個(gè)偵測(cè)系統(tǒng)總是比沒有強(qiáng)吧哈哈。
現(xiàn)在我們的做法是收集一段時(shí)間的數(shù)據(jù)來進(jìn)行偵測(cè)。因?yàn)椴皇菍?shí)時(shí)偵測(cè),所以效果就跟收集數(shù)據(jù)的時(shí)間長短有關(guān):時(shí)間太短的話可能有噪音,太長的話偵測(cè)的速度又太慢。如果要對(duì)這套系統(tǒng)進(jìn)行改進(jìn)的話,可以考慮使用實(shí)時(shí)流式處理框架比如Mantis和Apache Spark Streaming。數(shù)據(jù)流挖掘和在線機(jī)器學(xué)習(xí)方面的研究也有一些進(jìn)展所以如果你想建設(shè)一個(gè)類似的系統(tǒng)可以考慮下。
此外在參數(shù)的設(shè)置上也可以進(jìn)行改進(jìn)。可以進(jìn)行數(shù)據(jù)標(biāo)記來組織訓(xùn)練數(shù)據(jù)并根據(jù)提供的訓(xùn)練數(shù)據(jù)來對(duì)模型進(jìn)行訓(xùn)練,這種方法比我們現(xiàn)在用的逆推更好而且模型可以根據(jù)訓(xùn)練數(shù)據(jù)的變化來重新訓(xùn)練。
小結(jié)
Netflix的基礎(chǔ)設(shè)施變得越來越龐大,將運(yùn)營中的某些決定(比如這里的停止服務(wù)器)進(jìn)行自動(dòng)化可以提高可用性并減輕運(yùn)維人員的負(fù)擔(dān)。夜魔俠的服裝能幫他打架,機(jī)器學(xué)習(xí)也能夠提高我們技術(shù)保障團(tuán)隊(duì)的效率。偵測(cè)異常服務(wù)器只是自動(dòng)化的一個(gè)例子,其他可以自動(dòng)化的機(jī)會(huì)還有很多,就留待大家去發(fā)掘吧。