2008年5月8日

RRDTool初步認識與入門

人就是會手賤,手賤完之後就開始後悔,偏偏這世界沒有後悔藥,沒做前很期待,總覺得會更好,做了之後很後悔,後悔早知道就不做了。

RRDTool就是這樣,也因此出現了這篇~RRDTool初步認識,其實我一整個無言~

會玩NAT的,多半都會想玩玩mrtg,幾乎所有講到NAT建置的書,都會介紹SNMP和MRTG,MRTG幾乎已經是流量分析中的王者。
可是在玩過MRTG之後,經常會覺得MRTG不夠好用,總覺得哪裡怪怪的,例如:
1. 一張圖中,沒辦法多個機器的流量相疊比較
2. 一張圖中,統計資料永遠只有2筆,永遠只有線條+長條的圖
3. 那個流量的間隔時間,基本上單位都很固定,要長、要短都很不方便

而許許多多免費、商業的流量分析軟體,圖片一個比一個好看,當然就會讓人有種嚮往,接著~經過google大師的指點,很容易就會跳入RRDTool的陷阱中。

我在這邊強烈的建議,想跳但還沒跳的人,務必三思,RRDTool沒這麼好玩~
和MRTG相比,便利性是完全不用說了,覺得MRTG已經很難搞的,RRDTool不要碰。
和MRTG相比,功能性並沒有比較強,仔細看所有對RRDTool的介紹都提到,RRDTool是一套強大的「圖表繪圖軟體」,但很少會說它是一套強大的資料收集軟體。

如果執意要跳的,我們繼續看下去... :p
關於RRDTool的中文教學,毋庸置疑的,「rrdtool 教學」的確是經典。
但經典不代表解說完整,作者自己也說了,「rrdcgi 或 rrd 的 perl module 皆不在我們的介紹範圍」,但我認為,RRDTool的module才是關鍵。
其實上述的教學,很值得參考的是「語法解說和介紹」,就語法的解說來說,這篇真的是經典,事實上,整篇教學也是著重在語法的部份。

好拉~其他廢話不多說了,我們開始「初步認識」RRDTool吧!
這邊要備註一下,我這邊不會提到任何語法,因為我還沒看到那邊,而且語法部份上面的教學才是經典,我主要會針對RRDTool入門時的疑問進行解釋。

首先,我們先從MRTG開始說起,畢竟這是大部分人都聽過的,也是會接觸RRDTool的人多半都有經驗的,所以我假設大家對MRTG都有基本認識,如果問MRTG是什麼的,請先去翻翻書。
MRTG在流量分析來說,算是整合的很好的工具程式。
MRTG其實包含了2個部份:
1. 流量收集
2. 圖表繪製

我們都知道要使用MRTG前,要先安裝SNMP,事實上MRTG所有的流量資訊都是從SNMP取得的,也就是說,SNMP就是一個提供流量資訊的伺服器,你用程式連它,它就會給你「現在的流量」。
所以MRTG的第一部份功能,就是定期的詢問SNMP Server(通常是用crontab),取得流量。
這部份MRTG比RRDTool方便非常多,方便的地方在於,MRTG提供了「cfgmaker」這樣的程式,透過它就能幫我們詢問SNMP,並轉換成MRTG的設定,「我們完全不需要知道SNMP查詢出來的資料格式」。
同樣的,在每次MRTG執行時,我們一樣不需要知道SNMP的資料格式,MRTG就會幫我們轉譯成它要的資料,接著自動存成特定的紀錄檔(例如:127.0.0.1_2.log)。

MRTG的另一部分功能就是「圖表繪製」,前面產生出來的log檔,MRTG會自動把相對應的圖表畫出來。
因此MRTG的動作流程是:
執行 mrtg /etc/mrtg.cfg 後

詢問SNMP目前流量 -> 畫出圖表

比較詳細的流程是:

判斷 mrtg.cfg -> 根據 mrtg.cfg 詢問SNMP目前流量 -> 儲存成 xxx.log 紀錄檔 -> 畫出圖表 -> 儲存成PNG 圖檔

而 RRDTool 和 MRTG 也有些類似,但又不完全一樣。
RRDTool 同樣有 2 個部份的功能:
1. 資料紀錄(但不包含 SNMP 的溝通)
2. 圖表繪製

RRDTool 的紀錄檔格式和 MRTG 完全不同,它使用的紀錄檔格式是 .rrd 的檔案,是自訂的特殊格式。
此外,RRDTool 在圖表繪製的部份有非常大的彈性,在 MRTG 中,「永遠只有一種圖表樣式」,每個圖表「永遠只能有 2 筆資料」,RRDTool 提供了更多的圖表繪製功能,好處是,你能根據需要畫出複雜的圖表,壞處是,你必須從頭到尾自己定義圖表的線條樣式、單位、類型,有點像是M$ Excel中,製作圖表的文字版設定,這讓 RRDTool 圖表繪製變得很複雜。

和 MRTG 相比,RRDTool 有幾個差異點:
1. MRTG 將全部流程包裹起來,每次執行都是完全動作;RRDTool 則把流程的動作分離,資料紀錄歸資料紀錄,圖表繪製歸圖表繪製
2. MRTG 提供 SNMP 的溝通,能夠自行解析 SNMP 的資料;RRDTool 沒有辦法自行解析 SNMP 資料,它的資料紀錄,只用來產生 .rrd 紀錄檔

所以我們到這邊可以先做幾個小結論:
1. MRTG 的功能性來說,是比 RRDTool 更強的,因為它包含了 SNMP 的解析,而 RRDTool 沒有
2. 我們可以發現到,RRDTool 使用的資料紀錄不是單純的 .log,而是自有格式 .rrd,就資料儲存的彈性上,會比 MRTG 更好。
3. RRDTool 的效能可以大幅超越 MRTG,原因包括:
a. 因為 RRDTool 把所有操作流程分離,我們在定時操作時,只需要產生 .rrd 紀錄檔,並不需要畫圖表
b. RRDTool 因為使用特殊的格式,能加快處理速度,在 .rrd 紀錄檔的存取上可以比 MRTG 更快
c. RRDTool 並不需要額外解析判斷 SNMP 的 code,因為 RRDTool 定位是圖表繪製工具,並不是專門的流量繪製工具,所以並不負責 SNMP 資料的判讀,這也加快了它的速度,讓程式在這部份更單純
4. MRTG 只提供「一種圖表樣式」,缺乏彈性,但是簡單方便,RRDTool 彈性很大,但是需要自訂很多繪圖的參數

接下來,我們來介紹rrdtool 教學中沒提到的rrdcgi。

RRDTool 本身雖然是個應用程式,但是 RRDTool 也有提供其他語言用的 module,可以讓其他語言直接呼叫執行。
以 RRDTool 本身來說,作者開發了 rrdcgi,這個程式可以被用來產生 web-page。

想想看,我們在上面提到過,RRDTool 把操作流程分離,定時產生 .rrd 資料和圖表繪製是分開的。
而作者又另外提供了 rrdcgi 來產生 web-page,因此我們可以注意到,「RRDTool 的圖表繪製部份並不需要定期來製作(意思是:我們不用每 5 分鐘產生很多張 PNG 流量圖)」,事實上,我們可以利用 rrdcgi,當使用者瀏覽網頁時,動態的產生圖表。
這樣的好處是,我們不需要每 5 分鐘產生一次,可以在有人瀏覽時才產生,對於比較小的伺服器來說(像家裏的電腦),可以節省很多系統負載;對於專門的 Log Server 來說,可以把圖表的負載轉嫁出去;對於更有即時性的資料來說,我們可以更即時的繪製出目前的資料。

前面我們提到過,RRDTool 的資料收集並不方便,要蒐集 SNMP 的資料,居然還要我們自己用 snmpget 來抓資料,並且自己分析內容,想到就昏倒了。
有沒有更方便的辦法,尤其是已經使用 MRTG 的我們,要轉移到 RRDTool 有沒有更快的方式。

有的~我們可以在 mrtg.cfg(通常是 /etc/mrtg.cfg) 中加入下面這條:
LogFormat: rrdtool

之後執行
mrtg /etc/mrtg.cfg

MRTG 就會非常聰明且自動的幫我們把 MRTG 的所有 .log 紀錄檔轉換成 .rrd 紀錄檔,未來每次的執行,都會自動更新 .rrd 紀錄檔。

這樣的意義何在?
前面我們提到過,MRTG 和 RRDTool 的一個不同點在於,MRTG 包含了 SNMP 的資料解析能力,RRDTool 沒有,而使用上面的設定之後,我們就能夠利用 MRTG 幫我們把 SNMP 的資料解析出來,之後它會自動呼叫 rrdtool 把資料寫成 .rrd 格式的紀錄檔。
如此一來,我們不需要擔心 MRTG 轉移時舊紀錄遺失,也不用為了如何用 snmpget 產生 SNMP資料,更不需要煩惱 rrdtool 收集資料時的參數,我們只需要把重心完全放在 RRDTool 的強項,資料繪製上。
這邊要注意,雖然上述辦法似乎不錯,但是 RRDTool 收集資料時有很多參數可以設定,用 MRTG 來幫我們產生 .rrd,這些設定是沒辦法用的,意思是,「如果需要更詳盡的紀錄資訊,自己寫資料解析程式仍舊不可避免。」
這邊我的建議是,「從 MRTG 開始,MRTG 用得很順了,開始改用 RRDTool 來繪製圖表,之後再更進一步自己寫解析程式,自己使用 RRDTool 來建立資料。」

我們都知道,傳統上來說,CGI 大多是 perl 寫的,CGI 的缺點我就不多說了,這已經是 FAQ 的答案了,而 RRDTool 提供 rrdcgi,從網頁上就提到了,它能提供 shell/perl 的操作。而其他語言呢?

RRDTool 也提供了包括 Ruby、Python 的 module,透過這些 module,可以在不同的語言中呼叫使用 RRDTool,尤其因為這類 module 都是呼叫 librrd(RRDTool Library),因此速度上、效率上都會比 system() 執行 rrdtool 要更好。
而以我來說,我個人在 shell script 和 web 中,偏好使用 php,也只會使用 php,有沒有 RRDTool 的 php module 呢?
有的~RRDTool 的 php module 教學網址如下:
http://www.ioncannon.net/system-administration/59/php-rrdtool-tutorial/

由於 Debian/Ubuntu 套件庫中並沒有包含 RRDTool 的 php module,因此我們要自己「製造」出來,相關的教學網址如下:
http://www.ioncannon.net/system-administration/25/how-to-build-the-php-rrdtool-extension-by-hand/

目前我已經做成功了,phpinfo() 中已經有顯示 rrdtool 的 module,相關的教學會在之後另外 po 一篇。

最後最後,在初步認識的最後面,我要提出不使用 RRDTool 的意見。
前面提到過,RRDTool 分為「資料紀錄」和「繪製圖表」兩部份,我們可以看作:
前段-資料蒐集
後段-繪製圖表

1. RRDTool 在前段-資料蒐集中,並沒有提供任何資料解析的能力,因此如果認為 MRTG 的資料處理並不夠好用,那麼不用考慮 RRDTool 了,RRDTool 這部份更差、更複雜(資料建立時,參數很多很麻煩),此時你該考慮,是否自己試著寫資料解析的程式。

2. 如果你認為在前段-資料蒐集中,用檔案儲存紀錄很討厭,不幸的,RRDTool 同樣是以檔案來儲存紀錄,並沒有以 SQL Server 儲存,不過目前這部份相關資訊還沒找很齊,目前看起來不太好找。

3. 如果覺得 RRDTool 後段-繪製圖表的功能不符合需求,例如無法繪製成 .swf 的 Flash 檔案,那麼除非你已經用 MRTG 很久了,轉成 RRDTool 和 .rrd 資料看起來似乎比較好處理,除此以外,不建議使用 RRDTool,自己乖乖的畫 Flash,乖乖的寫分析程式,應該會更方便些,因為這些 RRDTool 都幫不上忙,用了 RRDTool~多此一舉~

沒有留言: