百度商業(yè)大規(guī)模高性能全息日志檢索技術(shù)揭秘
點(diǎn)擊上方“服務(wù)端思維”,選擇“設(shè)為星標(biāo)”
回復(fù)”669“獲取獨(dú)家整理的精選資料集
回復(fù)”加群“加入全國(guó)服務(wù)端高端社群「后端圈」
一、背景介紹
百度商業(yè)產(chǎn)品是服務(wù)于百度廣告主用來(lái)投放廣告而打造的產(chǎn)品生態(tài)。包含搜索推廣、信息流推廣、品牌等推廣渠道以及觀星盤、基木魚等營(yíng)銷工具。

這一系列商業(yè)產(chǎn)品底層多為復(fù)雜的 Java 業(yè)務(wù)系統(tǒng)。復(fù)雜性主要體現(xiàn)在底層微服務(wù)子系統(tǒng)多、應(yīng)用間調(diào)用關(guān)系復(fù)雜、基礎(chǔ)組件依賴多。復(fù)雜性高就就意味著容易出問(wèn)題,并且出了問(wèn)題定位困難。但是這些產(chǎn)品出問(wèn)題會(huì)直接導(dǎo)致廣告主是否成功投放廣告或者修改出價(jià)、創(chuàng)意等操作失敗。
「如果有過(guò)在廣告業(yè)務(wù)系統(tǒng)一線工作經(jīng)歷的同學(xué),應(yīng)該深知排查線上問(wèn)題的枯燥和耗時(shí)」
如何在出問(wèn)題第一時(shí)間定位問(wèn)題,從而快速止損和修復(fù)問(wèn)題,是商業(yè)產(chǎn)品系統(tǒng)中一個(gè)關(guān)鍵的技術(shù)痛點(diǎn)。為了解決這個(gè)痛點(diǎn),百度商業(yè)平臺(tái)部打造了大規(guī)模分布式微服務(wù)監(jiān)控系統(tǒng)。公眾號(hào)前文「百度商業(yè)大規(guī)模微服務(wù)業(yè)務(wù)監(jiān)控系統(tǒng)-鳳睛」已經(jīng)講述了鳳睛如何通過(guò)自研無(wú)侵入探針以及高性能調(diào)用鏈存儲(chǔ)系統(tǒng)為百度各業(yè)務(wù)線提供微服務(wù)系統(tǒng)性能指標(biāo)、業(yè)務(wù)黃金指標(biāo)、健康狀況、監(jiān)控告警等。
當(dāng)收到線上報(bào)警時(shí),值班同學(xué)需要首先找到出問(wèn)題的根因模塊,然后找出該模塊出錯(cuò)的服務(wù)接口,最后定位到問(wèn)題代碼行棧。鳳睛提供了調(diào)用鏈數(shù)據(jù)能夠查看各個(gè)調(diào)用環(huán)節(jié)的狀態(tài)碼、耗時(shí)等,同時(shí)也收錄了業(yè)務(wù)系統(tǒng)打印的錯(cuò)誤堆棧。

大部分情況下,通過(guò)調(diào)用鏈以及系統(tǒng)打印的錯(cuò)誤堆??梢源_定問(wèn)題。但是,部分情況下問(wèn)題與用戶請(qǐng)求返回、業(yè)務(wù)訪問(wèn)緩存的情況等等比較特殊的場(chǎng)景有關(guān)。這需要通過(guò)系統(tǒng)打印的業(yè)務(wù)日志輔助定位。
鳳睛并沒(méi)有采集和存儲(chǔ)業(yè)務(wù)日志,這與數(shù)據(jù)量有關(guān),它部署在數(shù)千個(gè)微服務(wù)子系統(tǒng)上,運(yùn)行在數(shù)萬(wàn)個(gè)容器中。每天采集的調(diào)用鏈數(shù)據(jù)條數(shù)達(dá)千億,日存儲(chǔ)數(shù)據(jù)在TB級(jí)別。而更加龐大、抽象程度最低的業(yè)務(wù)日志,預(yù)估單日總量接近PB級(jí)別,存儲(chǔ)開銷實(shí)在太大。
二、技術(shù)原理
傳統(tǒng)做法:為了檢索到單個(gè)請(qǐng)求相關(guān)的所有業(yè)務(wù)日志,日志會(huì)被采集走存儲(chǔ)在 ES 里面提供檢索功能。

誠(chéng)然,Kibana+ES會(huì)提供更豐富靈活的檢索功能,但是對(duì)于鳳睛這種平臺(tái)級(jí)別監(jiān)控系統(tǒng),基本不可行。ES的資源成本過(guò)于昂貴,整個(gè)平臺(tái)單日日志數(shù)據(jù)接近 PB。如果全部存儲(chǔ)在 ES 中,那么集群資源消耗以及維護(hù)成本都是很高的。并且,單純定位線上問(wèn)題,并不需要特別復(fù)雜的日志檢索功能。
那么能否在少量資源消耗下,滿足用戶可以看到單個(gè)請(qǐng)求相關(guān)的完整調(diào)用鏈以及業(yè)務(wù)日志呢?
鳳睛整個(gè)迭代過(guò)程就是不斷利用有限資源來(lái)創(chuàng)造性解決實(shí)際問(wèn)題的過(guò)程。而真正好的系統(tǒng)架構(gòu)亦然如此,要「因地制宜」。在阿里巴巴鐘華同學(xué)的《企業(yè)IT架構(gòu)轉(zhuǎn)型之道:阿里巴巴中臺(tái)戰(zhàn)略思想與架構(gòu)實(shí)戰(zhàn)》一書中,開篇就提到過(guò)「好的創(chuàng)新一定是基于企業(yè)現(xiàn)狀因地制宜」。
目前商業(yè)平臺(tái) Java 系統(tǒng)統(tǒng)一部署在企業(yè)級(jí)微服務(wù)托管平臺(tái) Jarvis上,同時(shí)鳳睛探針能夠無(wú)侵入式跟蹤和采集系統(tǒng)的動(dòng)作,這是我們的技術(shù)優(yōu)勢(shì)。能否利用這個(gè)優(yōu)勢(shì),來(lái)規(guī)避掉存儲(chǔ)資源有限的短板。探針既然能夠記錄系統(tǒng)在每個(gè)請(qǐng)求發(fā)生過(guò)程中的所有的動(dòng)作;那么同樣可以記錄系統(tǒng)打印日志的動(dòng)作。

我們通過(guò)探針記錄下請(qǐng)求相關(guān)的業(yè)務(wù)日志文件名、日志偏移量,并且存儲(chǔ)數(shù)據(jù)庫(kù)中。當(dāng)用戶在Jarvis管理端檢索調(diào)用鏈相關(guān)的業(yè)務(wù)日志時(shí),系統(tǒng)會(huì)先通過(guò)調(diào)用鏈 ID 去獲取相關(guān)的虛擬容器地址、日志文件名、日志偏移量等元數(shù)據(jù)信息,然后通過(guò)這些元數(shù)據(jù)去具體的容器中取到完整的日志內(nèi)容,最后展現(xiàn)給用戶。

這樣雖然我們只消耗少量的存儲(chǔ)和計(jì)算資源,也可以輕松檢索到海量調(diào)用鏈相關(guān)的業(yè)務(wù)日志。這個(gè)受限于日志在容器中的實(shí)際存儲(chǔ)時(shí)間,但是線上問(wèn)題很少需要借助遠(yuǎn)久歷史日志來(lái)分析定位。絕大多數(shù)情況下借助當(dāng)前日志就可以滿足需求了。
「全息日志技術(shù)是鳳睛自研技術(shù),也申請(qǐng)了相關(guān)專利」
三、算法實(shí)現(xiàn)
全息日志技術(shù)設(shè)計(jì)中分為兩個(gè)主要的部分:
日志元數(shù)據(jù)采集:攔截打印日志的前后操作,進(jìn)行元數(shù)據(jù)采集。 元數(shù)據(jù)解析:解析元數(shù)據(jù)定位出日志文件當(dāng)前位置以及日志所在文件的位置。
在通常情況下,一份日志消息可能打印到多個(gè)日志文件中,日志文件可能根據(jù)配置的滾動(dòng)策略進(jìn)行基于時(shí)間或者大小的滾動(dòng),不同的時(shí)間進(jìn)行日志檢索需要能夠自動(dòng)區(qū)分出日志當(dāng)前所在的實(shí)際位置,用戶不需要感知底層日志文件位置變化。
在設(shè)計(jì)和實(shí)現(xiàn)中關(guān)鍵問(wèn)題的解決:
元數(shù)據(jù)采集的性能和準(zhǔn)確性問(wèn)題
為了保證元數(shù)據(jù)能夠被準(zhǔn)確的采集,需要基于鳳睛探針攔截打印日志的方法。

在原始打印日志操作之前插入字節(jié)碼,記錄開始時(shí)間、讀文件標(biāo)識(shí)符獲取打印前文件偏移量、文件的滾動(dòng)策略(包括文件最大大小、文件滾動(dòng)時(shí)間等)、日志級(jí)別; 在原始打印日志操作之后插入字節(jié)碼,記錄結(jié)束時(shí)間、讀文件標(biāo)識(shí)符獲取打印后文件偏移量、日志內(nèi)容當(dāng)前寫入的文件、文件按滾動(dòng)策略歸檔后策略、同名歸檔時(shí)歸檔序號(hào)等. 在采集文件偏移量時(shí)通過(guò)直接讀取文件描述符而不是直接讀文件內(nèi)容來(lái)提高性能。同時(shí),在日志打印內(nèi)容里注入每次調(diào)用唯一的traceId做更精準(zhǔn)的標(biāo)注,其他數(shù)據(jù)的采集用來(lái)日志檢索時(shí)解析使用。
元數(shù)據(jù)解析
用戶發(fā)起日志檢索時(shí),使用算法解析出此時(shí)此刻日志內(nèi)容所在位置。

根據(jù)調(diào)用鏈traceId查詢出與該traceId相同的所以日志元數(shù)據(jù)記錄; 分別獲取日志打印結(jié)束時(shí)間、日志打印時(shí)當(dāng)前文件名、文件歸檔策略; 解析歸檔策略; 根據(jù)歸檔策略注入不同基準(zhǔn)參數(shù),模擬出一個(gè)日志打印器,以此獲取到此時(shí)此刻文件位置; 根據(jù)文件位置,以及文件前后偏移量,讀取出兩個(gè)偏移量之前的日志內(nèi)容; 用traceId進(jìn)行內(nèi)容校準(zhǔn).
四、結(jié)語(yǔ)
鳳睛通過(guò)自研的全息日志技術(shù)能夠幫助業(yè)務(wù)方快速檢索到業(yè)務(wù)請(qǐng)求相關(guān)的完整調(diào)用鏈以及完整的業(yè)務(wù)日志。作為分布式追蹤系統(tǒng),我們也補(bǔ)齊了追蹤領(lǐng)域最后一塊短板。但是業(yè)務(wù)系統(tǒng)的復(fù)雜性,也決定了鳳睛作為一個(gè)平臺(tái)化的業(yè)務(wù)監(jiān)控產(chǎn)品所面臨的諸多挑戰(zhàn)。
— 本文結(jié)束 —

●?漫談設(shè)計(jì)模式在 Spring 框架中的良好實(shí)踐
關(guān)注我,回復(fù) 「加群」 加入各種主題討論群。
對(duì)「服務(wù)端思維」有期待,請(qǐng)?jiān)谖哪c(diǎn)個(gè)在看
喜歡這篇文章,歡迎轉(zhuǎn)發(fā)、分享朋友圈


