CAT簡介
CAT 是基于 Java 開發(fā)的實時應用監(jiān)控平臺铐懊,為美團點評提供了全面的實時監(jiān)控告警服務(wù)腊瑟。開源地址:https://github.com/dianping/cat/
CAT
作為服務(wù)端項目基礎(chǔ)組件凶朗,提供了 Java, C/C++, Node.js, Python, Go
等多語言客戶端,已經(jīng)在美團點評的基礎(chǔ)架構(gòu)中間件框架(MVC框架,RPC框架,數(shù)據(jù)庫框架祸泪,緩存框架等,消息隊列藤树,配置系統(tǒng)等)深度集成浴滴,為美團點評各業(yè)務(wù)線提供系統(tǒng)豐富的性能指標、健康狀況岁钓、實時告警等升略。
CAT
很大的優(yōu)勢是它是一個實時系統(tǒng),CAT
大部分系統(tǒng)是分鐘級統(tǒng)計屡限,但是從數(shù)據(jù)生成到服務(wù)端處理結(jié)束是秒級別品嚣,秒級定義是48分鐘40秒,基本上看到48分鐘38秒數(shù)據(jù)钧大,整體報表的統(tǒng)計粒度是分鐘級翰撑;第二個優(yōu)勢,監(jiān)控數(shù)據(jù)是全量統(tǒng)計啊央,客戶端預計算眶诈;鏈路數(shù)據(jù)是采樣計算。
Cat 產(chǎn)品價值
減少故障發(fā)現(xiàn)時間降低故障定位成本輔助應用程序優(yōu)化
Cat 優(yōu)勢
實時處理:信息的價值會隨時間銳減瓜饥,尤其是事故處理過程中全量數(shù)據(jù):全量采集指標數(shù)據(jù)逝撬,便于深度分析故障案例高可用:故障的還原與問題定位,需要高可用監(jiān)控來支撐故障容忍:故障不影響業(yè)務(wù)正常運轉(zhuǎn)乓土、對業(yè)務(wù)透明高吞吐:海量監(jiān)控數(shù)據(jù)的收集宪潮,需要高吞吐能力做保證可擴展:支持分布式、跨 IDC 部署趣苏,橫向擴展的監(jiān)控系統(tǒng)
cat監(jiān)控模型
Transaction 適合記錄跨越系統(tǒng)邊界的程序訪問行為,比如遠程調(diào)用狡相,數(shù)據(jù)庫調(diào)用,也適合執(zhí)行時間較長的業(yè)務(wù)邏輯監(jiān)控食磕,Transaction用來記錄一段代碼的執(zhí)行時間和次數(shù)尽棕。Event 用來記錄一件事發(fā)生的次數(shù),比如記錄系統(tǒng)異常彬伦,它和transaction相比缺少了時間的統(tǒng)計萄金,開銷比transaction要小。Heartbeat 表示程序內(nèi)定期產(chǎn)生的統(tǒng)計信息, 如CPU利用率, 內(nèi)存利用率, 連接池狀態(tài), 系統(tǒng)負載等媚朦。Metric 用于記錄業(yè)務(wù)指標氧敢、指標可能包含對一個指標記錄次數(shù)、記錄平均值询张、記錄總和孙乖,業(yè)務(wù)指標最低統(tǒng)計粒度為1分鐘。
消息樹
CAT監(jiān)控系統(tǒng)將每次URL、Service的請求內(nèi)部執(zhí)行情況都封裝為一個完整的消息樹唯袄、消息樹可能包括Transaction弯屈、Event、Heartbeat恋拷、Metric等信息资厉。
完整的消息樹
可視化消息樹
架構(gòu)設(shè)計
服務(wù)端單機cat-consumer的整體架構(gòu)如下:
如上圖,CAT服務(wù)端在整個實時處理中蔬顾,基本上實現(xiàn)了全異步化處理宴偿。
消息接收是基于Netty的NIO實現(xiàn)消息接收到服務(wù)端就存放內(nèi)存隊列,然后程序開啟一個線程會消費這個消息做消息分發(fā)每個消息都會有一批線程并發(fā)消費各自隊列的數(shù)據(jù)诀豁,以做到消息處理的隔離消息存儲是先存入本地磁盤窄刘,然后異步上傳到hdfs文件,這也避免了強依賴hdfs
當某個報表處理器處理來不及時候舷胜,比如Transaction報表處理比較慢娩践,可以通過配置支持開啟多個Transaction處理線程,并發(fā)消費消息烹骨。
實時分析
CAT服務(wù)端實時報表分析是整個監(jiān)控系統(tǒng)的核心翻伺,CAT重客戶端采集的是是原始的Logview,目前一天大約有3000億的消息沮焕,所以需要在這些消息基礎(chǔ)上實現(xiàn)豐富報表穆趴,以支持業(yè)務(wù)問題以及性能分析的需要。
CAT根據(jù)日志消息的特點(比如只讀特性)和問題場景遇汞,量身定做的。CAT將所有的報表按消息的創(chuàng)建時間簿废,一小時為單位分片空入,那么每小時就產(chǎn)生一個報表。當前小時報表的所有計算都是基于內(nèi)存的族檬,用戶每次請求即時報表得到的都是最新的實時結(jié)果歪赢。對于歷史報表,因為它是不變的单料,所以就實時不實時也就無所謂了埋凯。
CAT基本上所有的報表模型都可以增量計算,它可以分為:計數(shù)扫尖、計時和關(guān)系處理三種白对。計數(shù)又可以分為兩類:算術(shù)計數(shù)和集合計數(shù)。典型的算術(shù)計數(shù)如:總個數(shù)(count)换怖,總和(sum)甩恼,均值(avg),最大/最小(max/min)条摸,吞吐(tps)和標準差(std)等悦污,其他都比較直觀,標準差稍微復雜一點钉蒲,大家自己可以推演一下怎么做增量計算切端。那集合運算,比如95線(表示95%請求的完成時間)顷啼,999線(表示99.9%請求的完成時間)踏枣,則稍微復雜一些,系統(tǒng)開銷也更大一點线梗。
報表建模
CAT每個報表往往有多個維度椰于,以transaction報表為例,它有5個維度仪搔,分別是應用瘾婿、機器、Type烤咧、Name和分鐘級分布情況偏陪。如果全維度建模,雖然靈活煮嫌,但開銷將會非常之大笛谦。CAT選擇固定維度建模,可以理解成將這5個維度組織成深度為5的樹昌阿,訪問時總是從根開始饥脑,逐層往下進行。
CAT服務(wù)端為每個報表單獨分配一個線程懦冰,所以不會有鎖的問題灶轰,所有報表模型都是非線程安全的,其數(shù)據(jù)是可變的刷钢。這樣帶來的好處是簡單且低開銷笋颤。
CAT報表建模是使用自研的maven plugin自動生成的。所有報表是可合并和裁剪的内地,可以輕易地將2個或多個報表合并成一個報表伴澄。在報表處理代碼中,CAT大量使用訪問者模式(visitor pattern)阱缓。
性能分析報表
故障發(fā)現(xiàn)報表
實時業(yè)務(wù)指標監(jiān)控 :核心業(yè)務(wù)都會定義自己的業(yè)務(wù)指標非凌,這不需要太多,主要用于24小時值班監(jiān)控荆针,實時發(fā)現(xiàn)業(yè)務(wù)指標問題清焕,圖中一個是當前的實際值并蝗,一個是基準值,基準值是根據(jù)歷史趨勢計算的預測值秸妥。如下圖就是當時出故障滚停,直觀看到支付業(yè)務(wù)出問題的故障。系統(tǒng)報錯大盤實時數(shù)據(jù)庫大盤粥惧、服務(wù)大盤键畴、緩存大盤等
存儲設(shè)計
CAT系統(tǒng)的存儲主要有兩塊
CAT的報表的存儲CAT原始logview的存儲
報表是根據(jù)logview實時運算出來的給業(yè)務(wù)分析用的報表,默認報表有小時模式突雪,天模式起惕,周模式以及月模式。CAT實時處理報表都是產(chǎn)生小時級別統(tǒng)計咏删,小時級報表中會帶有最低分鐘級別粒度的統(tǒng)計惹想。天、周督函、月等報表都是在小時級別報表合并的結(jié)果報表嘀粱。
原始logview存儲一天大約300TB的數(shù)據(jù)量,因為數(shù)據(jù)量比較大所以存儲必須要要壓縮辰狡,原始logview需要根據(jù)messageId讀取锋叨。在這樣的情況下,存儲整體要求就是批量壓縮以及隨機讀宛篇。在當時場景下娃磺,并沒有特別合適成熟的系統(tǒng)以支持這樣的特性,所以我們開發(fā)了一種基于文件的存儲以支持CAT的場景叫倍,在存儲上一直是最難的問題偷卧,我們一直在這塊持續(xù)的改進和優(yōu)化。
消息ID的設(shè)計
CAT每個消息都有一個唯一的ID吆倦,這個ID在客戶端生成听诸,后續(xù)CAT都通過這個ID在進行消息內(nèi)容的查找。比如在分布式調(diào)用里面逼庞,RPC消息需要串起來,比如A調(diào)用B的時候瞻赶,在A這端生成一個MessageId赛糟,在A調(diào)用B的過程中,將MessageId作為調(diào)用傳遞到B端砸逊,在B執(zhí)行過程中璧南,B用context傳遞的MessageId作為當前監(jiān)控消息的MessageId。
CAT消息的MessageId格式ShopWeb-0a010680-375030-2师逸,CAT消息一共分為四段
第一段是應用名shop-web第二段是當前這臺機器的ip的16進制格式司倚,01010680表示10.1.6.108第三段的375030,是系統(tǒng)當前時間除以小時得到的整點數(shù)第四段的2,是表示當前這個客戶端在當前小時的順序遞增號
存儲數(shù)據(jù)的設(shè)計
消息存儲是CAT最有挑戰(zhàn)的部分动知。關(guān)鍵問題是消息數(shù)量多且大皿伺,目前美團點評每天處理消息3000億左右,大小大約300TB盒粮,單物理機每秒要處理200MB左右的流量鸵鸥。CAT服務(wù)端基于此流量做實時計算,還需要將這些數(shù)據(jù)壓縮后寫入磁盤丹皱。
整體存儲結(jié)構(gòu)如下圖
CAT數(shù)據(jù)文件分為兩種妒穴,一類是index文件,一類是Data文件
data文件是分段GZIP壓縮摊崭,每個分段大小小于64K讼油,這樣可以用16bits可以表示一個最大分段地址一個MessageId都用需要48bits的空間大小來存索引,索引根據(jù)MessageId的第四段來確定索引的位置呢簸,比如消息MessageId為ShopWeb-0a010680-375030-2矮台,這條消息ID對應的索引位置為2*48bits的位置48bits前面32bits存數(shù)據(jù)文件的塊偏移地址,后面16bits存數(shù)據(jù)文件解壓之后的塊內(nèi)地址偏移CAT讀取消息的時候阔墩,首先根據(jù)MessageId的前面三段確定唯一的索引文件嘿架,在根據(jù)MessageId第四段確定此MessageId索引位置,根據(jù)索引文件的48bits讀取數(shù)據(jù)文件的內(nèi)容啸箫,然后將數(shù)據(jù)文件進行GZIP解壓耸彪,在根據(jù)塊內(nèi)偏移地址讀取出真正的消息內(nèi)容。
服務(wù)端設(shè)計總結(jié)
CAT在分布式實時方面忘苛,主要歸結(jié)于以下幾點因素:
去中心化蝉娜,數(shù)據(jù)分區(qū)處理基于日志只讀特性,以一個小時為時間窗口扎唾,實時報表基于內(nèi)存建模和分析召川,歷史報表通過聚合完成基于內(nèi)存隊列,全面異步化胸遇,單線程化荧呐,無鎖設(shè)計全局消息ID,數(shù)據(jù)本地化生產(chǎn)纸镊,集中式存儲組件化倍阐、服務(wù)化理念