彭凌華 陳杰浩 周彪
云上廣西網(wǎng)絡(luò)科技有限公司
本文從政務(wù)數(shù)據(jù)共享交換平臺運(yùn)行過程中產(chǎn)生大量的政務(wù)日志數(shù)據(jù)入手,通過設(shè)計(jì)和實(shí)現(xiàn)一套可以對海量日志數(shù)據(jù)進(jìn)行采集、存儲、分析和展示的平臺,幫助運(yùn)維人員分析政務(wù)數(shù)據(jù)共享交換平臺的運(yùn)行狀況,定位和解決運(yùn)行過程中遇到的問題?;谡?wù)數(shù)據(jù)共享交換平臺要實(shí)現(xiàn)多系統(tǒng)間高并發(fā)的海量數(shù)據(jù)交換的現(xiàn)狀,若使用傳統(tǒng)的日志分析平臺會面臨數(shù)據(jù)采集性能低、數(shù)據(jù)存儲成本高、數(shù)據(jù)分析能力弱、數(shù)據(jù)檢索實(shí)時性差和結(jié)果展示單一化等問題,不利于運(yùn)維人員及時地發(fā)現(xiàn)和解決運(yùn)行過程中遇到的問題。
因此,本文基于ELK技術(shù)來設(shè)計(jì)開發(fā)一套可以對政務(wù)日志數(shù)據(jù)進(jìn)行采集、處理、存儲、分析和可視化展示的日志分析平臺,不僅能有效地對政務(wù)日志數(shù)據(jù)進(jìn)行管理,還能幫助運(yùn)維人員多維度分析政務(wù)數(shù)據(jù)共享交換平臺的運(yùn)行狀況,并能迅速定位和解決運(yùn)行過程中遇到的問題。
ELK是對由Elasticsearch、Logstash和Kibana三個部分組成架構(gòu)的簡稱,ELK目前常用于海量實(shí)時數(shù)據(jù)采集、處理、存儲和檢索的場景。本文提出的政務(wù)日志分析平臺對傳統(tǒng)ELK架構(gòu)中的數(shù)據(jù)采集和可視化部分進(jìn)行了改進(jìn),并新增了數(shù)據(jù)緩存、數(shù)據(jù)分析和風(fēng)險告警功能。
基于ELK的分布式政務(wù)數(shù)據(jù)日志分析平臺主要分為六層:
1.日志數(shù)據(jù)采集層:使用Beats對政務(wù)數(shù)據(jù)共享交換平臺所產(chǎn)生的海量日志進(jìn)行分布式地采集,該部分是整個日志分析平臺數(shù)據(jù)流的源頭;
2.日志數(shù)據(jù)緩存層:使用Kafka技術(shù)搭建一個分布式的消息隊(duì)列對日志數(shù)據(jù)進(jìn)行緩存處理,保障整個日志分析平臺的異步通信,降低平臺各層之間的耦合度;
3.日志數(shù)據(jù)處理層:使用Logstash對采集的日志數(shù)據(jù)進(jìn)行預(yù)處理,為數(shù)據(jù)持久化做準(zhǔn)備;
4.日志數(shù)據(jù)持久層:通過搭建Elasticsearch集群對日志數(shù)據(jù)進(jìn)行持久化存儲,該部分是日志分析平臺的核心,是平臺進(jìn)行實(shí)時數(shù)據(jù)分析和展示的基礎(chǔ);
5.日志數(shù)據(jù)分析層:通過LOF異常檢測算法和基于概率統(tǒng)計(jì)的異常檢測算法來對存儲在Elasticsearch中的數(shù)據(jù)進(jìn)行噪點(diǎn)去除和分析,數(shù)據(jù)分析的結(jié)果將成為平臺運(yùn)行異常情況快速定位和告警提供依據(jù);
6.日志數(shù)據(jù)檢索展示層:該部分是對日志數(shù)據(jù)進(jìn)行可視化展示,一是展示平臺采集到的原始數(shù)據(jù),通過Kibana進(jìn)行實(shí)現(xiàn),二是對數(shù)據(jù)分析所得結(jié)果的展示,通過搭建Web服務(wù)實(shí)現(xiàn)。
平臺采集的數(shù)據(jù)包括Nginx日志數(shù)據(jù)、指標(biāo)類型數(shù)據(jù)、審計(jì)日志數(shù)據(jù),因此,在數(shù)據(jù)采集過程中主要使用Filebeat、MetricBeat、Packetbeat 和Auditbeat四個beats插件來采集數(shù)據(jù):
Filebeat用于對共享交換平臺的Nginx日志進(jìn)行采集,它會對所采集的每個日志文件的傳遞狀態(tài)進(jìn)行保存,在出現(xiàn)輸出設(shè)備無法正常工作的情況下,F(xiàn)ilebeat可以根據(jù)該狀態(tài)記錄到最后收取數(shù)據(jù)的偏移位置,并在輸出恢復(fù)后繼續(xù)讀取文件,從而保障數(shù)據(jù)的完整性。
Metricbeat用于定期收集共享交換平臺所在服務(wù)器上的指標(biāo)數(shù)據(jù),將數(shù)據(jù)推送到指定的輸出中,幫助運(yùn)維人員監(jiān)控服務(wù)器和在服務(wù)器上所托管的服務(wù)。
Packetbeat用于實(shí)時采集共享交換平臺網(wǎng)絡(luò)數(shù)據(jù)包,采集應(yīng)用程序服務(wù)器之間的網(wǎng)絡(luò)流量情況,用以監(jiān)控關(guān)聯(lián)請求與響應(yīng)時長,并記錄每個事務(wù)有意義的字段,以此作為日志分析平臺運(yùn)行異常的判斷依據(jù)。
Auditbeat用于采集數(shù)據(jù)共享交換平臺所在服務(wù)器的審計(jì)日志,實(shí)時監(jiān)控服務(wù)器中的指定文件,及時報告文件的建立、刪除、更新和移動等事件。Auditbeat可以將采集的數(shù)據(jù)組合成為一個相關(guān)的事件,并以結(jié)構(gòu)化數(shù)據(jù)的格式輸出到數(shù)據(jù)緩存層中,為實(shí)現(xiàn)對平臺更好的監(jiān)控提供數(shù)據(jù)來源。
日志數(shù)據(jù)緩存層是采用Kafka搭建一個分布式的消息隊(duì)列來實(shí)現(xiàn)日志數(shù)據(jù)采集層和日志數(shù)據(jù)處理層之間緩存數(shù)據(jù)的功能,日志數(shù)據(jù)采集層作為生產(chǎn)者將采集到的日志數(shù)據(jù)推送到Kafka指定的Topic中,再由作為消費(fèi)者的日志數(shù)據(jù)處理層從指定的Topic中對日志數(shù)據(jù)進(jìn)行消費(fèi)。
日志數(shù)據(jù)緩存層采用Logstash來消費(fèi)Kafka中的日志數(shù)據(jù),并對數(shù)據(jù)進(jìn)行過濾、格式化處理和字段修改等操作,最終將處理后的數(shù)據(jù)推送到Elasticsearch集群中做持久化存儲。
Logstash的管道處理流程主要分為三個階段:輸入(input)、處理(filter)和輸出(output),輸入階段的主要工作是消費(fèi)Kafka中緩存的數(shù)據(jù),并將數(shù)據(jù)轉(zhuǎn)發(fā)給處理階段。處理階段的主要工作是對從Kafka中消費(fèi)的數(shù)據(jù)進(jìn)行過濾、截取和格式化操作,由于數(shù)據(jù)從采集到處理中間會經(jīng)過Kafka這個中間件,因此需要對Kafka處理后的日志數(shù)據(jù)進(jìn)行格式化過濾。Logstash提供了多種過濾插件,如Grok、Geoip、Json等,本文使用最為常用的Grok來進(jìn)行過濾。輸出階段的主要工作是定義日志數(shù)據(jù)的存儲地址,即定義Elasticsearch集群的相關(guān)信息。
1.集群搭建
為了能夠較好的解決大量日志數(shù)據(jù)存儲的問題,采用分布式的架構(gòu)來實(shí)現(xiàn)數(shù)據(jù)的持久化,由于所采集的日志數(shù)據(jù)是基于時間序列的數(shù)據(jù),數(shù)據(jù)每天都會寫入,增長速度較快,為了盡可能地降低硬件成本,同時還要保持日志分析平臺的穩(wěn)定性,采用冷熱節(jié)點(diǎn)分離(Hot&Warm)的架構(gòu)來對集群進(jìn)行部署,熱節(jié)點(diǎn)用于數(shù)據(jù)的寫入,由于Elasticsearch主要解決的是海量數(shù)據(jù)的存儲和檢索,因此需要保證服務(wù)器的高可用性,故采用SSD盤來滿足對讀寫性能的要求,熱數(shù)據(jù)節(jié)點(diǎn)處理所有新輸入的日志數(shù)據(jù),存儲速度也較快,以便確??焖俚夭杉蜋z索數(shù)據(jù)。冷節(jié)點(diǎn)可用于存儲密度較大、數(shù)據(jù)時效較低,且需在較長期限內(nèi)保留的日志數(shù)據(jù),僅保存日志數(shù)據(jù)的只讀索引,故采用成本較低但存儲容量大的HDD盤來滿足對數(shù)據(jù)存儲的需求。通過使用冷熱分離的架構(gòu)既可以保證熱節(jié)點(diǎn)的性能,又可以降低冷節(jié)點(diǎn)的存儲成本,幫助集群節(jié)省在服務(wù)器資源上的開銷。
2.集群安全性實(shí)現(xiàn)
由于政務(wù)數(shù)據(jù)共享交換平臺的承載政務(wù)數(shù)據(jù)的敏感性和重要性,需要對集群進(jìn)行以下設(shè)置,以保證數(shù)據(jù)的安全性。
①用戶權(quán)限管理
本文使用RBAC(Role Based Access Control)來實(shí)現(xiàn)對用戶權(quán)限的管理,通過定義一個角色,同時為該角色分配一組權(quán)限,包括索引級別、字段級別和集群級別上的不同操作,并將角色分配給用戶來使用戶擁有不同的操作權(quán)限。
②集群內(nèi)部通信安全實(shí)現(xiàn)
Elasticsearch集群內(nèi)部是通過9300端口進(jìn)行日志數(shù)據(jù)傳輸,在傳輸?shù)倪^程中可能會有節(jié)點(diǎn)冒充是集群的節(jié)點(diǎn)加入集群,從而竊取敏感信息的現(xiàn)象。為了防止該現(xiàn)象的出現(xiàn),本文通過配置TLS協(xié)議來對集群內(nèi)部傳輸?shù)臄?shù)據(jù)進(jìn)行加密。TLS協(xié)議使用Trusted Certificate Authority(CA)簽發(fā)的X.509的證書來驗(yàn)證各個節(jié)點(diǎn)的身份,這樣當(dāng)有節(jié)點(diǎn)申請加入到集群時,若該節(jié)點(diǎn)持有正確的CA簽名證書才可自動加入,否則失敗。
③集群外部通信安全實(shí)現(xiàn)
日志分析平臺中直接對Elasticsearch集群進(jìn)行訪問的程序有Logstash和Kibana,默認(rèn)的訪問協(xié)議是HTTP協(xié)議,如果有攻擊者截取了Logstash和Elasticsearch之間或者Elasticsearch和Kibana之間的傳輸報文,就可以直接讀取其中包含的信息,帶來敏感信息泄露的風(fēng)險。為了預(yù)防該風(fēng)險的發(fā)生,平臺配置了具有SSL加密的傳輸協(xié)議HTTPS,為各個程序和Elasticsearch集群的通信進(jìn)行加密,保障數(shù)據(jù)傳輸?shù)陌踩浴?/p>
為了實(shí)現(xiàn)對政務(wù)數(shù)據(jù)共享交換平臺更準(zhǔn)確的監(jiān)控,本文對采集到的日志數(shù)據(jù)進(jìn)行離線分析,主要包括噪點(diǎn)數(shù)據(jù)剔除、閾值推薦和風(fēng)險告警三個部分。
1.從Elasticsearch集群所提供的接口中獲取近期的Nginx日志數(shù)據(jù),通過LOF算法對這些數(shù)據(jù)中的噪點(diǎn)數(shù)據(jù)進(jìn)行剔除;
2.采用基于概率統(tǒng)計(jì)的異常檢測方法分析正常狀態(tài)和異常狀態(tài)下的正常交換數(shù)據(jù)的平均值、最大值、最小值和標(biāo)準(zhǔn)差,并根據(jù)正太分布的結(jié)果計(jì)算出響應(yīng)時間的閾值上下限;
3.采用告警組件ElastAlert來實(shí)現(xiàn)告警功能。ElastAlert是一個告警框架,通過設(shè)置相應(yīng)的告警規(guī)則,將數(shù)據(jù)分析得到的閾值作為判斷標(biāo)準(zhǔn),實(shí)時地對存入Elasticsearch集群中的數(shù)據(jù)進(jìn)行監(jiān)控,一旦發(fā)現(xiàn)指標(biāo)達(dá)到異常閥值,則立即向有關(guān)人員發(fā)送告警信息。
日志數(shù)據(jù)檢索和展示層是日志分析平臺數(shù)據(jù)處理流程的終點(diǎn),該層的主要功能是為運(yùn)維人員提供查詢和展示日志數(shù)據(jù)的窗口。日志分析平臺所采集的數(shù)據(jù)在經(jīng)過處理后分為兩種類型:一是采集的原始日志數(shù)據(jù);二是經(jīng)過分析后的結(jié)果數(shù)據(jù)。對原始日志的操作僅限于查詢和檢索,因此可使用可視化工具Kibana來實(shí)現(xiàn)。而對分析結(jié)果的展示和告警功能的實(shí)現(xiàn)是需要進(jìn)行多類型復(fù)雜的聚合、排序和數(shù)據(jù)分析等操作才能實(shí)現(xiàn)的,僅使用Kibana是無法滿足需求的,因此通過搭建基于SpringBoot的Web服務(wù)來實(shí)現(xiàn)該部分功能。
本文設(shè)計(jì)和實(shí)現(xiàn)的政務(wù)數(shù)據(jù)日志分析平臺對傳統(tǒng)ELK架構(gòu)中的數(shù)據(jù)采集和可視化部分進(jìn)行了改進(jìn),實(shí)現(xiàn)了日志分析平臺在日志數(shù)據(jù)采集性能上的提升和對日志數(shù)據(jù)多元化展示的效果,并新增了數(shù)據(jù)緩存、數(shù)據(jù)分析和風(fēng)險告警功能,提高了日志分析平臺的穩(wěn)定性,達(dá)到了幫助運(yùn)維人員分析政務(wù)數(shù)據(jù)共享交換平臺的運(yùn)行狀況,快速定位和解決問題的目的。
雖然本文所設(shè)計(jì)的分布式日志采集部分具有較高的采集性能,但卻無法采集數(shù)據(jù)庫中日志表的數(shù)據(jù),而日志表中存儲著十分重要的系統(tǒng)運(yùn)行信息,所以升級版本中將會使用Beats的其他插件和其他數(shù)據(jù)采集工具結(jié)合起來,使日志分析的數(shù)據(jù)來源更加完整。