施益峰 屠智瑋
中國移動通信集團(tuán)江蘇有限公司
設(shè)備日志的收集與分析一直都是運(yùn)維中至關(guān)重要的一環(huán)。最初,運(yùn)維人員在各臺設(shè)備上用傳統(tǒng)的Linux 等工具(如cat、tail、sed、awk、grep 等)對日志進(jìn)行簡單的分析和處理,以命令級別的操作為主。隨著互聯(lián)網(wǎng)的興起與硬件的更新,日志的產(chǎn)生與體量成幾何倍的增長,分散管理的成本變得越來越高,高級運(yùn)維人員通過編寫腳本,匯總?cè)罩具M(jìn)行集中化管理,但查詢耗時長,排障時效性低。
CDN 可實(shí)現(xiàn)互聯(lián)網(wǎng)信息源的高速接入和就近訪問,從而改善用戶上網(wǎng)體驗(yàn),是運(yùn)營商增強(qiáng)互聯(lián)網(wǎng)應(yīng)用能力的重要手段,故CDN 產(chǎn)品競爭愈演愈烈,各個廠家推出的CDN產(chǎn)品群雄逐鹿。隨之帶來的問題也日益凸顯,各CDN 廠商針對自家的產(chǎn)品都推出了一套運(yùn)維管理平臺,質(zhì)量參差不齊,存在分析優(yōu)化需求響應(yīng)慢、開發(fā)周期長、對外互不兼容等問題,使得運(yùn)營商在管理時過于繁瑣,運(yùn)維效率低下。運(yùn)營商如果能把各CDN 廠商的日志進(jìn)行集中管理,并提供全文檢索功能,不僅可以提高診斷的效率,而且可以實(shí)現(xiàn)實(shí)時系統(tǒng)監(jiān)測、網(wǎng)絡(luò)安全、事件管理等功能,從而使運(yùn)營商突破各CDN 廠家間的壁壘,擺脫各維護(hù)平臺彼此孤立的困境。依托統(tǒng)一分析平臺集中監(jiān)控各平臺的運(yùn)行情況,由此開展集中調(diào)度與運(yùn)營。基于此,本文向大家推薦一款開源利器——ELK 組件(Elastic Stack),提供分布式實(shí)時日志(數(shù)據(jù))搜集和分析的監(jiān)控系統(tǒng)。
ELK 組 件 是 由Elasticsearch、Logstash、Kibana 三 個核心組件首字母組成的簡稱,在Logstash 前端增加了一個Beats 模塊,是輕量級采集程序的統(tǒng)稱,比較常見的有:Filebeat、MetricBeat、PacketBeat、HeartBeat 等。本 文 主 要針對CDN 業(yè)務(wù)日志進(jìn)行采集,因此選擇專門用于收集日志數(shù)據(jù)的Filebeat,如圖1 所示。

圖1 ELK 架構(gòu)
輕量級的日志采集器Filebeat,內(nèi)置有多種模塊(auditd、Apache、NGINX、System、MySQL 等),可針對常見格式的日志簡化收集過程。將其部署在CDN 系統(tǒng)的各類服務(wù)器(業(yè)務(wù)服務(wù)器、日志服務(wù)器、信安服務(wù)器等),轉(zhuǎn)發(fā)、匯總?cè)罩九c文件。此工具采用背壓敏感協(xié)議,實(shí)時監(jiān)測傳輸通道的擁堵情況,合理控制傳輸負(fù)載,減輕后端壓力。
Logstash對接數(shù)據(jù)源,是負(fù)責(zé)搜集、分析、過濾日志的工具。它支持幾乎任何類型的日志,包括系統(tǒng)日志、錯誤日志和自定義應(yīng)用程序日志。它可以從許多來源接收日志,這些來源包括 syslog、消息傳遞(例如RabbitMQ)和JMX,在日志匯總處理后,能以多種方式輸出數(shù)據(jù),包括電子郵件、websockets 和Elasticsearch。
Elasticsearch 是實(shí)時分析的分布式搜索引擎,是Elastic Stack 的核心,提供搜集、分析、存儲數(shù)據(jù)三大功能。使用倒排索引,并減少磁盤隨機(jī)讀取次數(shù),采用內(nèi)存壓縮算法來提升查詢效率。
Kibana 是基于Web 形式的ELK 前端展示工具,可管理、搜索、查看存儲于Elasticsearch索引中的數(shù)據(jù),并配合多種圖表,例如餅圖、折線圖、熱力圖等,進(jìn)行高級的聚合分析,創(chuàng)建滿足各項需求的可視化報表。
實(shí)驗(yàn)環(huán)境由4 臺戴爾R720 服務(wù)器來搭建,采用CentOS 7 系統(tǒng)。用其中一臺服務(wù)器(以下簡稱Server1)來部署Logstash、Kibana,進(jìn)行日志的收集與Web 服務(wù)器的搭建;剩余三臺服務(wù)器(以下簡稱Server2、3、4)搭建Elasticsearch 集群,采用主、備節(jié)點(diǎn)的方式,在每臺設(shè)備上創(chuàng)建2 個節(jié)點(diǎn)。
由于節(jié)點(diǎn)數(shù)已達(dá)到6 個,且Server1 在Logstash 和Kibana搭建后還留余足夠的硬件資源,為了更好的實(shí)現(xiàn)管理,在Server1 上搭建了負(fù)載均衡(SLB)節(jié)點(diǎn),將所有的寫入、查詢操作均通過這個節(jié)點(diǎn)來分配任務(wù),使整套Elastic Stack 變得完整、靈活。
至此,由4 臺服務(wù)器組成的集群如下:1 個Logstash 節(jié)點(diǎn),1 個Kibana 節(jié)點(diǎn),1 個集群負(fù)載均衡節(jié)點(diǎn),8 個Elasticsearch 節(jié)點(diǎn),共11 個節(jié)點(diǎn)。如圖2 所示。

圖2 Kibana 上可視化的節(jié)點(diǎn)信息監(jiān)控
移動CDN 涉及多個廠家,先嘗試將某個CDN 廠商的日志進(jìn)行接入適配,其他廠家后續(xù)只需針對日志格式和字段含義作相應(yīng)改動即可快速移植。該CDN 廠商日志包含19 個主要字段,日志格式:%h %i %s %t %a %R %m %e %d %u %l %p %T %c %f %P %N %r %b,具體字段說明如表1 所示。

表1 日志格式
掌握CDN 日志格式及各字段含義后,將日志接入ELK系統(tǒng)需要三步:(1)Logstash 配置,實(shí)現(xiàn)對日志字段的映射適配;(2)Filebeat 配置,實(shí)現(xiàn)對CDN 服務(wù)器進(jìn)行數(shù)據(jù)采集;(3)Kibana 配置索引,實(shí)現(xiàn)Web 界面展示。具體部署配置方法見下文詳細(xì)描述。
2.2.1 Logstash 適配
Logstash 配置文件中分為input、日志字段映射、output 三個部分。
(1)在Logstash 中新增該日志適配文件,配置input,此段設(shè)定日志通過Filebeat 上傳至Logstash 的接口通道。如圖3中紅框(1)所示。
(2)根據(jù)日志的格式進(jìn)行映射描述。本次接入日志格式是用空格來隔開字段,所以在配置映射轉(zhuǎn)換前先進(jìn)行配置,再根據(jù)表1 中的“日志說明”進(jìn)行對應(yīng)的字段排列,一一轉(zhuǎn)換為Logstash 能識別的格式。再根據(jù)部分字段性質(zhì)的不同,對取值結(jié)果進(jìn)行“integer、float”二次加工,最后標(biāo)記時間戳,在接收到日志時對其進(jìn)行標(biāo)注,方便管理。如圖3 中紅框(2)所示。
(3)設(shè)定output,此處配置決定了日志通過Logstash 過濾、處理后,上傳至Elasticsearch 的接口通道。在host 處填寫Elasticsearch 的負(fù)載均衡節(jié)點(diǎn)IP 與對應(yīng)端口,將處理完成的日志按照“廠商+時間戳”的格式,形成一份索引,方便將同廠商日志在Kibana 上進(jìn)行匯聚管理。如圖3 中紅框(3)所示。

圖3 Logstash 日志識別配置
2.2.2 Filebeat 采集
配置Filebeat.yml 文件,在input 打開日志收集功能,paths填入服務(wù)器收集日志的路徑,在output 處填上Logstash 的地址與接口。為了更方便的標(biāo)記我們所接入的設(shè)備,建議在最下方加上一個“tag”,用于表示主機(jī)、歸屬、廠商、業(yè)務(wù)等信息。


2.2.3 Kibana 呈現(xiàn)
將配置完成的Filebeat 部署在需要收集日志的服務(wù)器,與Logstash 端網(wǎng)絡(luò)打通后,即可按配置好的路徑進(jìn)行日志的抓取,并實(shí)時向Logstash 傳輸。
在Logstash 接收到日志后,執(zhí)行已生效的配置,歸檔為索引后傳輸給Elasticsearch。至此,我們就可以登錄Kibana,在側(cè)邊菜單欄中的Management 下進(jìn)入/Elasticsearch/Index Management 路徑,看到已經(jīng)上傳成功的“test_2019.xx.xx”索引,附帶上該索引的健康狀態(tài)、副本數(shù)、已錄入的日志條數(shù)、已使用的存儲大小等信息。代表著從服務(wù)器Filebeat(日志上傳)→Logstash(日志收集)→ElasticSearch(分析處理)→Kibana(Web展現(xiàn)管理)全流程的打通。
在Kibana 菜單欄的首位——Discover 下,可以看到接入的日志已按照Logstash 中配置的字段映射,被拆分成易于檢索的單個字段。在日志詳單的左邊,還能看到單個字段在當(dāng)前的時間段內(nèi)將每條日志對應(yīng)的信息進(jìn)行匯總處理后,計算出單位時間內(nèi)的字段類型占比,如圖4 所示。

圖4 Kibana Discover 菜單中的日志索引展示
經(jīng)過上述實(shí)驗(yàn),已成功實(shí)現(xiàn)CDN 日志采集、分析、Web呈現(xiàn)的全流程,對接入日志的字段進(jìn)行適配,并添加索引后,便可以在Kibana 的核心組件Visualization 中創(chuàng)建熱力圖、直方圖、餅圖、時間軸等各類數(shù)據(jù)可視化視圖。如法炮制實(shí)現(xiàn)其他CDN 廠家日志接入ELK 系統(tǒng),并逐步批量覆蓋全省所有CDN 廠家的所有CDN 服務(wù)器。

圖5 Kibana Visualization 菜單
在內(nèi)容網(wǎng)絡(luò)CDN 業(yè)務(wù)中,通過HTTP 狀態(tài)碼來判斷業(yè)務(wù)質(zhì)量是最直觀、基礎(chǔ)的;以狀態(tài)碼數(shù)量統(tǒng)計出的“服務(wù)成功率”也是CDN 業(yè)務(wù)中常見指標(biāo)之一。以此指標(biāo)為例,進(jìn)行指標(biāo)隨時間變化的視圖創(chuàng)建。
通過篩選,采用Visualization 中的Visual Builder 來自定義實(shí)現(xiàn):選擇日志對應(yīng)的建立好的索引,進(jìn)入配置視圖:“Aggregation”選項中提供了將索引中的字段進(jìn)行平均、基數(shù)、百分比、過濾比率、方差、熱門點(diǎn)擊等豐富的匯聚選項。由于服務(wù)成功率指標(biāo)是由HTTP 狀態(tài)碼的錯誤/正常的數(shù)量比率來計算的,因此選擇Filter Ratio(過濾比率)來將字段“httpstatus”中全量計數(shù)作為Denominator 分母,將其中的5xx 計數(shù)作為Numerator 分子,以實(shí)現(xiàn)根據(jù)時間軸來計算HTTP 錯誤碼數(shù)占服務(wù)總數(shù)的比值曲線。

圖6 Kibana 請求失敗率視圖展示
單純觀察所有日志匯總后的HTTP 錯誤碼曲線,依舊無法具體定位故障點(diǎn),且匯總后數(shù)據(jù)量過大,當(dāng)部分業(yè)務(wù)錯誤率突增,不足以影響全量數(shù)據(jù)時,無法體現(xiàn)。因此,在接入的業(yè)務(wù)、節(jié)點(diǎn)越來越多的情況下,需要在現(xiàn)有視圖的基礎(chǔ)上進(jìn)行衍生:
(1)分組維度
某些廠商的CDN 業(yè)務(wù)分組數(shù)量眾多,不同的分組代表不同的節(jié)點(diǎn),也對應(yīng)了不同的業(yè)務(wù),匯聚后定位識別困難。
通過對服務(wù)器節(jié)點(diǎn)信息字段的關(guān)聯(lián),可將原視圖上某廠商CDN 日志全量匯總的單一曲線,轉(zhuǎn)由該廠商CDN 分組為單位的多條曲線,實(shí)現(xiàn)多分組多業(yè)務(wù)的服務(wù)狀態(tài)監(jiān)控,方便運(yùn)維人員進(jìn)行定位和排查,實(shí)際效果如圖6 所示。
(2)業(yè)務(wù)域名維度
某些廠商的CDN 業(yè)務(wù)架構(gòu)不同,分組數(shù)量少,同分組內(nèi)同時服務(wù)多個業(yè)務(wù),日志匯聚后需要進(jìn)行區(qū)分識別。
由于日志字段中沒有域名字段,無法直接選擇進(jìn)行字段關(guān)聯(lián),因此,對攜帶域名信息的“URL 字段”進(jìn)行識別、提取。URL的格式是規(guī)范統(tǒng)一的,所以可在Logstash中對“URL字段”進(jìn)行過濾,根據(jù)“/”的分割,取得對應(yīng)域名字符,并映射為新字段,完成“域名字段”的創(chuàng)建。
通過對域名字段的關(guān)聯(lián),可將該CDN 分組內(nèi)的混合業(yè)務(wù)日志,清楚地由域名維度區(qū)分識別,實(shí)現(xiàn)單分組內(nèi)多個業(yè)務(wù)的服務(wù)狀態(tài)監(jiān)控。
(3)物理設(shè)備維度
某些CDN 節(jié)點(diǎn)承載重要業(yè)務(wù),或承擔(dān)負(fù)載均衡、調(diào)度管理等重要職責(zé),需要對此類節(jié)點(diǎn)設(shè)備進(jìn)行重點(diǎn)監(jiān)控。因此,需要詳細(xì)至單臺設(shè)備IP 維度進(jìn)行監(jiān)控。但是,部分設(shè)備上報日志、特殊設(shè)備收集信息中不包含設(shè)備IP 信息,只能選擇在設(shè)備上傳數(shù)據(jù)至Logstash 前,通過Filebeat 在output 配置對應(yīng)設(shè)備IP、歸屬等信息進(jìn)行標(biāo)識,再由Logstash 中映射新字段后完成創(chuàng)建。
通過對設(shè)備IP 字段的關(guān)聯(lián),可對重點(diǎn)關(guān)注設(shè)備進(jìn)行詳細(xì)監(jiān)控,實(shí)現(xiàn)單分組內(nèi)多設(shè)備點(diǎn)對點(diǎn)監(jiān)控,第一時間發(fā)現(xiàn)異常設(shè)備,進(jìn)行應(yīng)急處理,及時止損對業(yè)務(wù)的影響。
通過上述三種維度衍生配置出的報表可以直觀、實(shí)時地展現(xiàn)業(yè)務(wù)服務(wù)情況隨時間趨勢的變化,發(fā)現(xiàn)其中某個分組、某個業(yè)務(wù)的服務(wù)狀態(tài)異常。但是,對于業(yè)務(wù)分組內(nèi)服務(wù)的數(shù)個網(wǎng)站、域名、報錯信息等進(jìn)一步詳細(xì)信息,還是無法知曉并具體定位是哪些服務(wù)受到了影響。
Kibana 上豐富靈活的視圖,可以通過自由組合來進(jìn)一步多維度地展現(xiàn)數(shù)據(jù)分析的信息。通過Pie 視圖,以配置服務(wù)域名字段/報錯信息為基準(zhǔn),同時篩選并關(guān)聯(lián)業(yè)務(wù)分組與HTTP錯誤碼兩個字段,并配置需要查詢的時間段,即可將此Pie 視圖聯(lián)合Visual Builder 視圖共同定位至服務(wù)異常的具體業(yè)務(wù),實(shí)現(xiàn)多分組多業(yè)務(wù)中,將Top 錯誤域名、Top 報錯信息,同步實(shí)時呈現(xiàn)。如圖7 所示。

圖7 多維監(jiān)控報表展示
至截稿前,筆者通過不斷對該分析系統(tǒng)的更新與迭代,已可按地市節(jié)點(diǎn)、服務(wù)分組、業(yè)務(wù)域名、物理設(shè)備等維度可視化呈現(xiàn),并可通過將狀態(tài)碼、命中率、時延、下載速率、流量、碼率等指標(biāo)關(guān)聯(lián)下鉆分析定位質(zhì)差,成功發(fā)現(xiàn)數(shù)十起CDN 業(yè)務(wù)因設(shè)備硬件故障、上游回源異常、本地軟件錯誤等情況導(dǎo)致的業(yè)務(wù)波動影響。與此同時,利用靈活的自定義特性與合理高效的檢索架構(gòu),實(shí)現(xiàn)了多廠家平面日志的匯聚展現(xiàn),突破運(yùn)營商在現(xiàn)網(wǎng)運(yùn)維中面臨的困境,極大提高CDN 運(yùn)營能力與排障效率。
本文主要是從“基于Elastic Stack 對CDN 業(yè)務(wù)多平面日志分析系統(tǒng)的架構(gòu)、搭建與實(shí)現(xiàn)”入手,對每一部分展開說明。本系統(tǒng)降低了日志管理分析的成本,在日志的收集處理、檢索分析和展示方面,凸顯出良好的靈活性與包容性,能有效協(xié)助運(yùn)營商解決單業(yè)務(wù)系統(tǒng)內(nèi)多個廠家各自獨(dú)立、互不兼容的“老大難”問題,提升運(yùn)維效率。目前該系統(tǒng)已推廣至互聯(lián)網(wǎng)電視等業(yè)務(wù)領(lǐng)域,其他需進(jìn)行日志分析的專業(yè)領(lǐng)域均可參照此文介紹的部署方法平滑便捷地移植。
本文只是對ELK 系統(tǒng)的初步探索,此系統(tǒng)各個組件都擁有豐富友好的開源接口,下一步將繼續(xù)研究,加入Python 等其他優(yōu)秀的開源技術(shù),深挖優(yōu)化日志分析平臺,依托此平臺實(shí)現(xiàn)多業(yè)務(wù)多平面日志的統(tǒng)一采集、匯聚呈現(xiàn)與分析預(yù)警。