黃媛媛++王彬++龍卉++劉學(xué)生
摘 要 由于軟件系統(tǒng)的規(guī)模日趨擴大和由此帶來的復(fù)雜性,會產(chǎn)生大量的日志信息,這些日志需要存儲以備查詢和分析,而傳統(tǒng)的關(guān)系數(shù)據(jù)庫對日志存儲、查詢、分析的能力有限,因此,需要考慮一種大容量復(fù)雜場景的日志解決方案。本文介紹了一種基于微服務(wù)化架構(gòu)的日志系統(tǒng),在日志的收集、處理、存儲、展示各個流程都使用微服務(wù)方式部署,支持動態(tài)擴容縮容、支持大規(guī)模日志的處理和存儲,滿足了復(fù)雜使用場景的日志需求。
【關(guān)鍵詞】日志 大容量 微服務(wù)
1 引言
傳統(tǒng)的單體應(yīng)用,日志一般來說有兩種管理方式:記錄在本地文件中,當(dāng)需要分析、處理時,從文件中抽取對應(yīng)的信息,來進(jìn)行人工分析;另一種處理方式是把日志信息存儲在數(shù)據(jù)庫中,通過數(shù)據(jù)庫語句來進(jìn)行查詢和分析。
隨著軟件系統(tǒng)的容量、復(fù)雜度日趨提高,原有的日志管理模式存在的問題:支持的存儲量不高、處理能力有限、大數(shù)據(jù)量下查詢速度緩慢等問題也一一暴露。為了解決這一系列的問題,本文提出了一種微服務(wù)化的日志處理方案,以提升日志管理規(guī)模和管理效率。
2 背景
通常一個復(fù)雜的系統(tǒng),都是由若干個獨立的應(yīng)用集成起來的,這些應(yīng)用互相之間有調(diào)用關(guān)系,出現(xiàn)問題時,需要對問題進(jìn)行跟蹤定位,這時候需要依靠完善的日志記錄和日志集中查詢;日常工作中,也需要對系統(tǒng)運行的情況進(jìn)行統(tǒng)計分析,為決策提供有效的分析數(shù)據(jù)。
因此,需要一個處理能力強、查詢速度快的日志系統(tǒng),由它對日志進(jìn)行采集和存儲,提供搜索、分析、可視化等功能,幫助系統(tǒng)進(jìn)行線上業(yè)務(wù)實時監(jiān)控、業(yè)務(wù)異常原因定位、業(yè)務(wù)日志數(shù)據(jù)統(tǒng)計分析、及安全與合規(guī)審計。
3 ELK Stack
ELK Stack 是 Elasticsearch、Logstash、Kibana 三個開源軟件的組合。
和傳統(tǒng)的日志處理方案相比,ELK Stack 具有如下幾個優(yōu)點:
處理方式靈活。Elasticsearch 是實時全文索引,不需要像 storm 那樣預(yù)先編程才能使用;
配置簡易上手。Elasticsearch 全部采用 JSON 接口,Logstash 是 Ruby DSL 設(shè)計,都是目前業(yè)界最通用的配置語法設(shè)計;
檢索性能高效。雖然每次查詢都是實時計算,但是優(yōu)秀的設(shè)計和實現(xiàn)基本可以達(dá)到全天數(shù)據(jù)查詢的秒級響應(yīng);
集群線性擴展。不管是 Elasticsearch 集群還是 Logstash 集群都是可以線性擴展的;
3.1 kafka
Linkin公司開源的kafka,是一種pull模式的消息隊列,具有高的吞吐量,內(nèi)部采用消息的批量處理,zero-copy機制,數(shù)據(jù)的存儲和獲取是本地磁盤順序批量操作,具有O(1)的復(fù)雜度,消息處理的效率很高,很適合日志這種數(shù)據(jù)量大的應(yīng)用場景。
4 設(shè)計與實現(xiàn)
在本日志系統(tǒng)中,將ELK開源套件作為日志系統(tǒng)的一部分,在此基礎(chǔ)上進(jìn)行了一系列的封裝開發(fā),使之可以適用于本系統(tǒng)的架構(gòu)模式。
4.1 日志收集
在分布式場景下,各個應(yīng)用微服務(wù)上都增加了一個日志采集模塊,這個日志采集模塊負(fù)責(zé)收集本微服務(wù)上的各種類型的日志,根據(jù)配置將日志發(fā)送到logstash的集群負(fù)責(zé)日志收集的logstash shipper采用集群方式部署,開放端口接收數(shù)據(jù),接收到數(shù)據(jù)后,根據(jù)日志信息中的關(guān)鍵字段值,作為kafka的消息生產(chǎn)者,把這些日志發(fā)送到不同的kafka消息主題。
4.2 日志緩沖
Kafka上不同類型的日志需要有不同的目錄空間,在kafka中,這個目錄空間叫topic,kafka有自動的主題創(chuàng)建模式,即當(dāng)kafka接收到一條消息,發(fā)現(xiàn)消息中的topic沒有,就自動創(chuàng)建。因此,只需要約定每種日志的topic,在logstash中進(jìn)行相關(guān)的配置,kafka上并不需要做預(yù)定義的主題創(chuàng)建。
4.3 日志處理
LogStash indexer負(fù)責(zé)從kafka拉取日志信息;進(jìn)行從原始數(shù)據(jù)到ElasticSearch所要求的數(shù)據(jù)格式的轉(zhuǎn)換,比如日期格式轉(zhuǎn)換為預(yù)定義的格式,某些字段的去除、字段的合并轉(zhuǎn)換等;從日志信息中抓取關(guān)鍵字,判斷出應(yīng)該寫入到ElasticSearch的哪個index中,并將信息存入對應(yīng)的index。
4.4 日志存儲
日志存儲在ElasticSearch中,同樣ElasticSearch也是使用集群方式來進(jìn)行部署,ElasticSearch集群節(jié)點分為三種類型:master node 、client node、data node。
Master mode:集群的管理節(jié)點,主要功能是維護(hù)元數(shù)據(jù),管理集群各個節(jié)點的狀態(tài)。
client node:用作分發(fā)的節(jié)點,負(fù)責(zé)將收到的請求分發(fā)到各個data node。
Data node: 負(fù)責(zé)數(shù)據(jù)的存儲、查詢和導(dǎo)入。
ElasticSearch存儲結(jié)構(gòu)定義:本日志系統(tǒng)的管理微服務(wù)預(yù)先在ElasticSearch上進(jìn)行初始化動作,創(chuàng)建存儲結(jié)構(gòu),指定字段的類型和相關(guān)屬性。
4.5 日志展示
本日志系統(tǒng)的界面使用了web頁面方式,拆分了一個專門做展示的微服務(wù),該微服務(wù)在web界面中集成了kibana的圖表進(jìn)行日志的統(tǒng)計、查詢結(jié)果的展示,另外提供了日志信息導(dǎo)出的功能。
主要展示信息包括:日志數(shù)量變化趨勢圖、日志TOPN的實例圖、失敗時間日志分析圖、日志查詢結(jié)果。
5 結(jié)論
本日志系統(tǒng)在日志收集、緩沖、處理、存儲等各個階段均采用了分布式、微服務(wù)化的部署方式,使日志處理的全流程均可根據(jù)實際使用情況,進(jìn)行動態(tài)彈縮,有效地利用了物理資源,并能夠應(yīng)對大規(guī)模的日志情況,由于采用了基于lucene的倒排索引方式的日志存儲,提高了查詢和統(tǒng)計效率,在實際項目中使用效果良好。
作者單位
中興通訊 四川省成都市 610041