獨(dú)特低運(yùn)營(yíng)成本海量日志處理系統(tǒng)架構(gòu)
原創(chuàng)本文是WOT2016互聯(lián)網(wǎng)運(yùn)維與開(kāi)發(fā)者大會(huì)的現(xiàn)場(chǎng)干貨, 新一屆主題為WOT2016企業(yè)安全技術(shù)峰會(huì)將在2016年6月24日-25日于北京珠三角JW萬(wàn)豪酒店隆重召開(kāi)!
黃慧攀表示,又拍云主要做CDN,因此網(wǎng)內(nèi)會(huì)有大量日志產(chǎn)出,量級(jí)超乎想象。通常在處理類似這樣量級(jí)的大數(shù)據(jù)時(shí)會(huì)用到Hadoop、Spark等流行的解決方案,但又拍云卻沒(méi)有選擇這些流行的算法。下面我們就走近又拍云來(lái)體會(huì)這套執(zhí)行成本高,但運(yùn)營(yíng)成本較低的獨(dú)特海量日志處理系統(tǒng)架構(gòu)。
又拍云業(yè)務(wù)架構(gòu)概述
業(yè)務(wù)架構(gòu)
黃慧攀表示,又拍云業(yè)務(wù)架構(gòu)非常簡(jiǎn)單原始,把NGS日志全部打出來(lái),CDN邊緣有100多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)里面有幾十臺(tái)服務(wù)器,乘起來(lái)就是幾千臺(tái)服務(wù)器的日志。每隔每五分鐘把邊緣每一臺(tái)服務(wù)器的日志給收集到原始日志服務(wù)器,然后再?gòu)脑既罩痉?wù)器里面供給Work,Work里可多可少,大部分是橫向擴(kuò)展。然后分析日志,最終產(chǎn)生統(tǒng)計(jì)數(shù)據(jù),切割出來(lái)一些為客戶提供下載日志。在NGS上一個(gè)CDN節(jié)點(diǎn)是給所有的用戶提供訪問(wèn)的,不管是大客戶還是小客戶,很有可能你們都在用同一臺(tái)NGS,也就是說(shuō)它的日志里面會(huì)混雜著很多個(gè)域名。那么日志處理系統(tǒng)就會(huì)面臨如何把這些日志按照域名給切分開(kāi)來(lái)?在切分開(kāi)來(lái)數(shù)據(jù)的基礎(chǔ)上,如何做必要的數(shù)據(jù)統(tǒng)計(jì)及分析?
原始日志的收集和存儲(chǔ)
黃慧攀表示,又拍云原始數(shù)據(jù)的收集經(jīng)歷了三個(gè)階段,分別是在2011~2014年、2015年、2016年。
2011~2014年V1
2011~2014年第一階段。在中心搭一臺(tái)FTPserver,其他邊緣服務(wù)器直接把日志FTP上傳,之后存起來(lái)的一個(gè)簡(jiǎn)單架構(gòu)。黃慧攀表示,當(dāng)量級(jí)小時(shí),這個(gè)架構(gòu)很好用,簡(jiǎn)單又成熟。但如果一旦數(shù)據(jù)量變大,就會(huì)出現(xiàn)瓶頸。又拍云在2014年做云存儲(chǔ),CDN賣的不多,訪問(wèn)量不太大,數(shù)據(jù)量也少,所以這個(gè)架構(gòu)可以應(yīng)對(duì)。
2015年V1顯露不足
隨著這個(gè)業(yè)務(wù)擴(kuò)展,又拍云在市場(chǎng)做了很多的工作,接入很多的大客戶,導(dǎo)致日志量翻超過(guò)10倍之多。那么之前2011年設(shè)計(jì)的系統(tǒng)只考慮到考慮到10倍的處理能力,所以 FTPserver弊端瓶頸就都顯露出來(lái)。如在FTPserver沒(méi)有辦法接收這么多的客戶端上傳,邊緣節(jié)點(diǎn)太多,連接到FTPserver上,F(xiàn)TP的進(jìn)程幾千個(gè),服務(wù)器很快會(huì)被卡死,導(dǎo)致數(shù)據(jù)不能上傳。如上圖,下面Raid 0非常不安全,1塊磁盤損壞,全部數(shù)據(jù)丟失。雖然邊緣日志緩存7天,邊緣重新再上報(bào),及時(shí)修復(fù)沒(méi)有影響業(yè)務(wù)。但會(huì)導(dǎo)致人有點(diǎn)手忙腳亂也不是很好。
2016年V2
2016年初第二個(gè)階段,對(duì)原有系統(tǒng)進(jìn)行改造。把FTPserver,換成了Nginx Server,Nginx Server文件上傳基于DAV Module并做二次開(kāi)發(fā)就可以接受文件的請(qǐng)求。 因原生模塊只支持配置一個(gè)路徑,也就是日志只能固定寫入一塊磁盤。可服務(wù)器不可能用一塊盤能存得下,每天有幾百G、幾個(gè)T的數(shù)據(jù)需要存儲(chǔ),磁盤定會(huì)爆掉,當(dāng)時(shí)并沒(méi)有這么大的磁盤。所以對(duì)DAV Module做二次開(kāi)發(fā),如根據(jù)日期,存儲(chǔ)機(jī)器一塊盤是6T能存下一天的日志,第一天用1號(hào)盤,第二天用2號(hào)盤的模式。
2016年V2.1
第二個(gè)版本上線之后,發(fā)現(xiàn)了磁盤的寫入成了瓶頸,磁盤不夠快,因?yàn)樗荢ATA磁盤,寫不進(jìn)去這么多數(shù)據(jù)。這時(shí)第三個(gè)版(2.1版本),目前正在實(shí)用的版本誕生。對(duì)DAV Module進(jìn)行更改,從原來(lái)的根據(jù)日期改成用文件名。另外在這個(gè)基礎(chǔ)上做增強(qiáng),原始日志在上傳上來(lái)的過(guò)程中,同時(shí)拷貝到旁邊一塊盤一份,這樣就可以避免單盤故障而導(dǎo)致服務(wù)不可用,也不會(huì)有數(shù)據(jù)丟失的問(wèn)題,盡量的保障業(yè)務(wù)可以24小時(shí)在運(yùn)行,不需要停下來(lái)。這個(gè)方案比較完美的解決原始數(shù)據(jù)的收集問(wèn)題。
對(duì)大量數(shù)據(jù)進(jìn)行切割-排序-合并
切割-排序-合并
切割。用C寫的一個(gè)日志切割程序,把每5分鐘每臺(tái)服務(wù)器的日志按域名切割成多個(gè)小文件,臨時(shí)的存在SSD磁盤上面去。切割完成之后,還會(huì)有線程檢查前一個(gè)小時(shí)是不是切割已經(jīng)完成。
排序。如想要讓排序變得簡(jiǎn)單,就要在前期做日志收集規(guī)劃時(shí)做好基礎(chǔ)。如每五分鐘會(huì)有一個(gè)文件要上傳上來(lái),可把文件名做加工(把時(shí)日期時(shí)間點(diǎn)、哪五分鐘的數(shù)據(jù))。如一個(gè)小時(shí)有一千個(gè)小文件,在這一千個(gè)里面,一定有其中一百個(gè)是某一個(gè)五分鐘的,就直接拿這一百個(gè)做排序。做排序時(shí)不用把這些數(shù)據(jù)減壓出來(lái),放到其他地方臨時(shí)存儲(chǔ)來(lái)做排序。是把這一百個(gè)文件打開(kāi),到每個(gè)文件在里面讀,讀第一秒,再問(wèn)另外幾個(gè)文件有沒(méi)有,沒(méi)有就跳下一秒,這樣一個(gè)一個(gè)順序下來(lái),就按照時(shí)間序來(lái)讀日志,合并到一個(gè)具體文件輸出,這樣的模式是最高效的。因?yàn)樵谔幚磉^(guò)程中,就不用把一個(gè)具體的文件減壓成文本。如把要減壓,拿什么機(jī)器能夠把原始日志給存下來(lái)是個(gè)問(wèn)題,因?yàn)樘罅恕?/p>
合并。待切割排序完成,就把每小時(shí)把12*N個(gè)小文件按順序合并成一個(gè)1小時(shí)的日志文件供客戶下載。
對(duì)大量數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析
凌晨零點(diǎn)最后一個(gè)文件合并出來(lái)會(huì)啟動(dòng)統(tǒng)計(jì)分析的業(yè)務(wù)流程,就可以綜合的拿到一些比較有用的指標(biāo),如熱門IP分布、URL分布、客戶端、來(lái)源、狀態(tài)碼計(jì)數(shù)等數(shù)據(jù)。
系統(tǒng)架構(gòu)演變過(guò)程中踩過(guò)的坑
黃慧攀表示,在系統(tǒng)架構(gòu)演變過(guò)程中遇到了一些坑,把這些分享出來(lái),希望大家不要踩。
第一:SSD inode 數(shù)不足,每5分鐘切割出來(lái)的小文件非常多,要以最小block大小格式化磁盤。
第二:跨網(wǎng)絡(luò)上傳很慢,需要多線路支持;小運(yùn)營(yíng)商會(huì)改寫內(nèi)容,走HTTPS。
第三:日志存儲(chǔ)磁盤SATA容易壞,要分別寫入2個(gè)磁盤(SSD 也會(huì)壞)。
第四:服務(wù)器也不穩(wěn)定,要雙集群模式處理,保障業(yè)務(wù)不中斷。
存儲(chǔ)服務(wù)器和處理服務(wù)器的監(jiān)控圖
演講最后,黃慧攀為大家展示了存儲(chǔ)服務(wù)器和處理服務(wù)器的監(jiān)控圖。他表示,當(dāng)下這個(gè)海量日志處理系統(tǒng)架構(gòu)基本是非常穩(wěn)定,集群狀態(tài)很正常健康,冗余度也比較高。
演講視頻:http://edu.51cto.com/lesson/id-100758.html
【講師簡(jiǎn)介】
黃慧攀,又拍云CTO。他是 aLiLua Web 開(kāi)發(fā)框架的作者,有 14 年互聯(lián)網(wǎng)從業(yè)經(jīng)驗(yàn),技術(shù)經(jīng)驗(yàn)涵蓋范圍比較廣,早期以前端 Web 開(kāi)發(fā)為主,后期逐步轉(zhuǎn)到底層研發(fā)方向。QCon 、ArchSummit、中華架構(gòu)師大會(huì)講師,在高性能網(wǎng)絡(luò)服務(wù)、分布式存儲(chǔ)系統(tǒng)等方面有較深入的研究。