騰訊藍鯨數據平臺之告警系統
以下是我參與藍鯨數據平臺的建設過程中的一些心得體會,關于整個藍鯨平臺的更多內容,請見
http://mp.weixin.qq.com/s%3F__ ... ecac0
很多人在搞ELK,很多人也在搞STORM。更多人在用傳統的Nagios,Zabbix等監控工具。Jason Dixon在2012就意識到這些工具的問題是每個人都想做到大而全,實際上我們更需要的是一對小二精的組件拼裝成一個個性化的解決方案。推薦大家去看一 下他的演講視頻: https://speakerdeck.com/obfusc ... in...

這是Jason Dixon所構想一個組件圖。他認為不同的開源方案應該專注于提供好這些組件。
Caskey Dickson 也有同樣的設想,并且提出目前的很多組件仍然是缺乏好的提供者的(比如海量metric存儲和任意維度聚合): https://www.usenix.org/confere ... oring

這是他在ppt里畫的一個組件圖,并且評價了一下主流的開源組件。

受到前輩們的影響,這個是我廠的一個告警平臺的數據流圖。下面按照順序解釋一下這個流程圖中的各種組件:
- 采集/收集:數據可能來自于業務的db,可能來自于日志文件,可能是由業務程序內置上報的。通過各種手段采集收集到“原數據庫”里。什么是 “原數據庫”?比如kafka隊列。比如logstash上報前把數據匯總到的redis數據庫。“原數據庫”的存在是為了把分散的數據匯總到一處,方便 后續的處理。
- 索引:索引主要是為了日志存在的。為了讓日志可以檢索,需要把日志數據進行切分,提取出字段和關鍵字錄入到“檢索庫”里。這就是著名的ELK最擅長的事情。Logstash負責索引操作,Elasticsearch充當檢索庫的角色。
- 統計:指標庫最常見的就是給每個ip存放一份cpu使用率的時間序列。對于這種情況,原數據采集了之后直接錄入指標庫就行了。另外一種比如是nginx的access
log,采集到之后需要經過統計才能得出某某url在5分鐘內被訪問了xx次的數據。統計最簡單的形式比如statsd,復雜的可以用storm寫自定義的流式計算任務,更復雜的甚至涉及機器學習,比如summo
logic。指標庫一般使用的是opentsdb等時間序列數據庫,但是我強烈推薦Elasticsearch: http://taowen.gitbooks.io/tsdb/content/ - 異常檢測:傳統的告警就是比對一個靜態的閾值。對于錯誤率,訪問延遲等指標用靜態閾值確實是沒有問題的。但是對于5分鐘內的收入,訪問人數等 綜合的業務指標很難用靜態閾值去做檢測異常。復雜的異常檢測會利用曲線的時間周期性,和相關曲線之間的相關性去定義動態的閾值。etsy的skyline 是開源組件里比較著名的一個。
- 告警:告警和異常檢測是兩個過程。不是每個異常都值得通知運維跟進處理(起碼可以做一個頻率收斂),也不是把原始異常以xx小于xx這樣的形 式告訴給運維就可以了(可以把告警相關的故障一起通知了)。這里個從異常到告警的過程需要做到確認這個異常是一個值得通知的告警,并且能夠做一個初步的故 障定位。最簡單的定位的手段是就把其他部門的告警(比如網絡部門的網絡質量告警,安全部門的DDoS告警),以及流程單據(發布單)做為事件納入事件庫。 通過查詢事件庫定位原因。
在這樣的一個提下下,很多零散的工具做的事情被整合在了一起:
- 撥測:定時curl一下某個url,有問題就告警。這個是走 原數據=>直接錄入為異常=>告警
- 日志集中檢索:ELK的經典用法。走 原數據=>檢索庫
- 日志告警:5分鐘Error大于xxx次告警。走 原數據=>實時統計出指標=>檢測異常=>告警
- 指標告警:cpu使用率大于xxx告警。走 原數據=>錄入到指標庫=>檢測異常=>告警
把不同的告警和監控策略整合到同一個數據管線的好處是簡化了整體的架構,剔除了重復的模塊(比如上報和原數據匯總等模塊)。而且有利于各司其職,專業化縱深發展。目前開源組件還比較缺乏的有這么幾塊:
- 指標庫需要海量存儲海量聚合能力,開源的有 Druid.io Elasticsearch Crate.io 等
- 異常檢測,缺乏真正實用的。算法其實不用很復雜
- 故障定位和收斂,缺乏真正實用的。Flapjack的實現太簡單了,Riemann又太小眾了
- 實時統計,缺乏成熟的解決方案。Storm就是一個底層的執行引擎,而Spark還缺少時間窗口等抽象。
- 日志自動分類,還沒有開源工具可以做到 summo logic 那樣的效果
- 自定義曲線和儀表盤:類似kibana的工具還是太少
我廠的監控告警平臺當然是把這些都實現了。很多創業公司(比如剛冒出來的jut.io)也整合出了不錯的完全解決方案。但是更多的小廠還是在用 Nagios和Zabbix等傳統的工具,再加上個ELK看日志。開源社區在方面還是大有可為的。說實話,這個東西賣錢不好賣。更多的公司還是會選擇拿開 源工具自己搭一個湊合用的。