1. 程式人生 > >唯品會運維資料技術實踐的三重境界

唯品會運維資料技術實踐的三重境界

講師介紹

吳曉光,唯品會運維部開發經理、20年一線奮鬥經驗,10年以上網際網路企業運維領域研發經驗。曾在騰訊、卓望、唯品會等網際網路公司任職,對資料在運維領域的應用有著深刻的理解,現致力於唯品會智慧化運維平臺的建設工作。

時下資料科學是一個熱點話題,各個行業裡面也有一些比較成熟的應用,在這個大的背景下,我們在大約一年前就開始有意識地把資料技術、資料分析、資料探勘這些技術融合到運維領域的應用。在這個過程中,我們做的時間其實不很長,比較短,目前只是做了一些相對來說較為簡單的一些事情,但取得的成果在公司內部感覺還是比較好的。今天我就跟大家分享一下我們在應用開發過程中的一些案例,也就是說,如何讓資料技術在運維實踐中得到充分的應用,希望對大家的工作有一些參考價值。
分享目錄:
  1. 資料處理技術應用
  2. 資料分析技術應用
  3. 資料探勘技術應用
  4. 應用生態建設及規劃

前言

在運維中我們會碰到各種各樣的問題,但有些問題我們經常重複遇到,並且形成了一些提問正規化,如:

唯品會

  • “有問題或故障發生嗎?”,這個提問轉換成數學問題就是建立“異常檢測”模型;
  • 當我們確認有問題時,我們本能地會問“哪裡出了問題”,這便是一個“根因分析”問題;
  • 對於一家電商公司來說,促銷前總是要對線上系統進行容量評估和擴容,這裡便有一個“預測”模型需要被建立;
  • 當我們每做完一個專案,需要對專案需要達成的目標進行定量的評估,這便是一個“績效分析”的問題。

目前各類數學模型的輸出在我們的具體工作中主要被用作輔助決策來使用,有兩個原因使我們還不能直接把結果自動地用於決策:一是我們對資料的使用能力還不能做到面面俱到,很多業務知識還無法用演算法描述;二是演算法的輸出結果一般都是有概率的,在很多需要“絕對正確”的場合只能作為參考。在實際工作中,演算法和業務規則庫都會進行建設,用來幫助運維人員更容易和正確地做出決定。

基於此,今天給大家重點介紹“資料處理技術”、“資料分析技術”、“資料探勘技術”這三個方面在唯品會的應用實踐,主要會講到一些應用場景,最後談下“資料技術”在唯品會運維的生態建設和一些規劃。

1.資料處理技術應用

對於資料處理技術來說,我們主要是需要解決以下五個方面的問題:

  • 資料的準確性、及時性
  • 海量資料的實時計算
  • 多維資料的實時監控
  • 多維資料的展示
  • A/B測試實現方法

這裡有些問題在行業裡已有比較成熟的解決方案,有些可能就不是每個公司都會碰到。

資料採集

資料

首先我們看資料採集,對唯品會來說,我們主要是兩類資料,一類是日誌資料,一類是資料庫資料。

對於日誌資料來說,我們有兩類採集,一類是客戶端的日誌採集,一類是伺服器端的日誌採集。對於伺服器端的日誌採集,實際上是比較簡單的,一般來說就是落到本地盤之後,通過Flume傳送到公司的Kafka叢集,然後大家在上面消費。對於客戶端行為的採集,分成兩種,一種是Web端的採集,一般來說就是通過非同步請求在Nginx上落日誌;第二個是APP端的採集,一般是通過一個介面呼叫的方式,把這些資料落到服務端,再由服務端把這個資料收集起來。對於資料庫的採集,實際上我們也是有兩種方法的,一種是直接在從庫上來做這種指標的計算,還有一種就是對於複雜的應用,我們會把DB的Binlog做一些解析,解析完了之後放到一個訊息總線上,實際上就放到Kafka上,然後讓大家來進行一個消費,每個應用都是根據自己的特點,重構自己的資料結構。有些會還原資料庫,有些就直接用訊息來計算指標,具體要根據情況進行分析。

上圖主要描述了唯品會用到的一些主要開源產品,基本上是這樣。

資料計算

資料計算

資料計算是比較重要的一環,實際上要兼顧效能和靈活性兩個方面。對日誌的處理,會有一個日誌解析程式來消費Kafka的訊息,“日誌解析”實現一個實時ETL的過程,我們會根據配置(基本配置也跟ETL差不多)去生成預定義的標準格式,後續就交給Spark做聚合。“日誌解析”由於日誌之間沒有相關性,可以Map之後平行計算,吞吐量和資源的投入是成正比的,這樣效率就沒有什麼太多的問題。

對於Spark的聚合配置,一般來說我們會把日誌解析完的資料進行定義,定義各個欄位是維度或是指標,然後會做一個全維度的聚合。這裡面實際上也是有個要求的,我們要求所有的指標在各個維度上都具有累加性,如果不具備累加性(比如百分比這種指標),我們在Spark裡是不做聚合的,只是在展現的時候重新計算。計算好的資料會放到一個OLAP和MOLAP的資料庫裡。

還有一種情況,是通過指令碼在資料庫從庫上直接進行指標的計算,一般用於只有時間維度的指標計算,配置好的計算指令碼,我們會用公司開源的一個產品Saturn來進行一個分散式排程。Saturn這個東西還是不錯的,推薦大家去嘗試一下。對於日誌的詳細查詢,我們還是放到ES裡,通過全文檢索的方式來查詢。

資料展現

資料展現

資料展現是最終的結果輸出,實際工作中,我們對結果資料的查詢效率要求比較嚴苛。因為這些結果資料不僅用於前端,還用於告警輸出等各個方面。對於告警的資料我們需要做到毫秒級響應,前端介面一般要求是在3秒內渲染完成。為了完成這個要求,我們構建了一個ROLAP資料庫,還有一個MOLAP的資料庫,在ROLAP的資料庫裡,一般只存當天的多維資料,而在MOLAP的資料庫裡,會存歷史資料。對於MOLAP資料庫的檢索,由於應用主要是切片方面的需求,基本上都是K-value模式的一個檢索,所以它比較快。MySQL裡一般是存放單維度指標,應該這麼講,它不是多維資料。Redis緩衝裡,一般會存放我們的秒級資料,還有一些配置資訊。這個架構中,最後通過Application  Server進行一個數據的整合,來滿足前端資料的一個展示要求。

  • 多維分析介面案例

這是一個多維分析案例的介面,左邊是我們的分析平臺,右邊是我們的實時監控平臺,從這上面大家能看到,我們實際提供的功能主要是對資料切片的能力,這個能力基本可以滿足我們目前所有的需求。

  • A/B測試實現

對於資料分析來說,基於A/B測試的對比分析是一種重要的方法。因為A/B測試對比的結果容易被業務理解,如果沒有A/B測試,你說我做了一件事情,這件事情帶來了一個好的效果,還是很難經得起挑戰的。在A/B測試中,它需要一些技術來支撐的,因為我們在線上同時會有很多A/B測試的案例同時在跑,你自己的A/B測試不應該被別人干擾,在這種情況下實際上是要求各個A/B測試之間的使用者分佈得具有正交性,也就是說別人的A/B測試集使用者應該平均分佈在你的A/B測試集上。

這種實現我們大約有兩種方法,一種是會在APP端設定開關,每個開關管理一個A/B測試的實驗。更多的A/B測試,是統一請求後端的A/B測試分組服務,這個服務通過演算法來保證各個試驗之間相互獨立。一般來說,當客戶端發起A/B測試場景的時候,就會向A/B測試分組服務發個請求,然後A/B分組服務會返回這個使用者是屬於A組還是B組,一般是這樣的。

2.資料分析技術應用

這部分會簡單介紹具體的分析方法,並主要說下應用場景和案例。總的來說,我們的運維資料分析技術主要是用於解決兩方面的問題,一方面是“績效分析”,一方面是“根因分析”。

績效分析

以前我們做了挺多的專案,這些專案一般來說WBS分解之後,我們會對專案的結果做一個簡單的跟蹤,只是說做完了,還是沒做完,一般也不會對它做一些定量的分析或者說對這個質量有一個看法。這種情況在我們的專案中非常常見,這種專案一般來說比較小,都是靠個人技術能力就能控制住。

資料分析

但在大型專案中這種做法就很困難,它會面臨更多的一個挑戰,尤其是跨部門合作等情況,因為大家的溝通手法不僅僅是技術的,可能還有一些管理上的,這時就需要大家用資料在各個部門之間作為一個溝通的橋樑。

  • 績效分析-全站HTTPS專案案例

於是資料分析人員就已經開始介入來進行分析體系的設計,主要包括:分析指標的設計和分析維度的設計,同時和研發確認資料採集方案、A/B測試方案、統計口徑等。

指標主要是根據專案中各項工作都關注什麼問題來設計,而維度的設計是從當指標不滿意時,可以在哪些方面著手改進來進行。

在這個專案中可預見的是,由於證書握手的原因,TCP連線時間會變長,可能會影響使用者體驗,同時也會減少劫持從總體上提高使用者體驗,所以專案的目標設定為轉化率至少不下降,最好能有上升。

我們實際上是做了一個HTTPS的全站專案,在專案開始之初,我們就有意識地把資料分析團隊和技術人員整合到一起跟進專案,取得了不錯的結果。資料分析人員在專案的初期就已經開始介入,來進行分析體系的設計,主要包括:分析指標的設計和分析維度的設計,同時和研發確認資料採集方案,A/B測試方案,統計口徑等。

分析人員會把這些工作做好,可他們怎麼來設計這個專案的一些指標呢?一般來說,在WBS分解之後,我們關注什麼問題,就會把這個問題變換成一個主要的監控指標。那如何去設定這些維度呢?

改善的地方。

首先HTTPS專案,不知道大家有沒有了解,如果瞭解可能知道HTTPS專案,因為TCP握手時間會延長,這一點上可能會損失一部分的使用者體驗,但在防劫持等方面,又會加強整體的使用者體驗,在這種情況下,我們專案設立了一個最終的主要目標,也就是保證轉化率,這個轉化率不能下降,最好還有一點點提升,在這個主要目標上,我們就控制這個主要目標,不停地灰度放量,不停地調整,這個效果是比較好的,因為在這個過程中我們發現了很多的問題,同時這個專案持續了大約8個月,在8個月中我們沒有發生過任何重大的故障。

這個案例是對錯誤率的分析和監控,有一次發現我們的錯誤碼是HTTPS的證書認證過不去,這種情況在某個省某個運營商大規模地發生,我們從分析的角度看這些節點IP是不是我們自己的IP,這樣我們就知道在這個地方發生了大規模的DNS劫持問題,於是就去協調當地的運營商把這個事情搞定。資料分析也會發現一些程式碼中的問題,我們做HTTPS專案,可能要對程式碼進行一些修改,比如說在整個HTML裡是不能存在HTTP協議的硬編碼,但由於歷史原因,這種地方還是比較多的,開發人員很難排查完,實際上需要分析人員通過資料分析手段去查,把這些沒有改過的程式碼找出來。

還有一些圖片的問題,我們發現一些圖片的拼接錯誤,當然是報了404,報了404之後,我們對這個錯誤碼分析,發現突然多了,把報錯的URL做一個排序後發現一些是拼接的錯誤,還有一些是由於特殊字元引起而導致了無法生成正確的請求。我們對TCP的握手時長也會進行跟蹤,在做灰度選型階段,我們在不同的入口採用了不同的技術型別,通過分析各個入口的握手時長來輔助運維人員進行一個加速卡的選型,還有一些引數調整等工作。

  • 績效分析-其它案例場景

這個專案進行完成之後,我們總結了很多經驗,慢慢地在其它的專案中也逐漸有意識地運用資料分析技術,把資料分析人員和技術人員有效地結合在一起。

這裡面也有幾個案例,比如說CDN廠商切換時,我們要跟蹤錯誤率、響應時間這樣的一些指標,來決定切換是否需要回滾;促銷前的一些流量排程,我們也要分析排程策略的預期結果,比如說各個入口的流量是不是按我們的計劃把這個流量排程到位了;每次APP版本的更新,我們也需要不停地來跟蹤它的訪問連通率、網路連通率等一些關鍵指標。

根因分析

在資料的基礎上,我們也可以做一些原因的查詢,通過資料分析進行的原因查詢有時可以直接幫我們定位到問題,在更多的時候可以有效地幫我們縮小問題的範圍。通過資料來查詢原因,這其實是有一定侷限性的,侷限性就在於資料的維度,因為我們只能在分析的維度上來進行查詢,如果故障的原因沒有在我們已知維度上,實際上是找不出來的,但大部分時候還是能起到比較關鍵的作用。

對於直接利用多維資料進行問題的分析,我們大約有三個步驟,第一個步驟就是要確定問題,確定問題之後,就確定了是哪個指標有問題,第二步是做一些資料上的分析,最後找到問題之後,我們要做資料和業務上的一些驗證,主要的方法有兩種:

第一種是排序表,這個最簡單了,就是人眼看,通過排序我們可以解決70-80%的問題。第二種就有點自動化的意思了,我們叫資料探索,它有一個原理,實際上並不是所有的資料都能進行探索,我們目前就是假設這個資料在任意切片上,在時間維度上它是屬於均勻分佈的,在這種情況下我們認為這個誤差值是符合正態分佈的,就可以比較容易地做一個異常的檢測來看每個資料切片上是否有問題,當所有的資料被探索完之後,問題的原因也基本能找到。

  • 根因分析-案例

這是非實時根因分析的一些案例:

我們有一次網路連通率連續三個月下降,我們分析到最後,發現這個APP的版本有些問題,某天之後所有新發布的APP版本連通率下降都比較大,跟研發反饋之後,他們就在SDK做了一些調整,實際上真正錯在哪,我們並不知道,我們只能知道這個版本有問題,更多地去幫助技術人員縮小這個範圍。再就是圖片錯誤率上升,剛才已經介紹過了。

再就是實時的根因分析,剛才講的其實都是一些平時的案例,而實際上我們也做實時的系統,這些實時的系統就是希望利用多維資料,在系統告警候,能夠幫助大家更快定位一些問題。這裡也有兩個例子:

一個就是連通率下降之後,我們會發現某類錯誤碼是影響的一個主要因素,有針對性地解決問題後,發現連通率恢復了,這樣基本上可以定位故障。

再有就是某一個應用的錯誤率有上升,我們會看到有些省份影響比較大,具體看是一些CDN節點的故障,切換後,故障得到恢復。總體看,實時分析還是能夠比較快地幫助運維人員定位問題。

3.資料探勘技術應用

對於資料探勘來說,我們目前所應用的場景,或者說能幫我們解決的問題主要有三類:一類是預測,一類是異常檢測,異常檢測主要是用來做告警閾值自動的設定。第三類是做一些根因的分析,它的目的和剛才講的基於資料分析的根因分析是一樣的,但在實現上演算法有些不同。

預測

我們現在的預測,主要是做了一些業務指標的預測,比如像PV、UV、訂單、購物車這樣的一些業務指標,下面我講一下訂單的預測。

這是我們的訂單預測圖。當時做這個預測,實際是有應用的場景,當故障發生時,需要實時跟蹤預計的損失,以便於我們確定故障的等級,還有就是排程解決故障需要的資源量。大家可以看到,這種預估我們還是比較容易可以算出來的,在什麼時候這個故障已經好了,什麼時候它的損失達到什麼程度,我們的故障是不是需要升級。

這裡面有一個技術點需要解決,就是說我們在故障的時候,實際值已經掉下去了,而我們的預測演算法需要前一分鐘和前幾分鐘的資料,為了不把故障的資料引入到演算法中,在故障的時候,是用預測值代替真實值。具體來說,就是用上一週的資料做一些平均的加成來替換,然後再做下一次的預測。

對於預測演算法,我們開始採用的是時間序列中的holt-winters演算法,因為我們公司的資料週期性比較明顯,我們在時間序列上做擬合時還是比較準確的,應該來說效果還比較好。但這個演算法到了一定時候,我們就碰到了一些問題,一個就是促銷和平時不太一樣,也就是說促銷的資料,我們是擬合不上的。第二個就是在告警和一些夜晚流量低峰時,這個資料波動還是比較大的,告警的準確率也不是很高,我們怎麼來解決這個問題呢?

先看促銷。對訂單量來說,訂單達到高峰之前,我們的PV、UV包括收藏數等業務指標已經開始啟動了,我們就會把這些業務指標引入我們的分析模型,也就是我們會把PV、UV、收藏數,包括上週同期的這些資料,和上週我們要預測那個時間點的訂單數全部都引進來,然後用一個機器學習的辦法,基本上就可以解決這個問題。在雙11促銷後觀察了一下預測的情況,現在促銷預測的數值還是比較準的。

當基於預測進行告警時,碰到主要問題是夜晚低峰時資料波動較大,如果按每個時間點的指標直接進行告警非常容易誤報。我們採用的辦法是預估損失累計的報警方法,當累計預估損失達到100單時就進行告警,這樣調整後,我們從上線到現在基本已經沒有了誤告。這個100單的設定,跟我們公司的制度有關,因為我們公司達到了200單、300單,那就是重大故障了,我們在100單的時候,就把這個警報給拉起來,是可以防止重大故障發生的。

根因分析

最後在資料探勘這部分的應用,給大家介紹一下根因分析。

我們這套演算法經過幾個案例的嘗試,基本上都能找出原因,首先就是它跟多維分析的“根因分析”不太一樣,多維分析的“根因分析”是建立在已經計算好的多維資料基礎上,而這個演算法實際上是從原始資料來抽樣的。比如說,像錯誤率上升的一個根因分析,我們首先會抽一些資料,把錯的和正確的日誌各抽50%,對非資料列進行預編碼。預處理之後,我們會用Spearman和Mutual  Information這兩種演算法來計算各個維度和結果之間的相關性程度,如果這兩種方法結果一致,則直接按相關性值大小進行排序,然後會用One  hot  encoding做一個轉碼,轉碼之後放入邏輯迴歸模型中,選擇L1的懲罰項,如果它的係數算出來是負值,這個負值所代表的維度就是原因所在。如果上述方法兩個結果不一致,採用random forest和adaboost的方法構建樹模型,檢視模型給出的維度重要性,這裡我已經畫得很清楚了,如果兩個模型的重要性排序一致,就走上次那個步驟,如果不同,則用該模型對資料進行預測,選擇預測結果較高的相關性排序。

4.應用生態建設及規劃

最後跟大家一起討論一下,如何讓資料成為運維的大腦。根據我們的經驗,首先從組織結構上來說,我們需要一個獨立的分析團隊。因為在這個分析團隊成立之前,公司的運維體系實際上也在使用資料,使用資料的方法和分析團隊後來使用分析資料的方法也是大同小異,但因為它本身是一個自發的,沒有一些強制性的要求。在把資料分析融入到工作流程之後,我們發現效率會得到一個比較大的提升,同時知識的傳承,包括統計口徑等這些比較令人困惑的問題也都可以得到一個比較好的管理和解決。

這樣的組織架構在我們的實踐中,感覺可以更好地幫助運維專家來解決問題。

從平臺建設上來說,應該是說現在已經開始了,著力打造的其實是兩個平臺,一個是資料分析的平臺,資料分析平臺說到底就是運維的資料倉庫,它使用現在大資料的一些傳統技術來做這件事情,第二個是統一資訊的平臺。“統一資訊平臺”主要考慮到在網際網路公司,不管是不是在野蠻成長階段,待過的人都會知道,系統特別多,資訊也是特別分散,我們還是想把這些分散的關鍵資訊看怎麼收集起來,然後看能不能做一些事情。目前我們會把釋出平臺的一些釋出資訊,還有ITIL平臺的一些事件資訊、變更資訊,CMDB的一些基礎架構資訊,再有就是各種各樣的監控系統的值班表資訊和告警資訊(這種監控系統我們有好幾十套),我們都會把它們放到資訊庫裡面。在資訊庫建設之後,我們演算法雖然可以實際有效地解決點上的問題,但還沒能很好地解決關聯性上的問題,這塊還是挺困難的。只能是說當前是一件事情一件事情去解決,那這種複雜的關聯性我們靠什麼呢?

靠的是規則庫,用業務知識補充當前階段演算法上的一些不足。也就是說在整個系統建設中,實際上演算法庫和規則庫都是一起建設的,不會說,就用演算法就不要規則了,或只有規則,演算法也沒什麼用,它是一體建設的,而且它們能解決的問題不一樣,演算法我們是解決點上的問題,規則我們是用來解決這種關聯性的問題,尤其複雜業務關聯的問題,都靠規則來配置的。

整個這套平臺的建設它主要有兩個目標,短期目標就是說對告警進行有效的一個壓制、管理、合併,第二個目標就是想能夠解決自動故障定位的問題。目前是有一定的成效,但準確率還沒有那麼高,以後能做得好的時候,我們會想通過ITIL平臺來驅動自動化平臺對現網的故障進行自動化的處理,比如說像重啟、降級,限流,磁碟空間管理,流量排程等工作。應該是說為了自動化運維、解決故障一起努力吧!

以上就是我們對資料應用在未來一個時期內的定義,也是想在未來大約半年到一年能夠看到更多成果的一個實踐。今天分享就到這裡,謝謝大家!

原文來自微信公眾號:DBAplus社群