SQL請(qǐng)求行為識(shí)別新功能上線,幫助解決異常SQL檢測(cè)之大海撈針問(wèn)題
業(yè)務(wù)背景:
DAS(Database autonomy service)為上百萬(wàn)數(shù)據(jù)庫(kù)實(shí)例的穩(wěn)定運(yùn)行保駕護(hù)航,其中精準(zhǔn)定位數(shù)據(jù)庫(kù)運(yùn)行過(guò)程中的異常SQL是DAS最基本的功能。數(shù)據(jù)庫(kù)90%以上的問(wèn)題都來(lái)源于數(shù)據(jù)庫(kù)的異常請(qǐng)求,無(wú)論是雙十一的集團(tuán)海量交易請(qǐng)求行為,還是用戶業(yè)務(wù)變化的請(qǐng)求行為,每時(shí)每刻都影響著數(shù)據(jù)庫(kù)的性能。自動(dòng)駕駛汽車(chē)通過(guò)感知路況圖像變化的行為來(lái)掌握車(chē)的方向,而自動(dòng)駕駛數(shù)據(jù)庫(kù)通過(guò)感知和識(shí)別用戶請(qǐng)求行為來(lái)不斷修復(fù)優(yōu)化數(shù)據(jù)庫(kù)的各種問(wèn)題,為云數(shù)據(jù)庫(kù)保駕護(hù)航。如何從海量數(shù)據(jù)庫(kù)中的海量請(qǐng)求定位出不同數(shù)據(jù)庫(kù)引擎不同場(chǎng)景的問(wèn)題是多年以來(lái)困擾DBA的難題。在推薦領(lǐng)域,通過(guò)分析用戶的行為習(xí)慣代替了機(jī)械式網(wǎng)頁(yè)展示精準(zhǔn)推薦給用戶期望的文字/視頻/產(chǎn)品,提升用戶體驗(yàn)和產(chǎn)品轉(zhuǎn)化率,同樣下一代數(shù)據(jù)庫(kù)自動(dòng)駕駛平臺(tái)也需要分析用戶請(qǐng)求行為,用戶開(kāi)發(fā)業(yè)務(wù)行為,推薦出相應(yīng)優(yōu)化修復(fù)擴(kuò)容等操作,提升自動(dòng)駕駛數(shù)據(jù)庫(kù)的效率,讓數(shù)據(jù)庫(kù)更快更穩(wěn)更安全。所以從用戶請(qǐng)求行為和業(yè)務(wù)行為出發(fā),在海量數(shù)據(jù)庫(kù)實(shí)例的海量請(qǐng)求中進(jìn)行數(shù)據(jù)挖掘是一個(gè)非常值得深入研究的課題,同時(shí)也是數(shù)據(jù)庫(kù)自動(dòng)駕駛平臺(tái)非常依賴的底層技術(shù)能力, 向上支撐DAS數(shù)據(jù)庫(kù)自治服務(wù)各個(gè)場(chǎng)景的自治能力。
DAS這這些年提供了多個(gè)對(duì)SQL數(shù)據(jù)進(jìn)行分析的L2功能包括:專業(yè)版SQL洞察,全量SQL,慢日志, 一鍵診斷, 鎖分析,會(huì)話等。每一個(gè)功能沉淀了DBA在不同角度分析不同問(wèn)題的方法,不同實(shí)例,不同業(yè)務(wù)診斷問(wèn)題的方法略有不同。對(duì)于并不是很熟悉DB運(yùn)維的用戶來(lái)說(shuō),DAS在提供一個(gè)統(tǒng)一高效簡(jiǎn)單的方式去幫助用戶去定位問(wèn)題。我們結(jié)合SQL變慢的多指標(biāo)特征,提出一種基于特征相似度匹配的方法 VLDB 2020 沉淀到自治中心功能當(dāng)中, 但對(duì)于異常SQL中存在的業(yè)務(wù)屬性的相似性以及錯(cuò)綜復(fù)雜的影響與被影響的關(guān)系,理清楚問(wèn)題SQL與各種資源的異常現(xiàn)象的傳播關(guān)系是具有挑戰(zhàn)的問(wèn)題,DAS團(tuán)隊(duì)仍然在如何找到異常SQL這個(gè)課題上繼續(xù)進(jìn)行了研究和探索,在探索的過(guò)程中我們提供了一個(gè)新的分析功能SQL請(qǐng)求行為識(shí)別幫助用戶更好的定位SQL問(wèn)題。
問(wèn)題描述:
以下圖為例,實(shí)例CPU出現(xiàn)尖刺突增的現(xiàn)象,數(shù)據(jù)庫(kù)有cpu打滿潛在風(fēng)險(xiǎn),當(dāng)用戶的請(qǐng)求量較少或者請(qǐng)求的SQL模式較少的時(shí)候,通過(guò)指標(biāo)的排序篩選是很容易找到問(wèn)題SQL的,但當(dāng)用戶的全量SQL模板超過(guò)上萬(wàn)甚至上億條,用戶通過(guò)當(dāng)前DAS頁(yè)面無(wú)法快速定位異常SQL,我們需要通過(guò)更多數(shù)據(jù)提供更高效的方式,來(lái)定位異常請(qǐng)求。
當(dāng)用戶使用DAS專業(yè)版SQL洞察的功能的時(shí)候,即使我們將全量SQL流水,壓縮聚合成模板,模板的數(shù)量也是驚人的,我們可以看到大量特征趨勢(shì)相近的模板。所以如果我們根據(jù)SQL的請(qǐng)求行為將模板進(jìn)一步壓縮,這樣用戶可以更好的定位異常SQL的問(wèn)題。
目前DAS產(chǎn)品功能和業(yè)界AWS Azure等其他產(chǎn)品都有初步的異常SQL定位能力,通過(guò)對(duì)采集的SQL數(shù)據(jù)在各個(gè)維度的排序,讓用戶自己定位數(shù)據(jù)庫(kù)問(wèn)題,這種方式對(duì)于80%以上簡(jiǎn)單的數(shù)據(jù)庫(kù)問(wèn)題是有效的,但是在復(fù)雜業(yè)務(wù)場(chǎng)景和DBA都很難定位的數(shù)據(jù)庫(kù)問(wèn)題效果是很差的。以阿里云內(nèi)部管控的元數(shù)據(jù)庫(kù)集群實(shí)例為例,今年平均每月發(fā)生10多次的CPU打滿問(wèn)題,全年發(fā)生數(shù)次性能相關(guān)的故障問(wèn)題,但是每次的問(wèn)題都不同,有時(shí)候DBA只能找到現(xiàn)象,難以快速定位問(wèn)題根因。所以通過(guò)對(duì)用戶請(qǐng)求行為的分析,會(huì)更好的迭代DAS數(shù)據(jù)庫(kù)自治服務(wù)產(chǎn)品,解決我們復(fù)雜場(chǎng)景的數(shù)據(jù)庫(kù)性能問(wèn)題,提高整個(gè)數(shù)據(jù)庫(kù)各個(gè)引擎的穩(wěn)定性,易用性,效率。
業(yè)界產(chǎn)品:
AWS: RDS: Performance Insight
和目前DAS產(chǎn)品功能一樣,采集的數(shù)據(jù)維度類(lèi)似,通過(guò)Top N ranking的方式進(jìn)行異常SQL定位,沒(méi)有SQL請(qǐng)求行為分析功能
Azure: Query Performance Insight
通過(guò)取Top N的方式對(duì)SQL請(qǐng)求進(jìn)行定位,可以定位到60%的明顯問(wèn)題,但是無(wú)法定位SQL請(qǐng)求復(fù)雜業(yè)務(wù)的數(shù)據(jù)庫(kù)問(wèn)題,沒(méi)有SQL請(qǐng)求行為分析功能
騰訊云:DB Brain功能,和目前DAS現(xiàn)有功能類(lèi)似,沒(méi)有SQL請(qǐng)求行為分析功能
華為云:Database Admin Service,和目前DAS現(xiàn)有功能類(lèi)似,沒(méi)有SQL請(qǐng)求行為分析功能
挑戰(zhàn)&難點(diǎn)
Challenges:
規(guī)?;魬?zhàn):
The sea of performance issues in the sea of queries from the sea of the databases
用戶的業(yè)務(wù)請(qǐng)求豐富,如何從海量數(shù)據(jù)庫(kù)實(shí)例中的海量請(qǐng)求中定位多種數(shù)據(jù)庫(kù)引擎的性能問(wèn)題。
監(jiān)控診斷挑戰(zhàn):
7*24 real time anomaly detection => 7*24 root cause analysis in near real time
針對(duì)潛在的SQL請(qǐng)求導(dǎo)致的數(shù)據(jù)庫(kù)性能問(wèn)題,根因定位需要做到近實(shí)時(shí)問(wèn)題定位。
繁雜的數(shù)據(jù)庫(kù)異?,F(xiàn)象:
異常指標(biāo)通常與多條SQL請(qǐng)求有關(guān),無(wú)法用單條SQL來(lái)解釋異常原因且多個(gè)業(yè)務(wù)的SQL請(qǐng)求之間相互影響,關(guān)聯(lián)的問(wèn)題包括全表掃描/索引/鎖問(wèn)題/緩存擊穿/內(nèi)核問(wèn)題等。多個(gè)問(wèn)題在指標(biāo)現(xiàn)象存在相似性和不同Motivations:
人工根因定位:
幫助DBA或用戶解決性能問(wèn)題,工單問(wèn)題
幫助后端開(kāi)發(fā)人員合理安排請(qǐng)求查詢的流程,盡量讓資源密集型請(qǐng)求從業(yè)務(wù)角度打散
幫助DBA找到不同請(qǐng)求之間在業(yè)務(wù)層面直接和間接的關(guān)系。
賦能自治服務(wù):
更加精細(xì)化的限流: Limit anomalous SQL more meticulous
更加準(zhǔn)確對(duì)workload預(yù)測(cè): Forecast workload more accurate
更好的劃分workload: Workload can be well-partitioned
更好的預(yù)估自治操作的資源收益: Estimate the SQL Resource Cost for autonomous actions
在第一時(shí)間解決潛在的性能問(wèn)題:Crack the potential performance issue at the first place
DAS解決方案:
啟發(fā)思路:
在很多后端應(yīng)用開(kāi)發(fā)的過(guò)程中,后端架構(gòu)設(shè)計(jì)往往會(huì)保證接口的冪等性,例如項(xiàng)目中為了解決timeout問(wèn)題,通常會(huì)引入重試機(jī)制,有時(shí)候會(huì)請(qǐng)求重復(fù)數(shù)據(jù),消費(fèi)消息有時(shí)候讀重復(fù)數(shù)據(jù)之類(lèi)的冪等性問(wèn)題。例如多次insert或update可能會(huì)造成數(shù)據(jù)錯(cuò)誤。
為了解決這些冪等性的方法,后端通常會(huì)使用這些方式例如 先select再insert,加悲觀鎖/樂(lè)觀鎖/分布式鎖,或者根據(jù)狀態(tài)機(jī)來(lái)管理有狀態(tài)的業(yè)務(wù)。
支付場(chǎng)景狀態(tài)機(jī)示例:
......
update `bill` set status=1 where id=520 and status=0;
下單行為 SQL A
update `bill` set status=2 where id=520 and status=1;
支付行為 SQL B
update `bill` set status=3 where id=520 and status=2;
取消訂單行為 SQL C
.....
所以同一個(gè)業(yè)務(wù)流程會(huì)伴隨這多個(gè)SQL請(qǐng)求,串行或并行,這就意味著這些SQL在執(zhí)行趨勢(shì)上存在這關(guān)聯(lián)性,這種關(guān)聯(lián)性和業(yè)務(wù)有關(guān)。當(dāng)我們發(fā)現(xiàn)業(yè)務(wù)異常的時(shí)候,同時(shí)伴隨這指標(biāo)異常,所以當(dāng)我們定位異常SQL的時(shí)候,同一業(yè)務(wù)下的SQL都會(huì)有異常現(xiàn)象,所以通過(guò)這些SQL的趨勢(shì)特征我們可以將海量SQL數(shù)據(jù)進(jìn)行通過(guò)算法進(jìn)行聚類(lèi)。所以我們想到通過(guò)分析SQL的同源性,站在業(yè)務(wù)視角來(lái)定位異常SQL,可以更有效率的定位異常SQL
流程框架:
感知過(guò)程:
在診斷的過(guò)程中,DAS后端首先從統(tǒng)一數(shù)據(jù)層(DataSet Layer)請(qǐng)求,性能數(shù)據(jù)(Perf Data)和SQL請(qǐng)求數(shù)據(jù)(SQL Query Data),性能數(shù)據(jù)通過(guò)多指標(biāo)異常檢測(cè)(MTS Anomaly Detection)/特征提取(Feature Extraction)
異常請(qǐng)求定位過(guò)程:
示例:
模板集合X:{sql_a , sql_b, sql_c} ==> 影響了 mysql.cpu_usage 指標(biāo)變化
==>sql 集合的影響程度 (推算cpu_time占比)
模板集合Y: {sql_i , sql_j, sql_k } ==> 影響了 mysql.active_session 指標(biāo)變化
==> sql 集合的影響程度 (推算session占比)
感知層感知到時(shí)序指標(biāo)異常后,通過(guò)全量SQL經(jīng)過(guò)模板化處理后的數(shù)據(jù),運(yùn)用Graph Based的聚類(lèi)方法,將海量的SQL按照請(qǐng)求行為的特征進(jìn)行劃分,最后根據(jù)聚合后請(qǐng)求行為的貢獻(xiàn)度評(píng)分進(jìn)行排序(Query Behavior Ranking),檢測(cè)異常請(qǐng)求及其作用于性能指標(biāo)的現(xiàn)象.
根因分析過(guò)程:
示例:
爛SQL模板 sql_i --> 造成了鎖等待現(xiàn)象---> 影響了mysql.rows_lock_wait_time指標(biāo)
--> 造成模板Y集合的SQL被阻塞 --> 造成session的突增
--> 被阻塞的Y集合中X集合中的CPU密集型SQL被阻塞 --> 造成了CPU突增
通過(guò)SQL解釋了指標(biāo)異?,F(xiàn)象之后,還有很多故障問(wèn)題我們無(wú)法精確定位,例如主備延遲,鎖問(wèn)題,OOM,內(nèi)核問(wèn)題等,這些問(wèn)題可能導(dǎo)致了執(zhí)行SQL的耗時(shí)增加,反過(guò)來(lái),SQL也有可能產(chǎn)生這些問(wèn)題的現(xiàn)象。
(Anomaly Propagation Analysis )幫助我們對(duì)這些現(xiàn)象之間,進(jìn)行傳播關(guān)系的分析。這里的分析我們通過(guò)時(shí)間先后關(guān)系結(jié)合我們歷史案例數(shù)據(jù)綜合進(jìn)行比對(duì), 最后將得出的異常傳播鏈和整個(gè)DAS分析過(guò)程和建議并添加到后端的case庫(kù)并更細(xì)case model。Case Model會(huì)根據(jù)反饋不斷疊加調(diào)整匹配參數(shù),給出更精準(zhǔn)的建議。
基于請(qǐng)求行為識(shí)別的異常SQL定位案例:
定位會(huì)話(active_session)突增尖刺問(wèn)題:
下圖數(shù)據(jù)庫(kù)實(shí)例活躍會(huì)話有異常的尖刺,這種尖刺持續(xù)時(shí)間過(guò)長(zhǎng),對(duì)一些敏感業(yè)務(wù)會(huì)有造成潛在的問(wèn)題,我們想要定位尖刺的原因,首先DAS的實(shí)時(shí)異常檢測(cè)可以檢測(cè)出多指標(biāo)的異常時(shí)間段。對(duì)于CPU,活躍會(huì)話異常的檢測(cè)會(huì)透?jìng)鞒鳇S色異常事件的提示。
活躍會(huì)話通常和總執(zhí)行耗時(shí)強(qiáng)相關(guān),通過(guò)SQL請(qǐng)求行為分析選擇對(duì)應(yīng)指標(biāo),并點(diǎn)擊分析
找到和會(huì)話相似的指標(biāo),并點(diǎn)擊查看,按照總耗時(shí)排序,可以找到對(duì)會(huì)話異常"貢獻(xiàn)"最大的異常SQL,
點(diǎn)擊對(duì)應(yīng)SQL_ID 查看詳情,通過(guò)趨勢(shì)行為ranking的結(jié)果,可以清楚的看到這個(gè)SQL變慢了和歷史趨勢(shì)相比變慢了。通過(guò)執(zhí)行趨勢(shì)可以看到異常趨勢(shì)和歷史趨勢(shì)完全不同,且與活躍會(huì)話異常的趨勢(shì)相吻合
最終定位:這條SQL執(zhí)行次數(shù)突增(從1000次執(zhí)行超過(guò)8000多次),導(dǎo)致其他SQL執(zhí)行耗時(shí)變慢,造成了活躍會(huì)話堆積產(chǎn)生了active_session指標(biāo)突增現(xiàn)象
CPU打滿(cpu_usage)突增問(wèn)題:
下圖數(shù)據(jù)庫(kù)實(shí)例CPU被打滿,
除了SQL設(shè)計(jì)CPU密集型計(jì)算諸如join,等比較昂貴的操作外,絕大部分情況,CPU和掃描行數(shù)成正相關(guān),在SQL請(qǐng)求行為分析選擇,cpu_usage和總掃描行數(shù),
我們比較容易定位到和CPU關(guān)聯(lián)的指標(biāo)
最終定位:這條全表掃描的SQL,造成了CPU被打滿從而導(dǎo)致了會(huì)話的堆積
未來(lái)計(jì)劃
DAS會(huì)支持更多引擎的實(shí)時(shí)檢測(cè)和異常定位,專業(yè)版結(jié)合用戶的全量SQL幫助更多用戶定位更多類(lèi)型的數(shù)據(jù)庫(kù)實(shí)例問(wèn)題。不僅讓專業(yè)DBA更好的使用DAS管控?cái)?shù)據(jù)庫(kù)實(shí)例,也讓數(shù)據(jù)庫(kù)領(lǐng)域的初學(xué)者無(wú)門(mén)檻的管控?cái)?shù)據(jù)庫(kù),真正保證數(shù)據(jù)庫(kù)實(shí)例自感知,自優(yōu)化,自修復(fù)。