■ 中移互聯(lián)(杭州)科技有限公司 闞宗挺 劉順宇
編者按:網(wǎng)絡(luò)信息迅速發(fā)展的今天,企業(yè)在面對(duì)用戶劇增的實(shí)際場(chǎng)景時(shí),單節(jié)點(diǎn)的接口服務(wù)已無(wú)法滿足劇增的訪問(wèn)量,這時(shí)就需要用到分布式架構(gòu):企業(yè)將相同的服務(wù)發(fā)布到不同的服務(wù)器上。但在分布式架構(gòu)中日志的管理就成了一個(gè)必須要解決的問(wèn)題,分散式的日志結(jié)構(gòu)難以迅速定位查詢目標(biāo),因此要用到分布式日志服務(wù)來(lái)對(duì)我們的日志進(jìn)行統(tǒng)一管理。
在項(xiàng)目中通常會(huì)遇到并發(fā)量突增時(shí)導(dǎo)致系統(tǒng)不可用而采用分布式架構(gòu)的情況,日志此時(shí)也要進(jìn)行統(tǒng)一管理,方便查詢定位。在進(jìn)行統(tǒng)一管理時(shí),如果集群服務(wù)器有許多臺(tái),那么這么多臺(tái)服務(wù)器同時(shí)向統(tǒng)一日志系統(tǒng)發(fā)送數(shù)據(jù),將導(dǎo)致系統(tǒng)的IO效率特別底下,存在數(shù)據(jù)丟失的情況。為解決該問(wèn)題,加入一個(gè)二級(jí)日志儲(chǔ)存策略,將部分服務(wù)器日志先通過(guò)緩存?zhèn)魅攵?jí)儲(chǔ)存,再通過(guò)二級(jí)儲(chǔ)存通過(guò)緩存?zhèn)魅虢y(tǒng)一日志系統(tǒng),這樣統(tǒng)一日志系統(tǒng)的總連接數(shù)大大減少,
IO效率大大提高。另外,為了保證總系統(tǒng)的穩(wěn)定性,業(yè)務(wù)和日志服務(wù)之間必須是解耦的,因此通過(guò)監(jiān)聽(tīng)日志文件而非采用遠(yuǎn)程寫(xiě)入日志的形式。日志服務(wù)器宕機(jī)對(duì)業(yè)務(wù)無(wú)干擾,某個(gè)業(yè)務(wù)服務(wù)器宕機(jī)對(duì)日志服務(wù)也沒(méi)有影響,日志服務(wù)可以繼續(xù)收集其他服務(wù)器的日志。
本系統(tǒng)包括三個(gè)需求模塊,分別是組件通信模塊、分級(jí)采集日志模塊、日志管理模塊、日志查詢分析模塊。
應(yīng)用服務(wù)器和二級(jí)儲(chǔ)存,二級(jí)儲(chǔ)存和統(tǒng)一日志服務(wù)之間都是通過(guò)遠(yuǎn)程過(guò)程調(diào)用來(lái)實(shí)現(xiàn)的。在數(shù)據(jù)傳輸時(shí),會(huì)把待傳數(shù)據(jù)放到緩沖中,再進(jìn)行發(fā)送。
此模塊主要是為了解決集群中的應(yīng)用服務(wù)器過(guò)多同時(shí)進(jìn)行數(shù)據(jù)傳輸時(shí)造成統(tǒng)一日志服務(wù)端負(fù)載過(guò)大導(dǎo)致系統(tǒng)崩潰,在應(yīng)用服務(wù)器和日志服務(wù)儲(chǔ)存端添加一個(gè)二級(jí)儲(chǔ)存作為一個(gè)中間傳輸間,二級(jí)服務(wù)器與應(yīng)用服務(wù)器之間是一對(duì)多關(guān)系,這樣通過(guò)增加二級(jí)緩存數(shù)可避免上述系統(tǒng)崩潰的情況,而且當(dāng)某個(gè)應(yīng)用服務(wù)器長(zhǎng)時(shí)間未發(fā)送日志時(shí),會(huì)在其對(duì)應(yīng)的二級(jí)存儲(chǔ)上發(fā)出日志警報(bào),幫助查找原因。
對(duì)生產(chǎn)日志進(jìn)行日常監(jiān)控,并提供實(shí)時(shí)預(yù)警,此外為了實(shí)現(xiàn)系統(tǒng)分權(quán)限、分角色管理,還應(yīng)用了PaaS下的多租戶框架,以此來(lái)實(shí)現(xiàn)不同用戶組對(duì)不同日志的操作和監(jiān)控。
日志查詢分析是對(duì)統(tǒng)一日志服務(wù)中的日志進(jìn)行錯(cuò)誤回溯,數(shù)據(jù)挖掘并提取有用的信息,可以用來(lái)監(jiān)測(cè)接口的性能以及給用戶畫(huà)像。
在本文介紹的統(tǒng)一日志管理總體上采用分層的思想建立二級(jí)儲(chǔ)存系統(tǒng),同時(shí)為了提高IO效率,會(huì)通過(guò)緩存來(lái)減少單位時(shí)間傳輸次數(shù)。通過(guò)Elasticsearch技術(shù)來(lái)實(shí)現(xiàn)日志的持久化儲(chǔ)存和全文檢索??梢杂脕?lái)處理PB級(jí)的數(shù)據(jù),查詢效率高。為了避免日志儲(chǔ)存并發(fā)大的問(wèn)題可以配置Elasticsearch集 群來(lái)實(shí)現(xiàn)。當(dāng)我們的服務(wù)相當(dāng)多時(shí),單節(jié)點(diǎn)儲(chǔ)存的效率是相當(dāng)?shù)偷?,因此我們添加了一個(gè)二級(jí)儲(chǔ)存策略,將不同的服務(wù)日志分開(kāi)持久化到二級(jí)日志服務(wù)中,再將二級(jí)服務(wù)中的日志投遞到服務(wù)日志中隨后交給Elasticsearch處理,圖1是整體設(shè)計(jì)架構(gòu)圖。
圖1 總體設(shè)計(jì)
圖2 日志通用模型
圖3 日志采集架構(gòu)
在進(jìn)行分布式日志系統(tǒng)中,沿用之前的通用的日志模型是不準(zhǔn)確的,因?yàn)槠胀ǖ娜罩灸P鸵话惆ǎ喝罩炯?jí)別、日志生成時(shí)間、日志所在類名、日志內(nèi)容。在分布式系統(tǒng)中,我們應(yīng)該在普通日志模型的基礎(chǔ)上加上服務(wù)器的IP以及日志的文件路徑。這樣在進(jìn)行查找錯(cuò)誤時(shí),可以快速定位到哪個(gè)項(xiàng)目的哪個(gè)類下發(fā)生錯(cuò)誤,便能快速的對(duì)項(xiàng)目進(jìn)行維護(hù),日志通用模型如圖2所示。
日志采集采用無(wú)侵入式的方式來(lái)采集日志,用戶按照原來(lái)的方式通過(guò)配置將日志輸出到該服務(wù)器特定的文件中,采集時(shí)通過(guò)在服務(wù)器上安裝日志監(jiān)聽(tīng)插件進(jìn)行監(jiān)聽(tīng)特定文件夾下的文件信息是否發(fā)生變化,把增加的部分?jǐn)?shù)據(jù)采集到該插件中,通過(guò)該插件的投遞功能將緩存的日志投遞到遠(yuǎn)程的日志服務(wù)中,這樣通過(guò)在每個(gè)服務(wù)器中加入日志監(jiān)聽(tīng)插件來(lái)實(shí)現(xiàn)日志的采集和統(tǒng)一儲(chǔ)存,架構(gòu)如圖3所示。
不同的日志儲(chǔ)存方案可以提高日志查詢的效率,因此我們可以采用Elasticsearch對(duì)日志進(jìn)行儲(chǔ)存,儲(chǔ)存之前將接受到的文件通過(guò)日志的模型字段進(jìn)行內(nèi)容映射,并通過(guò)Elasticsearch的分布式實(shí)時(shí)文件存儲(chǔ)技術(shù)將每一個(gè)字段都編入索引,使其可以被搜索。查詢分析時(shí)可以通過(guò)Elasticsearch進(jìn)行全文檢索查詢。因其每個(gè)字段都已加入索引,查詢效率比較高。然后對(duì)查詢到的數(shù)據(jù)進(jìn)行數(shù)據(jù)清洗、篩選、展示。架構(gòu)如圖4所示。
(1) 監(jiān)控模塊
監(jiān)控模塊用于顯示日志系統(tǒng)一段時(shí)間內(nèi)的性能狀態(tài),如:吞吐量,并發(fā)量,日志采集效率等,通過(guò)sql語(yǔ)句每隔一段時(shí)間進(jìn)行查詢一次這些狀態(tài)信息,將計(jì)算結(jié)果用柱狀圖或儀表盤(pán)的形式顯示在Web上,用于管理人員分析,起到監(jiān)控預(yù)防作用。
(2)告警模塊
當(dāng)使用sql進(jìn)行查詢監(jiān)測(cè)日志的性能超出了管理人員規(guī)定的所能接受的最大范圍時(shí),會(huì)通知管理人員進(jìn)行排查問(wèn)題,如圖5所示。
(3)多租戶模塊
對(duì)于查詢系統(tǒng)為了維護(hù)日志系統(tǒng)的安全,可以對(duì)不同的地區(qū)分配不同的組,將相關(guān)查詢?nèi)藛T分配到該人員對(duì)應(yīng)地區(qū)對(duì)應(yīng)的組上,通過(guò)給不同的組增加相應(yīng)的權(quán)限來(lái)約束管理人員。比如某些地區(qū)可以不用了解系統(tǒng)的性能,可以在相應(yīng)的組上將相應(yīng)的權(quán)限按鈕關(guān)閉。亦需要設(shè)立一個(gè)超級(jí)管理員組對(duì)系統(tǒng)的整體進(jìn)行調(diào)控,圖6為架構(gòu)分析圖。
圖4 日志查詢架構(gòu)
圖5 日志監(jiān)控告警模塊架構(gòu)
圖6 日志多租戶模塊架構(gòu)
圖7 日志分析架構(gòu)
日志分析是為了更好的能夠幫助企業(yè)掌控系統(tǒng)運(yùn)行狀況,以及分析用戶行為特征,以便更好地優(yōu)化系統(tǒng),提升用戶體驗(yàn)。
系統(tǒng)同時(shí)支持離線和實(shí)時(shí)分析。兩種方式都提供SQL的思想來(lái)提供查詢分析服務(wù)。在日志分析模塊應(yīng)用層通過(guò)報(bào)表和儀表盤(pán)的方式來(lái)實(shí)現(xiàn)安全診斷與分析。圖7為數(shù)據(jù)處理架構(gòu)圖。
進(jìn)行測(cè)試的應(yīng)用服務(wù)器均在linux服務(wù)器進(jìn)行壓力測(cè)試,目的是為了測(cè)試單節(jié)點(diǎn)儲(chǔ)存與增加二級(jí)儲(chǔ)存之間的性能差異,以及通過(guò)統(tǒng)一儲(chǔ)存后查詢的效率。
經(jīng)測(cè)試,可以得出以下結(jié)論二級(jí)儲(chǔ)存日志收集的采集效率明顯比單節(jié)點(diǎn)的收集效率高,而且在并發(fā)量達(dá)到2000時(shí)單節(jié)點(diǎn)儲(chǔ)存出現(xiàn)了數(shù)據(jù)丟失的問(wèn)題。
用戶在通過(guò)日志查詢查找問(wèn)題時(shí),直接通過(guò)查詢頁(yè)面進(jìn)行統(tǒng)一查詢即可,追蹤問(wèn)題效率更高。由此可見(jiàn)該種日志采集方案具有更高的性能和可用性。