大企業(yè)日志運維
大企業(yè)日志系統(tǒng)的特點和關注點在于:成本、運營與運維數(shù)據(jù)復雜性、歷史遺留問題較多、各部門相互依賴、應對業(yè)務突增情況的能力以及丟失率監(jiān)控&SLA(針對日志傳輸丟失情況的長久數(shù)據(jù),都要保存到SLA里面,在SLA里面做一些你系統(tǒng)的一些評價,就是你這個系統(tǒng)到底靠不靠譜,其實是要用SLA來衡量的。)。
談到大規(guī)模的日志傳輸,我們首先要考慮這個架構到底要怎么設計,到底是使用同步架構還是使用異步架構。什么叫同步架構?就是ETL、格式整理和轉發(fā)放在一起。這會存在一個什么問題?如果整個業(yè)務比較平穩(wěn)的話還好。但是如果業(yè)務突然間出現(xiàn)爆增等突發(fā)情況的時候,上面的架構就會出現(xiàn)問題。你需要解析的,可能就放在那個地方,后面的數(shù)據(jù)又轉發(fā)不出去,前的服務發(fā)生了什么你可能根本不知道。此時,就需要把傳輸和解析進行分隔。
因此,我建議在設計日志傳輸架構的時候盡量設計成異步架構。

如何控制成本和優(yōu)化業(yè)務呢?日志量越大成本就會越大,日志量大不是可以用來自豪的事情??梢杂脕碜院赖氖?,你的成本做了多少意義的事情。在大企業(yè)的日志傳輸中其實存在很多垃圾數(shù)據(jù),沒有收集的意義。所以我們首先要做的就是對日志進行分類。然后就是對格式進行協(xié)定,對日志進行合并以及分級傳輸,實現(xiàn)運維侵入開發(fā)。
以Rsyslog為例,首先所有日志要有志tag,以其進行區(qū)分。然后需要高保的tag調(diào)用高保RuleSet,其他的日志tag以syslogfacility-text進行區(qū)分,通過syslogfacility-text來寫入普通的通道。最后使用rsyslog的action中的屬性:action.execOnlyEveryNthTime實現(xiàn)按比例丟棄。
接下來,我重點介紹一下日志降級。日志降級是用來干什么的?在企業(yè)的業(yè)務量遇到突發(fā)情況的時候,需要對服務進行降級。為什么要降級?因為正常情況下,日志量處于一個比較平穩(wěn)的狀態(tài),一點點的傳。類似于某某明星離婚的時候,這個日志量就會爆增。為什么會爆增呢?首先日志是有一個特點的,在正常情況下可能就記錄一下infor或者這些日志,但是如果出現(xiàn)錯誤的時候,這個錯誤量就會跟著這個業(yè)務量一樣樣的往上漲。這時就要考慮日志降級的問題,如果不降級的話,很有可能把下行帶寬全部打滿,遭遇計算量、帶寬以及磁盤三個瓶頸。
以手機微博為例,我們來看看日志降級的邏輯。首先,就是要動態(tài)調(diào)整各個日志tag的級別。然后,它定義了兩種級別:是否轉發(fā)與是否落磁盤。

這是一個邏輯的圖,這里面我們用了一個PHP的動態(tài)加載庫,它可以把你相應的降級規(guī)則,就是對某一個日志,在需要降級的時候把它降到哪個通道里,把它降到哪個級別里的定義。然后我們會和監(jiān)控進行連接,當監(jiān)控發(fā)現(xiàn)某些業(yè)務突然出現(xiàn)突增的時候。這里面當然是基于規(guī)則,如果說這個規(guī)則滿足的時候,就開始進行降級。
在大企業(yè)日志運維的情況下,我們需要注意,企業(yè)的日志傳輸是需要監(jiān)控的,對于架構的每個環(huán)節(jié)都需要進行測試,主要是壓測。此外,最好通過隊列解藕各個部門的依賴,并實現(xiàn)運維侵入開發(fā),及時發(fā)現(xiàn)問題反饋給開發(fā),發(fā)現(xiàn)開發(fā)中的不合乎規(guī)范的問題,并提供解決方案。
微博日志系統(tǒng)架構及相關調(diào)優(yōu)

調(diào)優(yōu)從來就沒有一個標準的答案,所有調(diào)優(yōu)一定要從內(nèi)部了解系統(tǒng)開始,調(diào)優(yōu)一定要基于測試與監(jiān)控。下面,我們以Elasticsearch和Rsyslog的調(diào)優(yōu)為例來具體了解一下:
◆Elasticsearch的調(diào)優(yōu)

我們經(jīng)常強調(diào)Elasticsearch的調(diào)優(yōu)到底在調(diào)什么,我們首先要看一下一條數(shù)據(jù)寫進來的時候是經(jīng)過怎樣的過程。首先是把數(shù)據(jù)寫到index-buffer當中,在這個階段你的數(shù)據(jù)還是搜索不到的。然后會有異步的程序把這個數(shù)據(jù)從index-buffer當中refresh出來,這個就是refresh階段。一講到Elasticsearch調(diào)優(yōu)的時候,肯定大家就要講到有一個調(diào)優(yōu)項叫做index-buffer refresh,這個refresh的間隔時間。然后就到了這個flosystem cache這一層,到了這一層的時候你的數(shù)據(jù)是可以被搜到了,因為它可能就進行切分。最后一步是磁盤操作flush,把數(shù)據(jù)從flosystem-cache刷到磁盤當中。進入disk層有個merge階段,也就是說其實在ES當中是有一個異步的進程,Merge這個數(shù)據(jù),就是把system進行合并,這個操作因為它是IO操作,它對性能的損耗是比較大的。再就是translog,它實際是一個數(shù)據(jù)庫記錄操作日志,把所有的對ES的操作首先先記到translog當中,如果在系統(tǒng)寫入發(fā)生異常的時候,從translog把操作進行恢復。在flush寫入之后,刪除translog。