搭建大規(guī)模高性能的時(shí)間序列大數(shù)據(jù)平臺(tái)
標(biāo)題文本,正文級(jí)別 1,正文級(jí)別 2,正文級(jí)別 3,正文級(jí)別 4,正文級(jí)別 5,#,搭建基于時(shí)序數(shù)據(jù)的大型監(jiān)測(cè)系統(tǒng),Facebook Engineering,Manager,運(yùn)維里的監(jiān)測(cè),基于時(shí)序數(shù)據(jù)的監(jiān)控和警報(bào),檢測(cè),隔離,查障,修復(fù),實(shí)時(shí)監(jiān)測(cè)系統(tǒng),三個(gè)挑戰(zhàn)和應(yīng)對(duì),監(jiān)測(cè)系統(tǒng)的基本架構(gòu),智能監(jiān)測(cè),典型監(jiān)測(cè)系統(tǒng)規(guī)模,1 per second,三萬(wàn)臺(tái)虛擬機(jī),幾百萬(wàn)臺(tái)服務(wù)器,每秒搜集三百萬(wàn)個(gè)數(shù)據(jù)點(diǎn),每秒搜集,20,億個(gè)數(shù)據(jù)點(diǎn),每秒搜集,15,億個(gè)數(shù)據(jù)點(diǎn),存儲(chǔ)一個(gè)億的時(shí)序數(shù)列,存儲(chǔ)超兩百億的時(shí)序數(shù)列,實(shí)時(shí)監(jiān)控五千個(gè)告警,實(shí)時(shí)監(jiān)控一百萬(wàn)個(gè)告警,六個(gè)工程師,十二個(gè)工程師,id,(,時(shí)間,1,,,測(cè)量值,1,),(,時(shí)間,2,,,測(cè)量值,2,),(,時(shí)間,3,,,測(cè)量值,3,),,用于監(jiān)測(cè)目的的時(shí)序數(shù)列,(time-series),id,可以有不同的定義,(Pinterest),數(shù)列名字,+,多個(gè),(key,value),對(duì),E.g.,cpu.usagehost=foo,(Facebook),entity,+key,E.g.,entity=host,1,key=cpu.usage,每一個(gè)獨(dú)特的,key/value,(,或,entity/key),組合對(duì)應(yīng)了一個(gè)時(shí)序數(shù)列,時(shí)序數(shù)列的定義,典型的基于時(shí)序系列的,監(jiān),測(cè),系統(tǒng),架構(gòu),消息總線,(message-bus),數(shù)據(jù)的,實(shí)時(shí),整合和采樣,告,警系統(tǒng),數(shù)據(jù),可視化和,查詢,虛擬機(jī),服務(wù)器,代理,(agent),虛擬機(jī),服務(wù)器,代理,(agent),虛擬機(jī),服務(wù)器,代理,(agent),時(shí)序數(shù)據(jù)庫(kù),(,TSDB,),典型的監(jiān)測(cè)系統(tǒng),三個(gè)挑戰(zhàn)和應(yīng)對(duì),智能監(jiān)測(cè),三個(gè)挑戰(zhàn),海量的測(cè)量數(shù)據(jù)需要高吞吐量和大容量的存儲(chǔ)方案,系統(tǒng)可靠性要高,讀數(shù)據(jù)要快,必須能模糊搜索,可伸縮性和可靠性,使用者對(duì)監(jiān)測(cè)系統(tǒng)的濫用,成本,Pinterest,的分片分級(jí)存儲(chǔ),TSDB(,最近,2,小時(shí),),TSDB(,無(wú)限期,),WWW,服務(wù)器和,API,服務(wù)器產(chǎn)生的數(shù)據(jù),Java,服務(wù)產(chǎn)生的數(shù)據(jù),互為備份,TSDB(,最近,2,小時(shí),),TSDB(,無(wú)限期,),互為備份,數(shù)據(jù),可視化和,查詢,Router,(,根據(jù)各,TSDB,集群反饋的指標(biāo)選擇最佳集群,),當(dāng)前負(fù)載,查詢成功率,查詢延遲,Facebook,的分層存儲(chǔ),數(shù)據(jù)的寫入,內(nèi)存,TSDB,(,最近,26,小時(shí),),Flash,TSDB,(,最近,14,天,),Thrift+Hbase,(,無(wú)限期,),Hbase,周期性任務(wù),加大舊數(shù)據(jù)的時(shí)間間隔,壓縮掉,不常用的維度,內(nèi)存時(shí)序數(shù)據(jù)庫(kù),(in-memory TSDB),Gorilla,是,Facebook,開(kāi)源的內(nèi)存,TSDB,利用時(shí)序數(shù)據(jù)的冗余做到,12,倍的壓縮率,數(shù)據(jù)的查詢響應(yīng)時(shí)間從幾秒降低到,0.1,秒,文章發(fā)表于,VLDB 2015,。,Github,上的開(kāi)源代號(hào)為,Beringei,多個(gè)公司,(,如,Twitter,Pinterest,),基于,Gorilla,的思想,,,獨(dú)立開(kāi)發(fā)了自己的內(nèi)存,TSDB,數(shù)據(jù)的預(yù)聚合,(pre-aggregation),(,時(shí)間,1,,,測(cè)量值,1,),(,時(shí)間,2,,,測(cè)量值,2,),(,時(shí)間,3,,,測(cè)量值,3,),,服務(wù)器,1,(,時(shí)間,1,,,測(cè)量值,1,),(,時(shí)間,2,,,測(cè)量值,2,),(,時(shí)間,3,,,測(cè)量值,3,),,服務(wù)器,2,(,時(shí)間,1,,,測(cè)量值,1,),(,時(shí)間,2,,,測(cè)量值,2,),(,時(shí)間,3,,,測(cè)量值,3,),,服務(wù)器,3,集,群,預(yù)聚合,集群,(,時(shí)間,1,,,最大測(cè)量值,1,),(,時(shí)間,2,,,最大測(cè)量值,2,),(,時(shí)間,3,,,最大測(cè)量值,3,),,集群,(,時(shí)間,1,,,最小測(cè)量值,1,),(,時(shí)間,2,,,最小測(cè)量值,2,),(,時(shí)間,3,,,最小測(cè)量值,3,),,集群,(,時(shí)間,1,,,平均測(cè)量值,1,),(,時(shí)間,2,,,平均測(cè)量值,2,),(,時(shí)間,3,,,平均測(cè)量值,3,),,預(yù)聚合把高維度的時(shí)序數(shù)據(jù)壓縮成低維度,,,同時(shí)保留統(tǒng)計(jì)意義,。,減少存儲(chǔ)壓力并加快查詢速度,數(shù)據(jù)的預(yù)聚合,-,Facebook,版本,按集群,或,服務(wù)的預(yù)聚合,按數(shù)據(jù)中心的預(yù)聚合,數(shù)據(jù)的預(yù)聚合,Pinterest,版本,實(shí)時(shí)計(jì)算,存儲(chǔ),存儲(chǔ),用戶界面和,API,數(shù)據(jù)來(lái)源,聚合的時(shí)序數(shù)據(jù)庫(kù),原始的時(shí)序數(shù)據(jù)庫(kù),Kafka,學(xué)習(xí)預(yù)聚合規(guī)則,評(píng)估預(yù)聚合規(guī)則的效率,預(yù)聚合規(guī)則,我學(xué)習(xí)到如下規(guī)則,:,沒(méi)有人查詢集群,A,里的單機(jī),CPU,利用率,,,所以可以只保留集群,A,的總體,CPU,利用率,關(guān)于集群,A,的總體,CPU,利用率,,,必須計(jì)算最大和平均值,有人查詢了集群,B,里的單機(jī),CPU,利用率,,,所以不能對(duì)集群,B,做聚合,用戶查詢數(shù)據(jù)的日志,7,月,1,號(hào),15:30,查詢集群,A,的最大單機(jī),CPU,利用率,7,月,1,號(hào),17:00,查詢集群,A,的平均單機(jī),CPU,利用率,7,月,1,號(hào),18:00,列出集群,B,的所有單機(jī),CPU,利用率,7,月,1,號(hào),18:10,查詢集群,B,的最小單機(jī),CPU,利用率,Kafka,原始時(shí)序數(shù)據(jù)的寫入,預(yù)聚合規(guī)則學(xué)習(xí)器,實(shí)時(shí)數(shù)據(jù)的聚合,時(shí)序,數(shù)據(jù)庫(kù),規(guī)則,三個(gè)時(shí)序數(shù)列被聚合成三個(gè),,,壓縮比為,1,預(yù)聚合規(guī)則的效率,(,時(shí)間,1,,,測(cè)量值,1,),(,時(shí)間,2,,,測(cè)量值,2,),(,時(shí)間,3,,,測(cè)量值,3,),,服務(wù)器,1,(,時(shí)間,1,,,測(cè)量值,1,),(,時(shí)間,2,,,測(cè)量值,2,),(,時(shí)間,3,,,測(cè)量值,3,),,服務(wù)器,2,(,時(shí)間,1,,,測(cè)量值,1,),(,時(shí)間,2,,,測(cè)量值,2,),(,時(shí)間,3,,,測(cè)量值,3,),,服務(wù)器,3,集,群,預(yù)聚合,集群,(,時(shí)間,1,,,最大測(cè)量值,1,),(,時(shí)間,2,,,最大測(cè)量值,2,),(,時(shí)間,3,,,最大測(cè)量值,3,),,集群,(,時(shí)間,1,,,最小測(cè)量值,1,),(,時(shí)間,2,,,最小測(cè)量值,2,),(,時(shí)間,3,,,最小測(cè)量值,3,),,集群,(,時(shí)間,1,,,平均測(cè)量值,1,),(,時(shí)間,2,,,平均測(cè)量值,2,),(,時(shí)間,3,,,平均測(cè)量值,3,),,只有壓縮比大于,1,的聚合規(guī)則才有意義,原始維度過(guò)小的時(shí)序列不需要預(yù)聚合,詮釋數(shù)據(jù),(meta-data),時(shí)序數(shù)據(jù)庫(kù),消息總線,實(shí)時(shí)數(shù)據(jù)導(dǎo)入和預(yù)處理模塊,時(shí)序數(shù)據(jù),+,數(shù)據(jù)名,map,時(shí)序數(shù),新時(shí)序數(shù)列的詮釋數(shù)據(jù),,,包括,key/value,或,entity/key,,,以及產(chǎn)生時(shí)間,詮釋數(shù)據(jù)的索引和管理,用途,:,用戶可以用詮釋數(shù)據(jù)模糊查詢相關(guān)的時(shí)序數(shù)列,案例,:,(1),已知機(jī)器名是,key,查詢所有機(jī)器名是,foo,的時(shí)序數(shù)據(jù),(2),列出所有指標(biāo)名含有,error,的時(shí)序數(shù)據(jù),(3),找出過(guò)去一個(gè)小時(shí)內(nèi)所有新產(chǎn)生的時(shí)序數(shù)據(jù),可伸縮性和可靠性,使用者對(duì)監(jiān)測(cè)系統(tǒng)的濫用,成本,極少量的有用數(shù)據(jù),(,5%,),,大量的冗余無(wú)用數(shù)據(jù),少數(shù)指標(biāo)產(chǎn)生過(guò)量的垃圾數(shù)據(jù),,,威脅數(shù)據(jù)庫(kù)穩(wěn)定,少量昂貴的查詢可能影響系統(tǒng)的性能,監(jiān)測(cè)系統(tǒng)被用于關(guān)鍵服務(wù)的一環(huán),反垃圾,(,anti-spam,),數(shù)據(jù),虛擬機(jī),服務(wù)器,代理,(agent),虛擬機(jī),服務(wù)器,代理,(agent),虛擬機(jī),服務(wù)器,代理,(agent),消息總線,按指標(biāo)名,/,集群名,/,服務(wù)名,等各種維度統(tǒng)計(jì)當(dāng)前時(shí)間窗口里的數(shù)據(jù)量,,,并和過(guò)去的時(shí)間窗口對(duì)比,。,如果發(fā)現(xiàn)有突發(fā)的爆炸性增長(zhǎng),,,制定垃圾數(shù)據(jù)的黑名單,。,實(shí)時(shí)的數(shù)據(jù)分析器,垃圾數(shù)據(jù)的黑名單,配置參數(shù),配置參數(shù),配置參數(shù),把垃圾數(shù)據(jù)黑名單加入到,服務(wù)器代理的配置參數(shù)里,垃圾數(shù)據(jù)的探測(cè)不需要,100%,準(zhǔn)確,,,可以通過(guò)采樣降低數(shù)據(jù)處理量,Zookeeper,很可能成為瓶頸,Facebook,利用了基于,Zookeeper,開(kāi)發(fā)出的,Zeus,(,鏈接,),Pinterest,讓程序不直接和,Zookeeper,建立,TCP,連接,(,鏈接,),已被過(guò)濾掉的垃圾數(shù)據(jù),,,應(yīng)該找到并修改相應(yīng)的代碼,。,不然傳送垃圾數(shù)據(jù)會(huì)浪費(fèi)服務(wù)器的資源,反垃圾數(shù)據(jù)自身的可伸縮性,(scalability),對(duì)昂貴查詢的防范,昂貴查詢通常要對(duì)多個(gè)維度的,,,大量的時(shí)序數(shù)據(jù)做查詢和計(jì)算,,,導(dǎo)致整個(gè),TSDB,集群的變慢和不穩(wěn)定,例如,,“,整個(gè),US-1,數(shù)據(jù)中心的平均服務(wù)器,CPU,使用率是多少,?”,防范措施,Facebook,有另一套基于采樣和內(nèi)存的實(shí)時(shí)數(shù)據(jù)查詢系統(tǒng),Scuba,執(zhí)行查詢前,,,利用,meta-data,的索引預(yù)估該查詢需要讀入的數(shù)據(jù)量,。,超過(guò)一定閾值時(shí),,,禁止其被服務(wù),監(jiān)測(cè)系統(tǒng)被引入關(guān)鍵服務(wù)本身的設(shè)計(jì),危險(xiǎn),!,時(shí)序,數(shù)據(jù)庫(kù),真實(shí)案例,1,CPU,利用率,某關(guān)鍵服務(wù)的,auto-scaling,,,用,該服務(wù)的,CPU,利用率來(lái)決定資源的增減,時(shí)序,數(shù)據(jù)庫(kù),真實(shí)案例,2,如果上游服務(wù)的,成功率低于,80%,,,發(fā)出警報(bào),某關(guān)鍵服務(wù)收到該警報(bào)后,,,自動(dòng)重啟,監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)目標(biāo)一般是可擴(kuò)展性,,,但允許極少量的數(shù)據(jù)丟失,監(jiān)測(cè)系統(tǒng)的自身復(fù)雜性導(dǎo)致了其可靠性往往低于關(guān)鍵服務(wù)的期望值,應(yīng)對(duì),搭建多個(gè)獨(dú)立監(jiān)測(cè)系統(tǒng),,,用冗余換取高可靠性,和關(guān)鍵服務(wù)的開(kāi)發(fā)者加強(qiáng)溝通,,,關(guān)鍵服務(wù)必須在監(jiān)測(cè)系統(tǒng)失效時(shí)有備份方案,可伸縮性,和可靠性,使用者對(duì)監(jiān)測(cè)系統(tǒng)的濫用,成本,數(shù)據(jù)的不可刪除性對(duì)存儲(chǔ)資源的壓力,實(shí)時(shí)性對(duì)計(jì)算資源的壓力,監(jiān)測(cè)系統(tǒng)本身的復(fù)雜性對(duì)運(yùn)維人員資源的壓力,降低檢測(cè)系統(tǒng)的成本,Gorilla,集群,Gorilla,冗余集群,1,Gorilla,冗余集群,2,HDFS,WBL(Write-behind logs),WBL,WBL,數(shù)據(jù)的適度拷貝,左邊的架構(gòu)中,,,WBL,有,9,份拷貝,!,把,WBL,挪到,LogDevice,后只需,3,份拷貝,慎用通用型的,Key/Value,數(shù)據(jù)庫(kù),通用型的,Key/Value,數(shù)據(jù)庫(kù)在存儲(chǔ)時(shí)序數(shù)列時(shí)較低效,Purpose-built,TSDB,更有潛力,根據(jù)數(shù)據(jù)的使用規(guī)律采用不同成本的存儲(chǔ)方案,前面的,meta-data,可用于此目的,監(jiān)測(cè)系統(tǒng)的基本架構(gòu),三個(gè)挑戰(zhàn)和應(yīng)對(duì),智能監(jiān)測(cè),智能監(jiān)測(cè)系統(tǒng),傳統(tǒng)監(jiān)測(cè)系統(tǒng),數(shù)據(jù)的采集,,,存儲(chǔ),系統(tǒng)的可伸縮性和可靠性,智能監(jiān)測(cè)系統(tǒng),從海量數(shù)據(jù)里迅速地提取有價(jià)值的信息以用于故障的發(fā)現(xiàn)和修復(fù),異常檢測(cè),+,警報(bào)系統(tǒng),Fac,ebook,的異常檢測(cè)采用了以色列,Anodot,公司的算法引擎,異常檢測(cè)產(chǎn)生告警,傳統(tǒng)人工方式產(chǎn)生告警,異常檢測(cè),單個(gè)時(shí)序數(shù)列的異常,異常檢測(cè),多個(gè)時(shí)序數(shù)列的異常,Anodot,的異常檢測(cè)基于,s,emi-supervised,,,單個(gè)多個(gè)時(shí)序數(shù)列混合的機(jī)器學(xué)習(xí)方法,告警,(alert),疲勞,大量的冗余告警,Facebook,的告警系統(tǒng)里有一百萬(wàn)個(gè)告警,!,告警的參數(shù)很難精確校準(zhǔn),極易造成,false positive,和,false negative,告警疲勞的對(duì)策,告警的合并,合并同一時(shí)間段內(nèi)相同目的地的告警,合并描述類似的告警,提供語(yǔ)言來(lái)描述告警間的相互觸發(fā)依賴關(guān)系,提高告警參數(shù)的設(shè)置,允許用歷史數(shù)據(jù)來(lái)測(cè)試告警參數(shù),提倡用異常檢測(cè)來(lái)代替部分人工告警,