施益峰 屠智瑋
中國(guó)移動(dòng)通信集團(tuán)江蘇有限公司
設(shè)備日志的收集與分析一直都是運(yùn)維中至關(guān)重要的一環(huán)。最初,運(yùn)維人員在各臺(tái)設(shè)備上用傳統(tǒng)的Linux 等工具(如cat、tail、sed、awk、grep 等)對(duì)日志進(jìn)行簡(jiǎn)單的分析和處理,以命令級(jí)別的操作為主。隨著互聯(lián)網(wǎng)的興起與硬件的更新,日志的產(chǎn)生與體量成幾何倍的增長(zhǎng),分散管理的成本變得越來越高,高級(jí)運(yùn)維人員通過編寫腳本,匯總?cè)罩具M(jìn)行集中化管理,但查詢耗時(shí)長(zhǎng),排障時(shí)效性低。
CDN 可實(shí)現(xiàn)互聯(lián)網(wǎng)信息源的高速接入和就近訪問,從而改善用戶上網(wǎng)體驗(yàn),是運(yùn)營(yíng)商增強(qiáng)互聯(lián)網(wǎng)應(yīng)用能力的重要手段,故CDN 產(chǎn)品競(jìng)爭(zhēng)愈演愈烈,各個(gè)廠家推出的CDN產(chǎn)品群雄逐鹿。隨之帶來的問題也日益凸顯,各CDN 廠商針對(duì)自家的產(chǎn)品都推出了一套運(yùn)維管理平臺(tái),質(zhì)量參差不齊,存在分析優(yōu)化需求響應(yīng)慢、開發(fā)周期長(zhǎng)、對(duì)外互不兼容等問題,使得運(yùn)營(yíng)商在管理時(shí)過于繁瑣,運(yùn)維效率低下。運(yùn)營(yíng)商如果能把各CDN 廠商的日志進(jìn)行集中管理,并提供全文檢索功能,不僅可以提高診斷的效率,而且可以實(shí)現(xiàn)實(shí)時(shí)系統(tǒng)監(jiān)測(cè)、網(wǎng)絡(luò)安全、事件管理等功能,從而使運(yùn)營(yíng)商突破各CDN 廠家間的壁壘,擺脫各維護(hù)平臺(tái)彼此孤立的困境。依托統(tǒng)一分析平臺(tái)集中監(jiān)控各平臺(tái)的運(yùn)行情況,由此開展集中調(diào)度與運(yùn)營(yíng)?;诖?,本文向大家推薦一款開源利器——ELK 組件(Elastic Stack),提供分布式實(shí)時(shí)日志(數(shù)據(jù))搜集和分析的監(jiān)控系統(tǒng)。
ELK 組 件 是 由Elasticsearch、Logstash、Kibana 三 個(gè)核心組件首字母組成的簡(jiǎn)稱,在Logstash 前端增加了一個(gè)Beats 模塊,是輕量級(jí)采集程序的統(tǒng)稱,比較常見的有:Filebeat、MetricBeat、PacketBeat、HeartBeat 等。本 文 主 要針對(duì)CDN 業(yè)務(wù)日志進(jìn)行采集,因此選擇專門用于收集日志數(shù)據(jù)的Filebeat,如圖1 所示。
圖1 ELK 架構(gòu)
輕量級(jí)的日志采集器Filebeat,內(nèi)置有多種模塊(auditd、Apache、NGINX、System、MySQL 等),可針對(duì)常見格式的日志簡(jiǎn)化收集過程。將其部署在CDN 系統(tǒng)的各類服務(wù)器(業(yè)務(wù)服務(wù)器、日志服務(wù)器、信安服務(wù)器等),轉(zhuǎn)發(fā)、匯總?cè)罩九c文件。此工具采用背壓敏感協(xié)議,實(shí)時(shí)監(jiān)測(cè)傳輸通道的擁堵情況,合理控制傳輸負(fù)載,減輕后端壓力。
Logstash對(duì)接數(shù)據(jù)源,是負(fù)責(zé)搜集、分析、過濾日志的工具。它支持幾乎任何類型的日志,包括系統(tǒng)日志、錯(cuò)誤日志和自定義應(yīng)用程序日志。它可以從許多來源接收日志,這些來源包括 syslog、消息傳遞(例如RabbitMQ)和JMX,在日志匯總處理后,能以多種方式輸出數(shù)據(jù),包括電子郵件、websockets 和Elasticsearch。
Elasticsearch 是實(shí)時(shí)分析的分布式搜索引擎,是Elastic Stack 的核心,提供搜集、分析、存儲(chǔ)數(shù)據(jù)三大功能。使用倒排索引,并減少磁盤隨機(jī)讀取次數(shù),采用內(nèi)存壓縮算法來提升查詢效率。
Kibana 是基于Web 形式的ELK 前端展示工具,可管理、搜索、查看存儲(chǔ)于Elasticsearch索引中的數(shù)據(jù),并配合多種圖表,例如餅圖、折線圖、熱力圖等,進(jìn)行高級(jí)的聚合分析,創(chuàng)建滿足各項(xiàng)需求的可視化報(bào)表。
實(shí)驗(yàn)環(huán)境由4 臺(tái)戴爾R720 服務(wù)器來搭建,采用CentOS 7 系統(tǒng)。用其中一臺(tái)服務(wù)器(以下簡(jiǎn)稱Server1)來部署Logstash、Kibana,進(jìn)行日志的收集與Web 服務(wù)器的搭建;剩余三臺(tái)服務(wù)器(以下簡(jiǎn)稱Server2、3、4)搭建Elasticsearch 集群,采用主、備節(jié)點(diǎn)的方式,在每臺(tái)設(shè)備上創(chuàng)建2 個(gè)節(jié)點(diǎn)。
由于節(jié)點(diǎn)數(shù)已達(dá)到6 個(gè),且Server1 在Logstash 和Kibana搭建后還留余足夠的硬件資源,為了更好的實(shí)現(xiàn)管理,在Server1 上搭建了負(fù)載均衡(SLB)節(jié)點(diǎn),將所有的寫入、查詢操作均通過這個(gè)節(jié)點(diǎn)來分配任務(wù),使整套Elastic Stack 變得完整、靈活。
至此,由4 臺(tái)服務(wù)器組成的集群如下:1 個(gè)Logstash 節(jié)點(diǎn),1 個(gè)Kibana 節(jié)點(diǎn),1 個(gè)集群負(fù)載均衡節(jié)點(diǎn),8 個(gè)Elasticsearch 節(jié)點(diǎn),共11 個(gè)節(jié)點(diǎn)。如圖2 所示。
圖2 Kibana 上可視化的節(jié)點(diǎn)信息監(jiān)控
移動(dòng)CDN 涉及多個(gè)廠家,先嘗試將某個(gè)CDN 廠商的日志進(jìn)行接入適配,其他廠家后續(xù)只需針對(duì)日志格式和字段含義作相應(yīng)改動(dòng)即可快速移植。該CDN 廠商日志包含19 個(gè)主要字段,日志格式:%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)對(duì)日志字段的映射適配;(2)Filebeat 配置,實(shí)現(xiàn)對(duì)CDN 服務(wù)器進(jìn)行數(shù)據(jù)采集;(3)Kibana 配置索引,實(shí)現(xiàn)Web 界面展示。具體部署配置方法見下文詳細(xì)描述。
2.2.1 Logstash 適配
Logstash 配置文件中分為input、日志字段映射、output 三個(gè)部分。
(1)在Logstash 中新增該日志適配文件,配置input,此段設(shè)定日志通過Filebeat 上傳至Logstash 的接口通道。如圖3中紅框(1)所示。
(2)根據(jù)日志的格式進(jìn)行映射描述。本次接入日志格式是用空格來隔開字段,所以在配置映射轉(zhuǎn)換前先進(jìn)行配置,再根據(jù)表1 中的“日志說明”進(jìn)行對(duì)應(yīng)的字段排列,一一轉(zhuǎn)換為L(zhǎng)ogstash 能識(shí)別的格式。再根據(jù)部分字段性質(zhì)的不同,對(duì)取值結(jié)果進(jìn)行“integer、float”二次加工,最后標(biāo)記時(shí)間戳,在接收到日志時(shí)對(duì)其進(jìn)行標(biāo)注,方便管理。如圖3 中紅框(2)所示。
(3)設(shè)定output,此處配置決定了日志通過Logstash 過濾、處理后,上傳至Elasticsearch 的接口通道。在host 處填寫Elasticsearch 的負(fù)載均衡節(jié)點(diǎn)IP 與對(duì)應(yīng)端口,將處理完成的日志按照“廠商+時(shí)間戳”的格式,形成一份索引,方便將同廠商日志在Kibana 上進(jìn)行匯聚管理。如圖3 中紅框(3)所示。
圖3 Logstash 日志識(shí)別配置
2.2.2 Filebeat 采集
配置Filebeat.yml 文件,在input 打開日志收集功能,paths填入服務(wù)器收集日志的路徑,在output 處填上Logstash 的地址與接口。為了更方便的標(biāo)記我們所接入的設(shè)備,建議在最下方加上一個(gè)“tag”,用于表示主機(jī)、歸屬、廠商、業(yè)務(wù)等信息。
2.2.3 Kibana 呈現(xiàn)
將配置完成的Filebeat 部署在需要收集日志的服務(wù)器,與Logstash 端網(wǎng)絡(luò)打通后,即可按配置好的路徑進(jìn)行日志的抓取,并實(shí)時(shí)向Logstash 傳輸。
在Logstash 接收到日志后,執(zhí)行已生效的配置,歸檔為索引后傳輸給Elasticsearch。至此,我們就可以登錄Kibana,在側(cè)邊菜單欄中的Management 下進(jìn)入/Elasticsearch/Index Management 路徑,看到已經(jīng)上傳成功的“test_2019.xx.xx”索引,附帶上該索引的健康狀態(tài)、副本數(shù)、已錄入的日志條數(shù)、已使用的存儲(chǔ)大小等信息。代表著從服務(wù)器Filebeat(日志上傳)→Logstash(日志收集)→ElasticSearch(分析處理)→Kibana(Web展現(xiàn)管理)全流程的打通。
在Kibana 菜單欄的首位——Discover 下,可以看到接入的日志已按照Logstash 中配置的字段映射,被拆分成易于檢索的單個(gè)字段。在日志詳單的左邊,還能看到單個(gè)字段在當(dāng)前的時(shí)間段內(nèi)將每條日志對(duì)應(yīng)的信息進(jìn)行匯總處理后,計(jì)算出單位時(shí)間內(nèi)的字段類型占比,如圖4 所示。
圖4 Kibana Discover 菜單中的日志索引展示
經(jīng)過上述實(shí)驗(yàn),已成功實(shí)現(xiàn)CDN 日志采集、分析、Web呈現(xiàn)的全流程,對(duì)接入日志的字段進(jìn)行適配,并添加索引后,便可以在Kibana 的核心組件Visualization 中創(chuàng)建熱力圖、直方圖、餅圖、時(shí)間軸等各類數(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)計(jì)出的“服務(wù)成功率”也是CDN 業(yè)務(wù)中常見指標(biāo)之一。以此指標(biāo)為例,進(jìn)行指標(biāo)隨時(shí)間變化的視圖創(chuàng)建。
通過篩選,采用Visualization 中的Visual Builder 來自定義實(shí)現(xiàn):選擇日志對(duì)應(yīng)的建立好的索引,進(jìn)入配置視圖:“Aggregation”選項(xiàng)中提供了將索引中的字段進(jìn)行平均、基數(shù)、百分比、過濾比率、方差、熱門點(diǎn)擊等豐富的匯聚選項(xiàng)。由于服務(wù)成功率指標(biāo)是由HTTP 狀態(tài)碼的錯(cuò)誤/正常的數(shù)量比率來計(jì)算的,因此選擇Filter Ratio(過濾比率)來將字段“httpstatus”中全量計(jì)數(shù)作為Denominator 分母,將其中的5xx 計(jì)數(shù)作為Numerator 分子,以實(shí)現(xiàn)根據(jù)時(shí)間軸來計(jì)算HTTP 錯(cuò)誤碼數(shù)占服務(wù)總數(shù)的比值曲線。
圖6 Kibana 請(qǐng)求失敗率視圖展示
單純觀察所有日志匯總后的HTTP 錯(cuò)誤碼曲線,依舊無法具體定位故障點(diǎn),且匯總后數(shù)據(jù)量過大,當(dāng)部分業(yè)務(wù)錯(cuò)誤率突增,不足以影響全量數(shù)據(jù)時(shí),無法體現(xiàn)。因此,在接入的業(yè)務(wù)、節(jié)點(diǎn)越來越多的情況下,需要在現(xiàn)有視圖的基礎(chǔ)上進(jìn)行衍生:
(1)分組維度
某些廠商的CDN 業(yè)務(wù)分組數(shù)量眾多,不同的分組代表不同的節(jié)點(diǎn),也對(duì)應(yīng)了不同的業(yè)務(wù),匯聚后定位識(shí)別困難。
通過對(duì)服務(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)同時(shí)服務(wù)多個(gè)業(yè)務(wù),日志匯聚后需要進(jìn)行區(qū)分識(shí)別。
由于日志字段中沒有域名字段,無法直接選擇進(jìn)行字段關(guān)聯(lián),因此,對(duì)攜帶域名信息的“URL 字段”進(jìn)行識(shí)別、提取。URL的格式是規(guī)范統(tǒng)一的,所以可在Logstash中對(duì)“URL字段”進(jìn)行過濾,根據(jù)“/”的分割,取得對(duì)應(yīng)域名字符,并映射為新字段,完成“域名字段”的創(chuàng)建。
通過對(duì)域名字段的關(guān)聯(lián),可將該CDN 分組內(nèi)的混合業(yè)務(wù)日志,清楚地由域名維度區(qū)分識(shí)別,實(shí)現(xiàn)單分組內(nèi)多個(gè)業(yè)務(wù)的服務(wù)狀態(tài)監(jiān)控。
(3)物理設(shè)備維度
某些CDN 節(jié)點(diǎn)承載重要業(yè)務(wù),或承擔(dān)負(fù)載均衡、調(diào)度管理等重要職責(zé),需要對(duì)此類節(jié)點(diǎn)設(shè)備進(jìn)行重點(diǎn)監(jiān)控。因此,需要詳細(xì)至單臺(tái)設(shè)備IP 維度進(jìn)行監(jiān)控。但是,部分設(shè)備上報(bào)日志、特殊設(shè)備收集信息中不包含設(shè)備IP 信息,只能選擇在設(shè)備上傳數(shù)據(jù)至Logstash 前,通過Filebeat 在output 配置對(duì)應(yīng)設(shè)備IP、歸屬等信息進(jìn)行標(biāo)識(shí),再由Logstash 中映射新字段后完成創(chuàng)建。
通過對(duì)設(shè)備IP 字段的關(guān)聯(lián),可對(duì)重點(diǎn)關(guān)注設(shè)備進(jìn)行詳細(xì)監(jiān)控,實(shí)現(xiàn)單分組內(nèi)多設(shè)備點(diǎn)對(duì)點(diǎn)監(jiān)控,第一時(shí)間發(fā)現(xiàn)異常設(shè)備,進(jìn)行應(yīng)急處理,及時(shí)止損對(duì)業(yè)務(wù)的影響。
通過上述三種維度衍生配置出的報(bào)表可以直觀、實(shí)時(shí)地展現(xiàn)業(yè)務(wù)服務(wù)情況隨時(shí)間趨勢(shì)的變化,發(fā)現(xiàn)其中某個(gè)分組、某個(gè)業(yè)務(wù)的服務(wù)狀態(tài)異常。但是,對(duì)于業(yè)務(wù)分組內(nèi)服務(wù)的數(shù)個(gè)網(wǎng)站、域名、報(bào)錯(cuò)信息等進(jìn)一步詳細(xì)信息,還是無法知曉并具體定位是哪些服務(wù)受到了影響。
Kibana 上豐富靈活的視圖,可以通過自由組合來進(jìn)一步多維度地展現(xiàn)數(shù)據(jù)分析的信息。通過Pie 視圖,以配置服務(wù)域名字段/報(bào)錯(cuò)信息為基準(zhǔn),同時(shí)篩選并關(guān)聯(lián)業(yè)務(wù)分組與HTTP錯(cuò)誤碼兩個(gè)字段,并配置需要查詢的時(shí)間段,即可將此Pie 視圖聯(lián)合Visual Builder 視圖共同定位至服務(wù)異常的具體業(yè)務(wù),實(shí)現(xiàn)多分組多業(yè)務(wù)中,將Top 錯(cuò)誤域名、Top 報(bào)錯(cuò)信息,同步實(shí)時(shí)呈現(xiàn)。如圖7 所示。
圖7 多維監(jiān)控報(bào)表展示
至截稿前,筆者通過不斷對(duì)該分析系統(tǒng)的更新與迭代,已可按地市節(jié)點(diǎn)、服務(wù)分組、業(yè)務(wù)域名、物理設(shè)備等維度可視化呈現(xiàn),并可通過將狀態(tài)碼、命中率、時(shí)延、下載速率、流量、碼率等指標(biāo)關(guān)聯(lián)下鉆分析定位質(zhì)差,成功發(fā)現(xiàn)數(shù)十起CDN 業(yè)務(wù)因設(shè)備硬件故障、上游回源異常、本地軟件錯(cuò)誤等情況導(dǎo)致的業(yè)務(wù)波動(dòng)影響。與此同時(shí),利用靈活的自定義特性與合理高效的檢索架構(gòu),實(shí)現(xiàn)了多廠家平面日志的匯聚展現(xiàn),突破運(yùn)營(yíng)商在現(xiàn)網(wǎng)運(yùn)維中面臨的困境,極大提高CDN 運(yùn)營(yíng)能力與排障效率。
本文主要是從“基于Elastic Stack 對(duì)CDN 業(yè)務(wù)多平面日志分析系統(tǒng)的架構(gòu)、搭建與實(shí)現(xiàn)”入手,對(duì)每一部分展開說明。本系統(tǒng)降低了日志管理分析的成本,在日志的收集處理、檢索分析和展示方面,凸顯出良好的靈活性與包容性,能有效協(xié)助運(yùn)營(yíng)商解決單業(yè)務(wù)系統(tǒng)內(nèi)多個(gè)廠家各自獨(dú)立、互不兼容的“老大難”問題,提升運(yùn)維效率。目前該系統(tǒng)已推廣至互聯(lián)網(wǎng)電視等業(yè)務(wù)領(lǐng)域,其他需進(jìn)行日志分析的專業(yè)領(lǐng)域均可參照此文介紹的部署方法平滑便捷地移植。
本文只是對(duì)ELK 系統(tǒng)的初步探索,此系統(tǒng)各個(gè)組件都擁有豐富友好的開源接口,下一步將繼續(xù)研究,加入Python 等其他優(yōu)秀的開源技術(shù),深挖優(yōu)化日志分析平臺(tái),依托此平臺(tái)實(shí)現(xiàn)多業(yè)務(wù)多平面日志的統(tǒng)一采集、匯聚呈現(xiàn)與分析預(yù)警。