終於在過年前把DNS的流量圖做好。 有興趣的請參考[1]
有人說:「畫個流量圖嘛,不就是MRTG嘛, SNMP GET一下就有了~~」
才怪咧,MRTG根本就不是重點,
重點是你得要資料,同時SNMP不會有什麼可以讓你拿來話DNS的資料。
不然你拿什麼畫圖??
當然,BIND提供分析數據的文字檔,但是那個檔你看過後,你就知道,要轉成有效的數據,需要下功夫。
於是我花了整整兩週來分析這個檔案。
由於該資料相當的龐大,不整理很快就塞爆你的伺服器,5分鐘記一次,一天288次的話,一天就能高達100MB,這樣算一算,一年53週的話資料量就能高達53G,這表示我的伺服器很快就會爆了。
有人說:「不可能這麼多,我的一天才1MB不到。」只能說這是夏蟬不語冰的層級,因為我把所有的網域都記錄,更別說我有超過1000個網域,而且超過3台以上的伺服器。
於是我開始著手寫出能分析資料的程式,我的程式雖然很精簡,但是我把所有的欄位全部記下來,在思考程式寫法時,我不斷的和自己打架:
Q 我要收集所有的資料,還是選我要的收集?
Q 我要收到資料庫中,還是留文字檔就好?
Q 我要每台伺服器各自處理,還是集中處理?
Q 處理的資料量太大,我要多久處理一次?
....
經過了不斷的TRY and ERROR,我終於把資料全部歸檔,這中間克服了不少技術上的難題,
但是,我目前擁有的還只是RAW DATA,整理過的RAW DATA。
不要小看RAW DATA,短短的一個月不到,我就擁有超過2000萬筆的資料,有夠驚人。
一個系統如果不能有效率的控制資料成長的速度,沒多久這個系統就不能運作。
我野心很大,預想是我不在崗位上十年,這個系統還是可以動。
░░░░░░░░░░░░░░░░░░░░░資料收集的部分完成的分隔線░░░░░░░░░░░░░░░░░░░░░░░
完成收集資料以後,我隔了一週才繼續分析我的數據。
分析數據也很吃腦力,除了要解決問題,還得要有效率。畢竟,一次要開的檔案是超過10000個,沒效率的開讀檔會讓伺服器太忙甚至跑不完。
接下來就是繪圖的部分,做到這裡其實有點懶了,
就覺得差不多要完成,但是還沒看到終點線。
為了畫圖,我本來想的是用JS來取數據直接畫,
但是這樣的做法就得到底層和上層整合,換句話說,就是要讓網頁的PHP也要存取原始的RAW DATA,
這可不成,為了這個目的再開權限是不好的做法。
最後我決定還是在底層畫圖就好,RRDTool是我最後的選擇。
使用RRDTool的話,你得再把資料餵給RRD資料庫,這又是一個漫長的過程,2000萬筆的資料,我餵了整整一天多。
之中還因為資料錯誤,重做了二三次。
還是完成了。
這次寫程式我為了容錯下了不少工夫,舉個簡單的例子,如果不像中市只有4台機器,而是有20台或更多,
我的程式要做到自動偵測、自動歸檔、自動繪圖。還有容錯顯示等等功能。
換句話說,不要太多的人為設定。
話說為什麼要畫圖?
其實很多服務在底層跑,你都不知道他到底在忙什麼,畫圖是一個了解最好的方法,
因為我看了RAW DATA好像看到了什麼,但什麼都不知道,
圖一畫就明瞭了。
於是又花了幾天研究怎麼畫圖,RRDtool還真的滿複雜的,我喜歡。
經由畫圖才知道很多原本不知道的地方,像是下面其中一台DNS伺服器進入的query:
由圖中就發現奇怪的地方:
1. 一天中有二段資料的遺失?長達10分鐘
2. 竟然有大量的PTR查詢,這個不是應該很少人用嗎?
3. 每天有三次大量的PTR查詢,似乎透露什麼程式在幹嘛的訊息?
4. CNAME記錄查詢幾乎沒有,還是以A和AAAA記錄為準
5. 每個小時似乎規律的有峰值?
我原本都以為我分析有問題,於是我調出原始資料一筆筆記算,後來發現程式沒有錯
我找不到會遺失的原因,經過了三天,我想到了。
原因就是一次要畫的圖太多,要開的檔案太多,我的單線程程式前面跑不完,然後後面程式又再執行,資料就被刪掉了。
想到這個非常可能的原因後我又得改寫程式解決這個困難,當然現在不再會有這種資料遺失的情況。
---
現在流行的大數據可視化
你如果不做可視化,就無法發現問題,更別說要解決問題。
另外這張經由可視化後,發現IPv6的協定使用率比想像中的還要高
這都是可視化後迷人之處。
結論
要畫的圖還很多,目前只畫了一小部分,還得待之後慢慢完成。