分布式系統的執行環境往往是異常複雜的,很多情況涉及到多節點間的訊息通訊。相比較於單節點系統而言,分布式系統在問題追蹤,排查方面顯然也複雜很多。那麼這個時候,在分布式系統中,增加哪些型別的日誌資料,來幫助我們發現和定位問題呢?答案就是我們今天將要闡述的審計日誌(audit log)。
很多人可能在想這樣乙個問題:同樣是日誌,審計日誌和普通的日誌,區別在於**呢?
審計日誌,英文名為audit log,而audit這個單詞的中文意思為「查賬」,說明這些資訊是具有準確記錄的,並且會有規定的(賬單)格式。也就是說,審計日誌它會明確記錄過往的「操作流水」,並且每天記錄格式規則統一。這樣能夠方便地幫助我們分析這些日誌。在分布式系統中,這些「操作流水」其實就是系統中每一次的操作行為。
下面筆者擷取了hdfs的audit日誌做為例子,如下:
2018-11-09 16:08:37,209 info fsnamesystem.audit: allowed=true ugi=hdfs (auth:******) ip=xx.xx.xx.xx cmd=rename src=/tmp dst=/tmp2 perm=hdfs:hdfs:rw-r–r-- proto=rpc我們可以看到,每天記錄都準確地記下了每次操作行為的具體屬性資訊,因為日誌格式非常規則化,我們完全可以將它們做文字處理分析,然後匯入到sql表裡進一步進行查詢分析。比如可以做「哪個時間段,哪部分操作佔比最多」等等類似這樣的查詢。2018-11-09 16:08:37,209 info fsnamesystem.audit: allowed=true ugi=hdfs (auth:******) ip=/xx.xx.xx.xx cmd=open src=/data dst=null perm=null proto=rpc
審計日誌說到底它還是一種日誌,只是經過人為的加工包裝後再輸出。所以對於審計日誌工具類的開發來說,其實並不是特別難的。主要實現以下幾點:
第一點,訊息格式的定義。這個決定了訊息的最終輸出內容,這個在開始時是一定要設想好的,哪些屬性要必須輸出的,哪些是可選的。下面是乙個例子:
private static final string msg_pattern =然後是對於日誌訊息的構造,這裡強調的是靈活性,我們可以用構建者模式來做,示例**如下:「user=%s | ip=%s | op=%s %s | ret=%s」;
首先auditmessage訊息物件如下:
/**
* defines audit message structure.
*/public
class
auditmessage
implements
message
/**
* builder class for auditmessage.
*/public
static
class
builder
public builder setuser
(string usr)
public builder atip
(string ipaddr)
public builder foroperation
(string operation)
public builder withparams
(map
args)
public builder withresult
(string result)
public builder withexception
(throwable ex)
public auditmessage build()
}
然後在定義日誌輸出類,來輸出這個message物件例項:
/**
* class to define audit logger for ozone.
*/public
class
auditlogger
public
void
logwritesuccess
(auditmessage msg)
public
void
logwritefailure
(auditmessage msg)
下面我們對照上面寫的類,來看看它是如何被應用到系統中的,下面的例子也是大多數分布式系統常用的audit log的列印手法。
第一步,初始化得到audit日誌列印例項:
private
static
final auditlogger audit =
newauditlogger
(auditloggertype.omlogger)
;
在服務管理物件的關鍵操作行為處(rpc呼叫處),加上操作日誌是,
@override
public omkeylocationinfo allocateblock
(omkeyargs args,
long clientid)
throws ioexception
catch
(exception ex)
finally}}
...public auditmessage buildauditmessagefo***ilure
(auditaction op,
mapauditmap, throwable throwable)
我們看到,在上面的失敗和成功的地方都列印了audit日誌,但是如果我們不考慮失敗的情況,只需**塊的最後finally塊區域,新增日誌即可。這樣可以確保無論前面邏輯執行如何,能夠保證操作記錄不被丟失。
ok,以上就是今天闡述的乙個小的知識點,不是很複雜,但用處不小。
分布式系統中的分布式事務
分布式事務中可以借助mq訊息系統來進行事務控制,這一點與可靠訊息最終一致方案一樣。看來mq中介軟體確實在乙個分布式系統架構中,扮演者重要的角色。最大努力通知方案是比較簡單的分布式事務方案,它本質上就是通過定期校對,實現資料一致性。中介軟體如何保證訊息的一致性 問題的問法多種多樣,怎麼保證兩個伺服器的...
分布式應用日誌集中收集
最近一段時間,配合新的商業模式,e網打進產品進行系統重構,由於客戶量比較大,那麼對應的資料量比較大,涉及的系統架構很複雜,對應的伺服器也成倍的增加。伺服器日誌的收集和檢視也變的比較麻煩,於是就在想是否可以把各個應用日誌統一收集過來。現在的做法 每天凌晨30分左右啟動乙個任務,把日誌從各個伺服器統一收...
kafka ELK分布式日誌系統搭建
設定zookeeper 開啟自動啟動 用第一種!筆者在centos7虛擬機器經過大量研究實驗表明,第二種存在不生效的bug!但是第一種目前沒有不生效的情況。三.安裝kibana。最簡單。新手安裝kibana到啟動也就5分鐘。四,安裝logstash 本文使用的是kafka.conf檔案。input ...