基於Lua+Kafka+Heka的Nginx Log實時監控系統

背景

在咱們的系統架構中,Nginx做爲全部HTTP請求的入口,是很是重要的一層。天天產生大量的Nginx Access Log,閒置在硬盤上實在是太浪費資源了。因此,能不能把Nginx日誌利用起來,實時監控每一個業務的訪問趨勢、用戶行爲、請求質量和後端異常呢,這就是本文要探討的主題。前端

目的

  1. 錯誤碼告警(49九、500、502和504);git

  2. upstream_response_time超時告警;github

  3. request_time超時告警;後端

  4. 數據分析;架構

關於錯誤和超時監控有一點要考慮的是收到告警時,要可以快速知道是哪一個後端服務節點出現了問題。
在這以前,咱們都是經過隨機進入一個Nginx節點tail log才能定位到,效率有些低。運維

架構

廢話很少說,先上架構圖。總體架構沒太複雜的地方,隨便畫了一張,莫笑話我~性能

架構圖

日誌採集

這部分結合lua-resty-kafka使用Lua擴展將數據按照必定格式拼接後寫入Kafka集羣。Nginx+Lua的性能就不用多說了,這樣一來徹底能夠關掉Nginx自己的日誌開關,減小磁盤消耗;大數據

消息隊列

咱們數據分析組的同事在這以前就已經創建Kafka集羣,無需再搞一套消息隊列服務。另一個很重要的點是,咱們不但願日誌數據取完就刪掉了,運維組除了要作監控告警以外,數據組也要讀取數據作分析。所以,如Redis此類的消息隊列就直接被咱們pass掉了;優化

異常監控計算

這部分使用Heka來作,Heka使用Go語言編寫,內置豐富的插件能夠知足大部分的需求。若不知足需求,可使用Go或者Lua自行開發擴展。以前使用過Logstash作業務日誌收集,但它有時的CPU佔用實在太嚇人,不敢再在業務機上使用,而且感受擴展不方便。就咱們目前的應用來看,Heka的性能和資源佔用仍是很不錯的。lua

可使用Filter作計算,有錯誤時向Heka消息流中寫入告警消息,SMTPOuter匹配到告警消息後經過自定義的Encoder定製好郵件內容後再發送。

可視化

Heka層一方面作異常監控,另外一方面使用Message Matcher Syntax匹配異常數據寫入到Elasticsearch, 再架設一個Kibana。咱們在收到告警郵件後,就能夠進入Kibana後臺查看異常的Log。

不足

  1. 郵件告警機制須要優化, 咱們目前的設置是每分鐘檢查一次,發現錯誤就會一直告警。以後能夠優化爲發現異常時告警一次,異常結束時再發一次彙總郵件;

  2. Heka服務管理和進程監控須要優化,支持自動重啓,否則進程掛了都不知道;

  3. Heka配置接入配置中心並支持自動重啓(目前的配置主要是各業務的告警閥值,須要進入機器修改);

總結

整個開發過程仍是比較順利的,惟一比較耗時的是熟悉Heka的整個消息處理的流程和機制,以及如何開發擴展。另外一個比較坑的是Heka的錯誤提示不全和調試不方便,有時徹底靠猜,不過好在它自己並無多複雜,有些問題看一看源代碼就明白了。

關於消息隊列的選擇,前面已經提到咱們已有Kafka集羣就直接拿來用了。若是僅僅作異常監控,不須要消息留存, 倒能夠考慮使用Redis之類輕量些的消息隊列, Kafka未免有些重了。

原文地址: http://mlongbo.com/2015/NginxLog%E5%AE%9...


掃描二維碼,關注我。
內容大多會是後端技術、前端工程、DevOps,偶爾會有一些大數據相關,會推薦一些好玩的東西。但願你會喜歡~

掃描二維碼關注我

相關文章
相關標籤/搜索