淩晨,時針指向兩點,我們技術保障團隊一半的人手還在追查Netflix出錯的原因。系統看起來運行還算正常,肯定是有哪不對但我們死活也找不着。查了一個小時,終于發現原來是數據中心裡一台服務器出了問題。我們一直在查找有沒有什麼特别明顯的問題,而且數據中心有好幾萬台服務器,所以把這個小淘氣給忽略掉了。
連續劇《夜魔俠》裡面的主角是個瞎子,但其他的感官異常靈敏。這使他可以察覺到某個人行為上的些許異常從而判斷出這個人是否在撒謊。我們也開發了一個系統來發現服務器之間細微的差别,差别雖然小,但可能就是這些小的地方出問題。
本文中我們将介紹這一自動異常偵測技術和問題服務器的修複。多虧了它,不然我們恐怕得整天半夜爬起來救火。
現在運行Netflix服務的有好幾萬台服務器,一般出問題的比例不會超過1%。比如說有一台服務器的網絡出了點問題導緻用戶的連接出現了延遲。雖然運行狀态不理想,但在服務器健康檢查中是看不出來的。
其實這種有問題的服務器還不如直接挂掉。起碼挂掉的話現有的監測系統和工程師能夠發現它挂了。現在它雖然沒有挂,但影響到了用戶的體驗,我們的客服還是一樣要接電話聽用戶的抱怨。也不知怎的,幾萬台服務器裡總有幾個要出問題。
圖中不同顔色的線代表某個服務器的錯誤率。每條線都有峰值然後掉回到零,但紫色代表的這台服務器錯誤率一直高于其他服務器。從圖中你能看出紫色代表的服務器有異常嗎?有沒有辦法使用這些時序數據來實現異常偵測的自動化呢?
有一種簡單的方法是設置一個阈值,錯誤率高于阈值就報警,但隻适用于錯誤率特别高的服務器而且這種方法有一個問題就是所有數據都會有尖峰所以可能誤差會比較大,下面的圖中我們就很難找到一個合适的阈值,此外使用的阈值也需要定期進行調整因為服務器集中使用的時間和負載都可能出現變化。我們提高系統可靠性的突破點就是自動偵測那些有問題但用阈值法發現不了的服務器。
為了解決這一問題我們使用了聚類分析算法。聚類分析算法的基本原理是将相似程度高的樣本歸到一類。這一算法是非監督式的所以我們不需要進行數據标記和提供數據。具體的聚類分析算法有很多種,這裡我們使用的是Density-Based Spatial Clustering of Applications with Noise (DBSCAN) 算法。
DBSCAN算法原理
DBSCAN算法是Martin Ester、Hans-Peter Kriegel、Jörg Sander和徐曉偉在1996年提出的,可以說是聚類分析的典型算法。DBSCAN遍曆所有的數據點,如果有很多相鄰的數據點的話就歸為一類。為了在DBSCAN算法中衡量數據點是否相鄰我們需要一個判斷距離的方法。 這裡可視化了DBSCNAN算法運行的過程,如果感興趣的話可以看下。
使用DBSCAN算法尋找異常服務器
要找出有異常的服務器,我們先要指定一個指标,比如之前我們提到的錯誤率。接下來就要收集一段時序數據并使用DBSCAN算法來進行處理找出發生異常的服務器。比如下面這幅圖中塗成粉紅色的就是從Netflix時序數據平台中收集的部分。
除了測量的指标,我們還需要指定将服務器标記為異常的最短持續時間。探測到異常之後就交由我們的報警系統來進行以下處理:
- 發郵件或者打電話聯系負責人
- 服務器下線但不停止
- 收集服務器數據以供進一步調查
- 停止服務器等待擴展系統進行替換
參數的選擇
DBSCAN算法中需要設置兩個參數:Eps和MinPts。意思分别是判斷數據點是否相鄰的半徑和定義一個集群所需要的數據點的最小個數。這裡我們的參數是根據現有的異常服務器數目使用模拟退火算法逆推出來的。這種逆推的方式簡化了參數的設置所以現在Netflix有好幾個項目組都在用我們這個系統。
為了對這個系統的有效性進行評估,我們已經在生産環境中進行了測試。我們一共收集了一個星期的數據,然後将人工識别出的異常服務器與算法識别出的異常服務器進行了對比。下面是測試的結果
這個結果顯示我們這個偵測系統雖然不是100%準确但是效果很不錯了。根據我們的自身情況來說也不用完全做到一點都不差,因為就算把一個正常運行的服務器給關掉了也不會對用戶體驗造成多大影響,因為擴展系統馬上就能加一個新的服務器進來。有這個偵測系統總是比沒有強吧哈哈。
現在我們的做法是收集一段時間的數據來進行偵測。因為不是實時偵測,所以效果就跟收集數據的時間長短有關:時間太短的話可能有噪音,太長的話偵測的速度又太慢。如果要對這套系統進行改進的話,可以考慮使用實時流式處理框架比如Mantis和Apache Spark Streaming。數據流挖掘和在線機器學習方面的研究也有一些進展所以如果你想建設一個類似的系統可以考慮下。
此外在參數的設置上也可以進行改進。可以進行數據标記來組織訓練數據并根據提供的訓練數據來對模型進行訓練,這種方法比我們現在用的逆推更好而且模型可以根據訓練數據的變化來重新訓練。
小結
Netflix的基礎設施變得越來越龐大,将運營中的某些決定(比如這裡的停止服務器)進行自動化可以提高可用性并減輕運維人員的負擔。夜魔俠的服裝能幫他打架,機器學習也能夠提高我們技術保障團隊的效率。偵測異常服務器隻是自動化的一個例子,其他可以自動化的機會還有很多,就留待大家去發掘吧。
英文原文:Tracking down the Villains: Outlier Detection at Netflix(譯者/劉旭坤 審校/朱正貴 責編/仲浩)
【預告】首屆中國人工智能大會(CCAI 2015)将于7月26-27日在北京友誼賓館召開。機器學習與模式識别、大數據的機遇與挑戰、人工智能與認知科學、智能機器人四個主題專家雲集。人工智能産品庫将同步上線,預約咨詢:QQ:1192936057。歡迎關注。
,