張 振,劉俊艷
(北京匯通金財信息科技有限公司,北京 100053)
基于微服務(wù)架構(gòu)的日志監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)
張 振,劉俊艷
(北京匯通金財信息科技有限公司,北京 100053)
由于軟件系統(tǒng)的規(guī)模日趨擴大和由此帶來的復(fù)雜性,會產(chǎn)生大量的日志信息,這些日志需要存儲以備查詢和分析,而傳統(tǒng)的關(guān)系數(shù)據(jù)庫對日志存儲、查詢、分析的能力有限,因此,需要考慮一種大容量復(fù)雜場景的日志解決方案。本文介紹了一種基于微服務(wù)化架構(gòu)的日志系統(tǒng),在日志的收集、處理、存儲、展示各個流程都使用微服務(wù)方式部署,支持動態(tài)擴容縮容、支持大規(guī)模日志的處理和存儲,滿足了復(fù)雜使用場景的日志需[1]。
微服務(wù);日志系統(tǒng)
隨著科學(xué)技術(shù)的發(fā)展以及云計算、P2P 等技術(shù)的普及,全球數(shù)據(jù)量呈現(xiàn)爆炸式的增長,尤其是大數(shù)據(jù)時代的到來,通過互聯(lián)網(wǎng),用戶制造了海量的數(shù)據(jù)日志信息。2017年1月22日中國互聯(lián)網(wǎng)絡(luò)信息中心發(fā)布的《第39次中國互聯(lián)網(wǎng)絡(luò)發(fā)展狀況統(tǒng)計報告》中指出:我國2016年全年共計新增網(wǎng)民4299萬人,增長率為 6.2%,其中手機網(wǎng)民規(guī)模達 6.95億,占比達 95.1%,增長率連續(xù)3年超過10%[2]。手機網(wǎng)民最常使用即時通信APP:2016年,網(wǎng)民在手機端最經(jīng)常使用的 APP 應(yīng)用前三位分別是微信、QQ、淘寶,無論是微信、QQ、微博等社交通信軟件還是淘寶、京東等電商軟件,各系統(tǒng)每天產(chǎn)生的海量日志信息都達到了指數(shù)級。而傳統(tǒng)的關(guān)系數(shù)據(jù)庫對日志存儲、查詢、分析的能力有限,已無法滿足呈爆炸性增長的海量數(shù)據(jù)日志需求,為解決信息存儲容量、數(shù)據(jù)安全、日志搜索分析等問題,基于微服務(wù)架構(gòu)的日志監(jiān)控系統(tǒng)應(yīng)運而生,如今已得到廣泛應(yīng)用。使用日志監(jiān)控系統(tǒng)能夠提前對潛在的風(fēng)險進行發(fā)掘,分析、判斷并形成定性或定量的描述,從而采取應(yīng)對措施來降低風(fēng)險。這對提高信息通信系統(tǒng)的安全性、穩(wěn)定性及其服務(wù)能力具有重要的理論價值和實際意義。系統(tǒng)采用多任務(wù)分布式技術(shù)對海量日志進行分析挖掘,應(yīng)用規(guī)則關(guān)聯(lián)、統(tǒng)計關(guān)聯(lián)等分析方法,可以建立科學(xué)的分析模型,使得對日志的分析深度與事件的識別準確度得到進一步的提升。
本文闡述了基于微服務(wù)架構(gòu)的日志處理方案設(shè)計,并結(jié)合近幾年來微服務(wù)架構(gòu)在日志監(jiān)控系統(tǒng)的應(yīng)用情況,對日志監(jiān)控系統(tǒng)的概念、特點、體系架構(gòu)進行研究,以提升日志管理規(guī)模和管理效率。
1.1 微服務(wù)介紹
微服務(wù)是構(gòu)建分布式系統(tǒng)的架構(gòu)風(fēng)格,是指開發(fā)一個單個小型的但有業(yè)務(wù)功能的服務(wù),每個服務(wù)都有自己的處理和輕量通訊機制,可以部署在單個或多個服務(wù)器上。微服務(wù)也指一種松耦合的、有一定的有界上下文的面向服務(wù)架構(gòu)。也就是說,如果每個服務(wù)都要同時修改,那么它們就不是微服務(wù),因為它們緊耦合在一起;如果你需要掌握一個服務(wù)太多的上下文場景使用條件,那么它就是一個有上下文邊界的服務(wù),這個定義來自DDD領(lǐng)域驅(qū)動設(shè)計[4-5]。
相對于單體架構(gòu)和SOA,它的主要特點是組件化、松耦合、自治、去中心化,體現(xiàn)在以下幾個方面[4-5]:
1. 一組小的服務(wù)
服務(wù)粒度要小,而每個服務(wù)是針對一個單一職責(zé)的業(yè)務(wù)能力的封裝,專注做好一件事情。
2. 獨立部署運行和擴展
每個服務(wù)能夠獨立被部署并運行在一個進程內(nèi)。這種運行和部署方式能夠賦予系統(tǒng)靈活的代碼組織方式和發(fā)布節(jié)奏,使得快速交付和應(yīng)對變化成為可能。
3. 獨立開發(fā)和演化
技術(shù)選型靈活,不受遺留系統(tǒng)技術(shù)約束。合適的業(yè)務(wù)問題選擇合適的技術(shù)可以獨立演化。服務(wù)與服務(wù)之間采取與語言無關(guān)的API進行集成。相對單體架構(gòu),微服務(wù)架構(gòu)是更面向業(yè)務(wù)創(chuàng)新的一種架構(gòu)模式。
4. 獨立團隊和自治
團隊對服務(wù)的整個生命周期負責(zé),工作在獨立的上下文中,自己決策自己治理,而不需要統(tǒng)一的指揮中心。團隊和團隊之間通過松散的社區(qū)部落進行銜接。
1.2 ELK 介紹
ELK由Elasticsearch、Logstash和Kibana三部分組件組成;
ELK具有如下幾個特點:
(1)處理方式靈活:Elasticsearch是實時全文索引,不需要像storm那樣預(yù)先編程才能使用[3];
(2)集群線性擴展:不管是 Elasticsearch集群還是 Logstash 集群都是可以線性擴展的[3];
(3)前端操作炫麗:Kibana界面上,只需要點擊鼠標,就可以完成搜索、聚合功能,生成炫麗的儀表板[3];
(4)檢索性能高效:雖然每次查詢都是實時計算,但是優(yōu)秀的設(shè)計和實現(xiàn)基本可以達到全天數(shù)據(jù)查詢的秒級響應(yīng)[3];
(5)配置簡易上手:Elasticsearch 全部采用JSON接口,Logstash是Ruby DSL設(shè)計,都是目前業(yè)界最通用的配置語法設(shè)計[3];
在本日志系統(tǒng)中,將Elasticsearch、Logstash、Kibana開源套件作為日志系統(tǒng)架構(gòu)組件,并且在此基礎(chǔ)上進行了一系列的封裝開發(fā),使之適用于本日志系統(tǒng)的架構(gòu)模式。
1.2.1 Elasticsearch
Elasticsearch是一個基于 Lucene的搜索服務(wù)器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發(fā)的,并作為 Apache許可條款下的開放源碼發(fā)布,是當前流行的企業(yè)級搜索引擎。設(shè)計用于云計算中,能夠達到實時搜索,穩(wěn)定,可靠,快速,安裝使用方便,零配置,支持集群(Cluster,見圖1)自動發(fā)現(xiàn),索引自動分片、索引副本機制(見圖2),多數(shù)據(jù)源,自動搜索負載等特點[7-10]。

圖1 集群Fig.1 Cluster
(1)節(jié)點(Node)和集群(Cluster)
節(jié)點是集群中的一個Elasticearch實例。集群是一組擁有共同的 cluster name的節(jié)點。其中一個節(jié)點就是一個 ES進程,多個節(jié)點組成一個集群。一般每個節(jié)點都運行在不同的操作系統(tǒng)上,配置好集群相關(guān)參數(shù)后 ES會自動組成集群。集群內(nèi)部通過 ES 的選主算法選出主節(jié)點,而集群外部則是可以通過任何節(jié)點進行操作,無主從節(jié)點之分,對外表現(xiàn)對等,去中心化,有利于客戶端編程。

圖2 分片、復(fù)制Fig.2 Fragmentation, replication
(2)索引Index
索引在 ES中索引有兩層含義,作為動詞,它指的是把一個文檔保存到ES中的過程,索引一個文檔后,我們就可以使用ES搜索到這個文檔;作為名詞,它是指保存文檔的地方,相當于關(guān)系數(shù)據(jù)庫中的database概念,一個集群中可以包含多個索引。
(3)分片shard
ES是一個分布式系統(tǒng),它保存索引時會選擇適合的“主分片”(Primary Shard),把索引保存到其中(我們可以把分片理解為一塊物理存儲區(qū)域)。分片的分法是固定的,而且是安裝時候就必須要決定好的(默認是5),后面就不能改變了。
既然有主分片,那肯定是有“從”分片的,在 ES里稱之為“副本分片”(Replica Shard)。副本分片主要有兩個作用:高可用:某分片節(jié)點掛了的話可走其他副本分片節(jié)點,節(jié)點恢復(fù)后上面的分片數(shù)據(jù)可通過其他節(jié)點恢復(fù)負載均衡:ES會自動根據(jù)負載情況控制搜索路由,副本分片可以將負載均攤。
(4)RESTful支持
ES支持RESTful訪問,并且ES的HTTP接口不只是可以進行業(yè)務(wù)操作(索引/搜索),還可以進行一些配置等。
(5)document文檔
一個文檔就是一個保存在es中的JSON文本,可以把它理解為關(guān)系型數(shù)據(jù)庫表中的一行。每個文檔都是保存在索引中的,擁有一種類型和 id。一個文檔是一個 JSON對象(一些語言中的 hash /hashmap / associative array)包含了0或多個字段(鍵值對)。原始的 JSON文本在索引后將被保存在_source字段里,搜索完成后返回值中默認是包含該字段的。
(6)id
Id是用于標識文檔的,一個文檔的索引/類型/id必須是唯一的。文檔id是自動生成的(如果不指定)。
(7)field字段
一個文檔包含了若干字段,或稱之為鍵值對。字段的值可以是簡單(標量)值(例如字符串、整型、日期),也可以是嵌套結(jié)構(gòu),例如數(shù)組或?qū)ο蟆R粋€字段類似于關(guān)系型數(shù)據(jù)庫表中的一列。每個字段的映射都有一個字段類型(不要和文檔類型搞混了),它描述了這個字段可以保存的值類型,例如整型、字符串、對象。映射還可以讓我們定義一個字段的值如何進行分析。
(8)mapping映射
一個映射類似于關(guān)系型數(shù)據(jù)庫中的模式定義。每個索引都存在一個映射,它定義了該索引中的每一種類型,以及索引相關(guān)的配置。映射可以顯示定義,或者在文檔被索引時自動創(chuàng)建。
1.2.2 Logstash
Logstash使用 Jruby語言編寫,對于使用者來講,Logstash本身是基于命令行界面,面向任務(wù)處理的。Logstash的軟件架構(gòu)是一種帶有“管道-過濾器”風(fēng)格的插件式架構(gòu),作為一個開源軟件,Logstash遵循Apache 2.0進行開源,第三方社區(qū)為其貢獻了大量插件,它可以實現(xiàn)數(shù)據(jù)傳輸,格式處理,格式化輸出,還有強大的插件功能它可以對日志進行收集、分析,并將其存儲供以后使用。主要特點:幾乎可以訪問任何數(shù)據(jù)、可以和多種外部應(yīng)用結(jié)合、支持彈性擴展[7-10]。
● 輸入階段:接受不同來源的數(shù)據(jù)流入,可以配置codec插件進行簡單的處理。
● 過濾階段:對流入數(shù)據(jù)進行過濾等操作,傳遞給 output,其中“輸入”與“輸出”是必須有的,“過濾”階段是可選的。
● 輸出階段:將數(shù)據(jù)傳遞到消息隊列,文件系統(tǒng)等進行進一步處理,在ELK的日志系統(tǒng)中,輸出到ElasticSearch索引中。

圖3 Logstash業(yè)務(wù)流程圖Fig.3 Logstash business flowchart

圖4 Logstash 構(gòu)成圖Fig.4 Logstash constitute a figure
三個階段的處理任務(wù)是異步的,不存在跨階段任務(wù)執(zhí)行與同一個線程中的情況。
logstash由三個主要部分組成(見圖4):
(1)Shipper-發(fā)送日志數(shù)據(jù);
(2)Broker-收集數(shù)據(jù),缺省內(nèi)置 Redis;
(3)Indexer-數(shù)據(jù)寫入;
1.2.3 Kibana
Kibana是一款基于 Apache開源協(xié)議,使用JavaScript 語言編寫,為Elasticsearch提供分析和可視化的 Web平臺。通過 Kibana來查詢、瀏覽并且可以與存儲在 Elasticsearch索引中的數(shù)據(jù)交互。還可以很容易的以各種各樣的圖表,表格和地圖樣式來針對數(shù)據(jù)執(zhí)行高級的數(shù)據(jù)分析以及可視化。Kibana使得我們可以很容易的了解海量數(shù)據(jù)。它非常簡單,基于瀏覽器的界面使得您可以快速的創(chuàng)建并且實時顯示修改的 Elasticsearch查詢的儀表盤,而且Kibana的配置非常簡單,在幾分鐘內(nèi)就可以成功安裝Kibana并查詢Elasticsearch,不需要任何額外的基礎(chǔ)設(shè)施[7-10]。
2.1 requestID 生成及傳遞
各個應(yīng)用統(tǒng)一配置請求攔截器,當攔截到 http請求時,攔截器首先生成RequestID,接著收集應(yīng)用的調(diào)用信息及一些用戶信息并加密輸出到日志中。
RequestID的生成是為各個應(yīng)用日志間形成調(diào)用鏈,每次請求都會生成唯一的RequestID,在日志量非常龐大的情況下,帶有 RequestID的日志在排查故障,查詢用戶每次請求所產(chǎn)生的日志非常方便、快捷。
2.2 日志采集
日志采集階段會為每個應(yīng)用服務(wù)器上都部署一個日志采集模塊,這個日志采集模塊的作用就是采集各服務(wù)器上的應(yīng)用日志,logstash shipper根據(jù)配置將各應(yīng)用日志采集到 redis集群中,logstash shipper會為各個應(yīng)用定義唯一type用來以后生成索引用。
2.3 日志緩存

圖5 日志系統(tǒng)架構(gòu)圖Fig.5 Log system architecture diagrams

圖6 Re questId傳遞圖Fig.6 Re questId passing figure
redis作為日志轉(zhuǎn)儲組件可以有效提高系統(tǒng)可用性,使用集群或者主備結(jié)構(gòu)代替單實例,可以有效提高組件的可用性。在 redis中,數(shù)據(jù)統(tǒng)一緩存在key為logstash(key可自定義)的名字中,采用list數(shù)據(jù)類型作為日志采集的一個緩存區(qū)隊列,list類型是按照插入順序排序的字符串鏈表,這意味著無論數(shù)據(jù)量多么巨大,頭尾插入或刪除數(shù)據(jù)的速度非常快,利用List的Push/Pop操作即實現(xiàn)了消息隊列。
2.4 日志處理
日志處理階段是logstash indexer端從redis中讀取日志數(shù)據(jù),并進行一系列的過濾處理然后存儲到到ElasticSearch中。其處理過程中要進行數(shù)據(jù)格式的轉(zhuǎn)換,比如抽取日期然后轉(zhuǎn)換為預(yù)定義的格式、抽取日志級別、RequestId等字段,抽取message字段信息,過濾字段信息根據(jù)條件進行刪除或合并等。還有通過GeoIP獲取ip所在地,根據(jù)系統(tǒng)定制過濾條件,正則解析、Json解析等;從日志信息中抓取關(guān)鍵字,根據(jù)type生成ElasticSearch的索引,并將日志信息寫入到ElasticSearch的index中。
2.5 日志存儲
日志存儲在ElasticSearch中,并且ElasticSearch也是使用集群方式來進行部署,通過設(shè)置 elasticsearch.yml的cluster.name來定義集群名稱,并且多個elasticsearch集群名要完全一樣,然后設(shè)置 node.name來區(qū)別每個 elasticsearch。ElasticSearch集群節(jié)點分為兩種類型:node.master、node.data。[6][11][12]
node.master:當設(shè)置為 true時,當前節(jié)點就成為了集群的管理節(jié)點(即主節(jié)點),主要功能是維護元數(shù)據(jù),管理集群各個節(jié)點的狀態(tài)[6,11-12]。
node.data:當設(shè)置為true時,當前節(jié)點就成了數(shù)據(jù)節(jié)點,主要負責(zé)數(shù)據(jù)的存儲、查詢和導(dǎo)入[6,11-12]。
2.6 日志展示
本日志系統(tǒng)的界面使用了kibana開源框架,為Elasticsearch提供分析和可視化的 Web平臺。它可以在 Elasticsearch的索引中查找,交互數(shù)據(jù),并生成各種維度的表圖。展示出了日志的查詢結(jié)果、日志的數(shù)量變化趨勢圖、日志生成的各種圖表視圖、分析儀表盤等。
本日志系統(tǒng)與常規(guī) elk部署的日志系統(tǒng)不同,設(shè)計中為各個應(yīng)用統(tǒng)一配置了請求攔截器,用來生成唯一的 RequestID和收集請求信息等,通過RequestID能查詢出整個請求的調(diào)用鏈日志詳情,對于排查異常、快速定位非常方便快捷。并且在日志收集、緩沖、處理、存儲等各個階段均采用了分布式、微服務(wù)化的部署方式,使日志處理的全流程均可根據(jù)實際使用情況,進行動態(tài)彈縮,有效地利用了物理資源,并能夠應(yīng)對大規(guī)模的日志情況,由于采用了基于 lucene的倒排索引方式的日志存儲,提高了查詢和統(tǒng)計效率,在實際項目中使用效果良好[1]。
[1] 參考網(wǎng)FX361.COM. 基于微服務(wù)架構(gòu)的日志系統(tǒng). http://www.handmsg.com/page/2017/0315/1185754.shtml.
[2] 杜振南, 朱崇軍. 分布式文件系統(tǒng)綜述[J]. 軟件工程與應(yīng)用, 2017, 6(2): 21-27.
[3] 扣bubuki.com. ELK-實用日志分析系統(tǒng). http://www.bubuko.com/infodetail-2025984.html.
[4] PetterLiu. 博客園. 微服務(wù)架構(gòu)設(shè)計. http://www.cnblogs.com/wintersun/p/6219259.html.
[5] 紐曼(Sam Newman). 微服務(wù)設(shè)計. 軟件工程及軟件方法學(xué),2016-04-01.
[6] 饒琛琳. ELK Stack權(quán)威指南. 2017.
[7] Saurabh Chhajed(蘇庫拉·塞哈特). Learning ELK Stack.2016.
[8] 徐剛. IBMdeveloperWords. 集中式日志系統(tǒng)ELK協(xié)議棧詳解. https://www.ibm.com/developerworks/cn/opensource/oscn-elk/.
[9] CSDN博客. 漫談ELK在大數(shù)據(jù)運維中的應(yīng)用. http://www.cnblogs.com/wintersun/p/6219259.html.
[10] 鄭彥生. 51CTO博客. ELK日志分析系統(tǒng). http://467754239.blog.51cto.com/4878013/1700828/.
[11] elastic. 官網(wǎng). https://www.elastic.co/guide/index.html.
[12] 饒琛琳. GitBook. ELKstack 中文指南. https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details.
Design and Implementation of Log Monitoring System Based on Microservice Architecture
ZHANG Zhen, LIU Jun-yan
(Beijing huitong jincai information technology Co., Ltd., Beijing 100053, China)
Due to the size of the software system and widening of the complexity of the resulting will produce large amounts of log information, these logs need to be stored for query and analysis, and the traditional relational database log storage, query, analysis ability is limited, therefore, need to consider a large log solution of complex scenes.In this paper, a logging system based on micro structure of service, in log collection, processing, storage and display each process using micro service deployment, support for dynamic expansion shrinkage mass log processing and storage capacity, support, to satisfy the complex usage scenarios of log.
Micro-service; Log system
TP311
A
10.3969/j.issn.1003-6970.2017.11.037
本文著錄格式:張振,劉俊艷. 基于微服務(wù)架構(gòu)的日志監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[J]. 軟件,2017,38(11):196-201
張振(1986-),男,本科,北京匯通金財信息科技有限公司,主要研究方向:互聯(lián)網(wǎng)技術(shù);劉俊艷(1978-),女,碩士,北京匯通金財信息科技有限公司,主要研究方向:計算機應(yīng)用。