標籤:

伺服器實時監控怎麼設計?


只收集系統日誌的話,zabbix,nagios都行,本文完結。

但是既然你提到設計了,那請繼續往下看。


中小型的監控系統無非如下三樣東西:

1.資料庫

2.展示界面

3.監控agent

那麼很簡單了:

1.資料庫

資料庫用opentsdb,或者influxdb,一般選用時序資料庫,按照時間戳(timestamp)對一個維度(measurement)進行監控,並且每個機器有自己的標籤(tag),標籤可以有多個,監控數值(value),後續可以針對維度(measurement)進行分類,針對標籤(tag)進行聚合。

時序資料庫唯一的缺點是,只能存數值。但是監控,只需要知道數值。

2.展示界面

chronograf(不建議用,雖然我用)

grafana(都在用)

對,界面和資料庫一樣,同樣不建議自研。

3.監控agent,嫌麻煩就用telegraf或者collectd

agent原理說起來很簡單,一個死循環,X秒執行一次操作。

舉系統日誌監控項CPU的例子:

取出cpu當前用量(例如44%),打上維度標籤(measurement=cpu),打上tag標籤(hostname=a, group=aGroup, ip=10.1.1.1),打上時間戳 timestamp,記錄數值(value=0.44)

取前內存用量……

取磁碟用量……

都取出來之後,扔進資料庫。

作為用戶,配置一下grafana即可

參考文章:

利用Metrics+influxdb+grafana構建監控平台

使用 Grafana+collectd+InfluxDB 打造現代監控系統

本文結束。


關於更進一步和報警系統

如果你司只收集系統日誌的話,下面的就不需要讀了。

當然如果你司要收集業務監控的話,那麼相信到這一步你司一定有個小小的監控系統項目了。

下面說一點我這裡曾經遇到的事情/需求。

4.實時性:

如果不願意把資料庫直接暴露給agent,可以做一層proxy,由proxy進行數據驗證和身份驗證然後存入資料庫。

對,proxy這裡可以做很多事情,例如cpu&>80%就報警。

5.持久化

說白了,存儲問題。監控數據量非常大,一般三個月的數據量就很讓人頭大。

後續要存多久的日誌,怎麼存,都是個問題。

有時候時序資料庫無法滿足問題,可以考慮換成分散式存儲了。

是否需要緩存,最近多久的的日誌放到緩存里,用什麼更新策略。

6.報警

雖然上面提到了,這裡還是得專門拉出來。

報警不一定必須要在proxy層做掉,因為處理速度可能跟不上。

例如有些要求連續三分鐘怎麼樣就持續報警。

有些要求報警簡訊先快後慢,避免撐爆手機。

有時候你想知道某些報警是否已解除,便需要一個控制台來查詢。

7.介面

有些應用我想臨時不報警,有寫我想拿出監控數據進行計算,有些我想自己傳給你數據,用你的界面和資料庫……

8.自定義監控

說起來也不難,支持agent運行自定義腳本進行監控,支持各種傳入參數監控,支持這個支持那個,總歸一個自定義二字。

9.暫時想不起來了。

你先搞定前三點吧。

1,2有現成的,配置一下就能用,

3一般自研,做起來很簡單,現成的也能用,

我也給出了參考文檔,代碼都不用寫就能跑起來。

並且,telegraf+influxdb+grafana一下午就能搞出來一套監控系統。

4,5,6,7,8酌情。

10.其他可能遇到的問題

例如資料庫達到上萬台之後,opentsdb也撐不住,這個時候你可能需要考慮其他資料庫。

恩,我這裡用kafka,也在調研scylladb。

對了,以上內容看起來很簡單,做起來很難。

另:influxdata有一系列的監控解決方案,可以參考他們的架構設計。

本文完結。


prometheus最近的勢頭很猛,也可以關注下。

不過原理上prometheus依靠的不是agent上報,而是服務端(通過http協議)到被監控機器抓取監控信息,例如監控mysql需要一個mysqld_exporter的agent來提供導出,同樣需要agent來提供http介面。這種做法和傳統的agent上報模式各有優劣,請自行選擇方案。


這裡有我用python做的基於web的分散式伺服器運維監控工具,純python,使用bottle框架,只要有python2.7以上版本的python2即可。

https://github.com/toddlerya/NebulaSolarDash


推薦閱讀:

在 2016 年做 DevOps 是一種什麼樣的體驗?
怎麼把SQL server放到docker里運行?
說服上司落地實踐DevOps,這裡有幾組數據
推薦兩篇關於Docker的文章

TAG:DevOps |