彥 逸,周開(kāi)東,林細(xì)君,麥曉輝,肖建毅,曾朝霖
(廣東電網(wǎng)有限責(zé)任公司信息中心,廣東 廣州 510620)
隨著電力營(yíng)銷業(yè)務(wù)和用戶量的增長(zhǎng)以及集中監(jiān)控系統(tǒng)持續(xù)推廣和實(shí)用化,電力營(yíng)銷系統(tǒng)產(chǎn)生了大量的事件、告警以及故障數(shù)據(jù)。為了減少故障排查的工作量以及系統(tǒng)故障的恢復(fù)時(shí)間,節(jié)約大量的人力、物力,提高電力營(yíng)銷系統(tǒng)的穩(wěn)定性,快速、準(zhǔn)確地對(duì)故障進(jìn)行定位已經(jīng)變得越來(lái)越重要。
故障定位(Fault Location),又稱為根因分析(Root Cause Analysis),旨在系統(tǒng)中出現(xiàn)異常的表征時(shí),如事件、告警等,迅速準(zhǔn)確地定位故障原因。故障定位作為工業(yè)系統(tǒng)重要的工作,目前已有許多關(guān)于其算法的研究[1-5],根據(jù)模型大致可以分為基于分類模型的方法和基于概率圖模型的方法[6]。
基于分類模型的方法通常依賴大量的訓(xùn)練樣本,根據(jù)訓(xùn)練好的模型對(duì)發(fā)生的事件預(yù)測(cè)根因。Baraldi等人[7]使用K-近鄰算法(K-Nearest Neighbors, KNN)進(jìn)行多層次的分類實(shí)現(xiàn)故障定位。Wang等人[8]在利用相對(duì)主成分分析(Relative Principle Component Analysis, RPCA)對(duì)特征進(jìn)行降維的基礎(chǔ)上使用支持向量機(jī)(Support Vector Machine,SVM)進(jìn)行故障分類。Aslan等人[9]根據(jù)發(fā)生事件的不同對(duì)故障類型進(jìn)行判斷,進(jìn)而對(duì)不同故障類型使用不同的人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Network, ANN)進(jìn)行定位來(lái)提高泛化能力。上述基于分類模型的方法對(duì)于故障和事件關(guān)系變化頻繁的場(chǎng)景具有魯棒性,然而這些方法的缺點(diǎn)也非常明顯:1)單純地對(duì)數(shù)據(jù)進(jìn)行擬合,沒(méi)有考慮事件和故障背后的因果機(jī)制;2)模型只返回預(yù)測(cè)的根因,可解釋性很差;3)分類模型的方法很難與存在的專家領(lǐng)域知識(shí)相結(jié)合。
相反地,基于概率圖模型的方法考慮了專家知識(shí),構(gòu)建故障傳播模型(Fault Propagation Model,F(xiàn)PM)對(duì)故障和事件的關(guān)系進(jìn)行描述,在此基礎(chǔ)上采用決策算法得出對(duì)事件做出最佳解釋的故障子集。例如Gharahbagheri等人[10]使用貝葉斯網(wǎng)絡(luò)(Bayesian Network, BN)將不同的診斷知識(shí)集成并使用后驗(yàn)概率進(jìn)行推理定位,Bennacer等人[11]基于BN和實(shí)例推理相結(jié)合??紤]到系統(tǒng)中數(shù)據(jù)的時(shí)效性,一些學(xué)者采用動(dòng)態(tài)貝葉斯網(wǎng)絡(luò)(Dynamic Bayesian Network,DBN)在BN的基礎(chǔ)上對(duì)故障和事件的關(guān)系在時(shí)間維度上也進(jìn)行建模,Hu等人[12]在DBN的基礎(chǔ)上使用前向后向算法進(jìn)行故障根因推斷,Cai等人[13]基于DBN對(duì)不同來(lái)源的數(shù)據(jù)分別建模并通過(guò)多源信息融合進(jìn)行定位。Zhang等人[14-16]將定性模型與定量概率結(jié)合,利用動(dòng)態(tài)不確定因果圖(Dynamic Uncertain Causality Graph, DUCG)進(jìn)行故障定位。然而基于概率圖模型的方法高度依賴專家先驗(yàn)知識(shí),需要事前構(gòu)建故障和事件之間的因果網(wǎng)絡(luò)。對(duì)于采用負(fù)載均衡策略的電力營(yíng)銷系統(tǒng)來(lái)說(shuō),系統(tǒng)會(huì)根據(jù)當(dāng)前運(yùn)行的服務(wù)器壓力等信息進(jìn)行請(qǐng)求的分發(fā)調(diào)度,前端服務(wù)器對(duì)后端服務(wù)器的調(diào)用關(guān)系是頻繁變動(dòng)的,也就是故障和事件關(guān)系是無(wú)法確定的,也就無(wú)法對(duì)此構(gòu)建FPM。
因此,針對(duì)這種場(chǎng)景本文提出一種基于因果規(guī)則的故障定位算法,對(duì)故障數(shù)據(jù)進(jìn)行因果規(guī)則挖掘并進(jìn)一步計(jì)算故障根因的概率。本文算法考慮了故障和事件的因果機(jī)制,并且能夠柔性地加入專家知識(shí);同時(shí),不需要明確故障和事件之間因果圖的結(jié)構(gòu)并且無(wú)需學(xué)習(xí)FPM中復(fù)雜的參數(shù)。為了驗(yàn)證算法的有效性,本文選擇真實(shí)生產(chǎn)環(huán)境下的數(shù)據(jù)集進(jìn)行驗(yàn)證,實(shí)驗(yàn)結(jié)果表明該算法能夠快速準(zhǔn)確定位故障根因。
電力營(yíng)銷系統(tǒng)是一個(gè)需要大吞吐量、高并發(fā)的Web系統(tǒng),為此采用了分布式部署方案[17]以及負(fù)載均衡策略[18]。它根據(jù)業(yè)務(wù)類型拆分為營(yíng)銷主應(yīng)用、客服應(yīng)用和個(gè)性化應(yīng)用,進(jìn)行垂直方式的分布式部署,每種應(yīng)用構(gòu)成一個(gè)相對(duì)獨(dú)立的子模塊,根據(jù)用戶發(fā)出請(qǐng)求的業(yè)務(wù)類型分發(fā)到相應(yīng)的模塊(部分來(lái)自客服和個(gè)性化的前端請(qǐng)求可能被分發(fā)到主應(yīng)用的后端,如圖1)。為了進(jìn)一步提高系統(tǒng)的性能,不同的模塊內(nèi)部的前端(Web)、后端(Java)均使用多臺(tái)服務(wù)器,并且每個(gè)服務(wù)器上提供多個(gè)端口為該模塊的業(yè)務(wù)提供服務(wù)。數(shù)據(jù)庫(kù)層(DB)是不同業(yè)務(wù)模塊共用的,仍然采用多服務(wù)器多端口的形式。為了對(duì)服務(wù)器資源進(jìn)行合理分配,每一個(gè)模塊的入口和前端、前端和后端之間采用了負(fù)載均衡策略,對(duì)請(qǐng)求進(jìn)行集群分發(fā)。例如,圖1(圖中每個(gè)服務(wù)器如Web1都包含多個(gè)端口為功能請(qǐng)求提供服務(wù))中的請(qǐng)求通過(guò)負(fù)載均衡,有可能被分發(fā)到該模塊下的任一服務(wù)器。
圖1 電力營(yíng)銷系統(tǒng)的簡(jiǎn)易拓?fù)浣Y(jié)構(gòu)示意圖
定義1分布式部署。是一種通過(guò)在不同的服務(wù)器放置不同的邏輯組件(垂直分布)或者服務(wù)器在物理上分成邏輯上等效的部分,每個(gè)部分在其自己的完整數(shù)據(jù)集的共享上操作(水平分布),達(dá)到降低維護(hù)和部署難度、提高并發(fā)量、提高訪問(wèn)速度的部署方案[17]。
定義2負(fù)載均衡(Load Balancing)。是一種通過(guò)將用戶請(qǐng)求在集群之間進(jìn)行合理的調(diào)度分發(fā),達(dá)到優(yōu)化資源使用、最大化吞吐量、最小化響應(yīng)時(shí)間,并避免任何單個(gè)資源過(guò)載的計(jì)算機(jī)技術(shù)[18]。
即使采用了上述提高系統(tǒng)穩(wěn)定性與可用性的架構(gòu),電力營(yíng)銷系統(tǒng)中的服務(wù)器主機(jī)或服務(wù)器的端口發(fā)生故障,依然可能會(huì)導(dǎo)致為用戶所提供的許多相關(guān)的功能出現(xiàn)資源不可用等事件。如表1,系統(tǒng)中不同層次的服務(wù)器主機(jī)或者主機(jī)上的端口均可能發(fā)生故障。需要在觀測(cè)到事件發(fā)生時(shí),準(zhǔn)確有效地對(duì)故障原因定位到某服務(wù)器主機(jī)或服務(wù)器上某一端口。然而,在這個(gè)復(fù)雜的系統(tǒng)下,由于負(fù)載均衡策略的存在,無(wú)法得知請(qǐng)求被分發(fā)到具體主機(jī)的具體端口,大大加大了故障定位的難度。針對(duì)上述問(wèn)題的特性,本文提出一種適用于自適應(yīng)學(xué)習(xí)因果規(guī)則并進(jìn)行定位的方法,即基于因果規(guī)則的故障定位算法。
表1 故障類別
層次主機(jī)端口WebIP_a…IP_bPort_m…Port_n…Port_m…Port_nJavaIP_c…IP_dPort_m…Port_n…Port_m…Port_nDBIP_e…IP_fPort_m…Port_n…Port_m…Port_n
由于當(dāng)前基于分類模型和基于概率圖模型的方法無(wú)法準(zhǔn)確有效地解決采用負(fù)載均衡、因果結(jié)構(gòu)頻繁變動(dòng)的系統(tǒng)的故障定位問(wèn)題,因此需要提出一種因果規(guī)則的故障定位算法。本章分2個(gè)主要階段給出具體的細(xì)節(jié),即如何學(xué)習(xí)因果規(guī)則和如何基于因果規(guī)則進(jìn)行定位,最后給出整個(gè)算法(Causal Rules Fault Location Algorithm, CRFLA)的偽代碼。
在因果關(guān)系發(fā)現(xiàn)中,常常對(duì)圖2所示的典型的因果網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行討論。由于V-結(jié)構(gòu)在統(tǒng)計(jì)學(xué)角度不等同于任何其他包含相同變量的結(jié)構(gòu),與其他馬爾科夫等價(jià)類結(jié)構(gòu)相比,V-結(jié)構(gòu)在因果關(guān)系識(shí)別問(wèn)題上更具有魯棒性和可識(shí)別性[19]。事件和故障之間存在圖2(b)的V-結(jié)構(gòu)說(shuō)明故障變量f1和f2共同影響事件變量y。因此,可以通過(guò)發(fā)現(xiàn)事件和故障之間存在的V-結(jié)構(gòu)對(duì)事件發(fā)生的因果規(guī)則進(jìn)行挖掘?;赩-結(jié)構(gòu)的獨(dú)立性性質(zhì),可以使用式(1)的因果關(guān)聯(lián)興趣度度量(Causal Association Interesting Measure, CAIM)[20]規(guī)則Ij1Ij2→Ee的可能性。
(a) 馬爾科夫等價(jià)類
CAIM(Ij1Ij2→Ee)=N(f1,y)+N(f2,y)-
N(f1,f2)+N(f1,f2|y)
(1)
其中,N(f1,y)為f1和y的歸一化互信息[21]。
對(duì)于先導(dǎo)變量只有一個(gè)的因果規(guī)則Ij1→Ee,CAIM計(jì)算如式(2):
CAIM(Ij1→Ee)=N(f1,y)
(2)
對(duì)于更加普遍的先導(dǎo)變量數(shù)大于等于3的因果規(guī)則I→Ee,其必定包含若干個(gè)子規(guī)則Ij1Ij2→Ee和Ij1→Ee,并且其興趣度取決于最劣子規(guī)則。因此進(jìn)一步得到對(duì)規(guī)則I→E的廣義的興趣度度量,如式(3)。
(3)
基于CAIM進(jìn)行因果規(guī)則挖掘,可以得到每個(gè)事件e發(fā)生時(shí)可能的故障-事件規(guī)則集合Re。同時(shí),在進(jìn)行因果規(guī)則挖掘的搜索過(guò)程中,可以靈活地結(jié)合專家先驗(yàn)知識(shí)進(jìn)行剪枝。為了進(jìn)一步對(duì)系統(tǒng)進(jìn)行根因定位,在下一節(jié)提出如何利用因果規(guī)則集合進(jìn)行推斷。
上述得到的所有因果規(guī)則的先導(dǎo)變量的集合即為導(dǎo)致事件發(fā)生的可能原因的候選集,定義為I。接下來(lái),將給出如何利用因果規(guī)則進(jìn)行根因發(fā)現(xiàn)。筆者發(fā)現(xiàn)在系統(tǒng)中某個(gè)故障的發(fā)生常常導(dǎo)致許多相關(guān)事件發(fā)生,一些事件可能同時(shí)受到相同的原因節(jié)點(diǎn)影響,例如某數(shù)據(jù)庫(kù)主機(jī)發(fā)生故障可能導(dǎo)致系統(tǒng)中許多功能無(wú)法使用。因此,認(rèn)為若某個(gè)故障原因集I0在某段時(shí)間內(nèi),導(dǎo)致最多事件發(fā)生的即為根因C。根據(jù)故障原因集對(duì)發(fā)生事件集的影響程度,定義故障原因集I0是根因的可能性h(I0)的計(jì)算方式,如式(4):
(4)
其中,1為指示函數(shù),表示規(guī)則集合Re0中是否存在I0→Ee0或者樣本si是否包含I0和e0。ε0為某段時(shí)間內(nèi)發(fā)生的所有事件集合,e0為其中發(fā)生的某個(gè)事件。
由此,進(jìn)一步定義根故障原因集I0是根因的概率p(I0)以及事件的根因C,如式(5)和式(6):
(5)
(6)
因此,在第一階段得到所有事件對(duì)應(yīng)的故障原因集合R的基礎(chǔ)上,使用式(4)~式(6)對(duì)原因進(jìn)行評(píng)估并推斷得到根因。
首先給出基本的流程。第一階段:對(duì)于不同的事件e,其可能的故障原因I有多種,而每種故障原因I可能包含多個(gè)故障,共同影響事件e。于是,對(duì)每個(gè)事件的可能原因I進(jìn)行增量式搜索。根據(jù)式(1)、式(2)和式(3)判斷集合I中的所有故障是否同時(shí)是某個(gè)事件的原因節(jié)點(diǎn),若是那么I有可能導(dǎo)致事件e,那么將規(guī)則加入可能的因果規(guī)則集Re,進(jìn)而得到所有的因果規(guī)則集合R。另外,在對(duì)每個(gè)事件的原因進(jìn)行搜索時(shí),能夠結(jié)合專家先驗(yàn)知識(shí)進(jìn)行剪枝,如下的prior_rule_filter方法將與事件e無(wú)關(guān)的故障預(yù)先進(jìn)行剔除。第二階段:上一階段得到R,其所有規(guī)則的先導(dǎo)I0的集合即為故障根因的候選集。因此,根據(jù)R和樣本集S判斷每個(gè)規(guī)則在該段時(shí)間內(nèi)是否發(fā)生,使用式(4)和式(5)計(jì)算得到每個(gè)原因作為根因的概率,概率最大的原因集合即為根因。
詳細(xì)偽代碼如下:
算法 CRFLA輸入:事件集ε,故障集F;可觀測(cè)的事件-故障樣本集S與待定位的事件發(fā)生集ε0={e1,e2,…,en};最小的CAIM閾值c;輸出:故障根因集C;初始化:R=?,C=?;//第一階段FOR each e in εRe=?Fe=prior_rule_filter(e,F)FOR each item F in FeIF CAIM(F→Ee)?cR'=Re∪{F→Ee}ELSECONTINUEEND IF
FOR each rule I→Ee in ReNew Rule r=I∪{F}→EeIF CAIM(r)?cR'=R'∪{r}END IFEND FORRe=R'END FORR=R∪ReEND FOR//第二階段FOR each e0 in ε0FOR each rule I0→Ee0 in Re0FOR each si in SIF I0→Ee0 NOT occurs in siCONTINUEELSE IF Count(I0→Ee0) EXISTCount(I0→Ee0)=Count(I0→Ee0)+1ELSE//初始化Count(I0→Ee0)=1END IFEND FOREND FOREND FORFOR each itemset I0 in Rh(I0)=Count(I0→Ee0)|ε0|END FORFOR each itemset I0 in Rp(I0)=h(I0)∑Il∈Ih(Il)END FORC=arg max I0∈R p(I0)返回:事件集ε0的故障根因集C
為了評(píng)估本文提出的CRFLA算法的有效性,挑選了廣東電網(wǎng)的電力營(yíng)銷系統(tǒng)中真實(shí)生產(chǎn)環(huán)境產(chǎn)生的事件和故障數(shù)據(jù),采樣頻率為5 min/次,區(qū)間為2018年11月27日至2018年12月27日的間歇性故障[22]。實(shí)驗(yàn)環(huán)境:處理器為Xeon E5-2620 v4,內(nèi)存64 GB,Linux 64位操作系統(tǒng)的Python語(yǔ)言。
本實(shí)驗(yàn)中將CAIM閾值設(shè)為0.1,表2展示了CRFLA在本數(shù)據(jù)集上故障根因定位的結(jié)果。
表2 故障根因定位結(jié)果
故障時(shí)段開(kāi)始時(shí)刻結(jié)束時(shí)刻事件發(fā)生比例/%故障根因及概率12018/11/3023:052018/11/3023:5067.22{'營(yíng)銷Web應(yīng)用服務(wù)器2:7028'}:1.022018/12/040:002018/12/040:1513.17{'管理數(shù)據(jù)庫(kù)服務(wù)器1:1530'}:0.5,{'管理數(shù)據(jù)庫(kù)服務(wù)器2:1530'}:0.532018/12/0715:002018/12/0716:3556.51{'營(yíng)銷Web應(yīng)用服務(wù)器4:7028'}:1.042018/12/0910:552018/12/0912:3034.02{'歷史數(shù)據(jù)庫(kù)服務(wù)器2:1530'}:1.052018/12/1012:002018/12/118:5074.69{'營(yíng)銷Web應(yīng)用服務(wù)器4:7030'}:1.062018/12/2016:452018/12/2016:5574.69{'營(yíng)銷Web應(yīng)用服務(wù)器3:7030'}:1.0
從表2結(jié)果可以看出,在不同時(shí)間段能準(zhǔn)確地定位到服務(wù)器端口,并且得到的根因概率基本為1。例如,在2018/11/30 23:05至2018/11/30 23:50這段時(shí)間內(nèi),故障持續(xù)了45 min,平均有486個(gè)功能菜單無(wú)法正常使用,該故障導(dǎo)致了67.22%的功能不可用。CRFLA算法第一階段通過(guò)因果規(guī)則挖掘得到:每個(gè)事件{′營(yíng)銷Web應(yīng)用服務(wù)器2:7028′}→εe這一因果規(guī)則,這說(shuō)明這段時(shí)間內(nèi)每個(gè)事件的發(fā)生可能原因只有一個(gè);第二階段根據(jù)式(4)和式(5)計(jì)算得到{′營(yíng)銷Web應(yīng)用服務(wù)器2:7028′}為根因的概率是1.0。
為了驗(yàn)證算法的正確性,實(shí)驗(yàn)結(jié)果交由運(yùn)維工程師驗(yàn)證。同時(shí),為了進(jìn)行定量的對(duì)比實(shí)驗(yàn),根據(jù)真實(shí)的故障原因集Ct,定義故障定位的準(zhǔn)確率計(jì)算方式如式(7):
(7)
由于基于概率圖模型的方法在因果關(guān)系頻繁變動(dòng)的系統(tǒng)下無(wú)法進(jìn)行構(gòu)圖,因此與基于分類模型的方法RPCA-SVM[8]和ANN[9]進(jìn)行對(duì)比實(shí)驗(yàn),準(zhǔn)確率結(jié)果如表3所示。
從表3中可以看到,CRFLA除了故障時(shí)段2,故障定位結(jié)果都得到了100%的準(zhǔn)確率,在每個(gè)時(shí)間段的定位中均得到了最高的準(zhǔn)確率。在本數(shù)據(jù)集中,CRFLA平均準(zhǔn)確率為91.67%,和RPCA-SVM的41.67%以及ANN的69.45%相比,具有較大的提升。實(shí)驗(yàn)結(jié)果表明,CRFLA取得了最佳的效果,能夠迅速、準(zhǔn)確地定位故障根因。
表3 故障根因定位準(zhǔn)確率/%
故障時(shí)段RPCA-SVMANNCRFLA110010010025050503016.671004050100501001006100100100平均值41.6769.4591.67
表4 不同故障類別的根因定位平均準(zhǔn)確率/%
故障類別WebJavaDB平均準(zhǔn)確率100-75
為了評(píng)估不同類別的故障定位準(zhǔn)確率,進(jìn)一步計(jì)算表1中3個(gè)層次的故障定位的平均準(zhǔn)確率,結(jié)果如表4所示。根據(jù)電力營(yíng)銷系統(tǒng)的拓?fù)浣Y(jié)構(gòu)可知,上述3種類別的故障發(fā)生具有傳遞關(guān)系。Web類型的故障更加直接地導(dǎo)致事件發(fā)生,而Java和DB則具有更加復(fù)雜的關(guān)系。因此,可以得到Web類型的故障更容易進(jìn)行定位,其準(zhǔn)確率最高,達(dá)到100%,DB次之(注意,表4中,由于Java類別的故障在該數(shù)據(jù)中恰好沒(méi)有發(fā)生,故用“-”表示)。
本文提出了一種基于因果規(guī)則的故障定位算法CRFLA,該方法能夠解決負(fù)載均衡帶來(lái)的故障因果關(guān)系頻繁變動(dòng)的復(fù)雜系統(tǒng)的故障定位問(wèn)題,有效避免了根因無(wú)法解釋和專家先驗(yàn)知識(shí)匱乏無(wú)法提前構(gòu)建因果網(wǎng)絡(luò)的問(wèn)題,在考慮故障與事件的因果關(guān)系的同時(shí)可以靈活地結(jié)合專家先驗(yàn)知識(shí)。將算法應(yīng)用在廣東電網(wǎng)的電力營(yíng)銷系統(tǒng)的真實(shí)數(shù)據(jù)上,實(shí)驗(yàn)結(jié)果表明本文方法能夠?qū)崿F(xiàn)準(zhǔn)確、高效的故障定位。