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

cebp 10年前發布 | 89K 次閱讀 Nginx Web服務器

背景

在我們的系統架構中,Nginx作為所有HTTP請求的入口,是非常重要的一層。每天產生大量的Nginx Access Log,閑置在硬盤上實在是太浪費資源了。所以,能不能把Nginx日志利用起來,實時監控每個業務的訪問趨勢、用戶行為、請求質量和后端異常呢,這就是本文要探討的主題。

目的

  1. 錯誤碼告警(499、500、502和504);
  2. upstream_response_time超時告警;
  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 的性能和資源占用還是很不錯的。

可以使用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%9E%E6%97%B6%E7%9B%91%E6%8E%A7%E...

 本文由用戶 cebp 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!