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