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