RRDTool

關於RRDtool
安裝前準備工作
安裝RRDtool
開始使用RRDtool
建立RRD檔
抓取資料
更新RRD檔資料
繪製圖表
其他RRDtool的指令
簡單實作範例
RRDtool備份


  • 關於RRDtool

什麼是RRDtool?相信大部份的人都沒有聽過這個東東....不過,如果問起知不知道有MRTG這套程式,相信就有許多人聽過了。 打個比方來說明︰如果MRTG是一輛車子,那麼RRDtool就是製造車子的工廠了!     簡單講,RRDtool是一套可以把數據畫成圖表的程式,以時間為x軸、流量為y軸,而且可以動態更新圖表的程式,聽起來似乎非常的強大?沒錯,正是因為RRDtool的功能強大以致於它有不太容易學習的缺點,況且坊間有提到RRDtool的書籍可以說是少之又少(目前還沒看過);網路上找?總共的中文教學文章只有酷學園Abelyang的那一篇。     反觀MRTG簡單又功能強大,學習文件頗多,能滿足大部份人的需求,但是如果您對於MRTG的統計方式不能認同,亦或是您有強烈customize統計圖表的需求,RRDtool將會是您最好的選擇!


(本圖取自RRDtool官方網站)


  • 安裝前準備工作

本文以下的敘述皆實作於FreeBSD 6.0系統下,不過如果您的系統不是FreeBSD,不用擔心,大同小異啦 !   除了一些指令有小小的不同以外......  此外,因為RRDtool能做出來的只是圖表而已,一般來說,都是以放在WEB的方式讓管理者或是使用者能夠瀏覽,所以,請先安裝好WWW server  (如:Apache)  。


  • 安裝rrdtool

在FreeBSD下︰

LEE# cd /usr/ports/net/rrdtool/ //切換到ports中RRDtool的目錄
LEE# make install clean     //安裝並清除安裝暫存的檔案

在Debian下:

LEE# apt-get update            //更新檔案清單
LEE# apt-get install rrdtool  //使用apt安裝RRDtool套件

其他linux則可以到www.rrdtool.org下載Source Code或是Binary檔安裝!

如果安裝過程沒有差錯,RRDtool就安裝完成了!    如何確定RRDtool能正常運作呢?  在console下輸入「rrdtool」,如果有看到以下畫面代表您的RRDtool已經可以正常運作囉!

LEE# rrdtool
RRDtool 1.0.49 Copyright 1997-2004 by Tobias Oetiker <tobi@oetiker.ch>

Usage: rrdtool [options] command command_options

Valid commands: create, update, graph, dump, restore,
last, info, fetch, tune, resize, xport

RRDtool is distributed under the Terms of the GNU General
Public License Version 2. (www.gnu.org/copyleft/gpl.html)

For more information read the RRD manpages

LEE#

如果沒有看到,請在確定您的安裝步驟有沒有錯誤!


  • 開始使用RRDtool

先說明一下RRDtool運作的大概流程︰

  

步驟一︰建立RRD檔,這個檔說來說去就是RRDtool的「專屬」資料庫啦!RRDtool以自有的格式存放流量資料,下面會有比較詳細的說明。

步驟二︰「抓取資料」個人覺得是整個RRDtool最困難的一部分,因為RRDtool的資料是要靠自己弄出來,不若MRTG內建抓資料功能,但是卻因為如此,可以「餵」給RRDtool畫圖的資料彈性也比較大,例如︰snmp查詢結果、系統狀態、網頁中特定數字統計..等等。

步驟三︰抓下來的資料就用「rrdtool update」的指令更新步驟更新的RRD檔的內容,讓圖表能畫出最新的流量。

步驟四︰這就是重點啦!透過「rrdtool graph」的指令來依據RRD檔的資料繪圖,這也是使用者唯一看的到的東西,若規劃的不好會影響使用者閱讀上的困難!

迴圈︰由於要達成動態繪圖的圖表,第二步驟到第四步驟必須不斷的重複執行以維持資料的更新,目前知道要達成迴圈的方法有兩種︰1、在Script中使用迴圈;2、使用cron這個排班程式做排班。

以下將詳細的說明這四個步驟︰


  • 建立RRD檔 

RRDtool 建檔語法
rrdtool create filename
[--start|-b start time]             // "-s" 代表此RRD檔可以開始紀錄的時間,注意︰要把時間單位轉換成秒,1970/01/01算第一秒,用`date`指令可由系統幫您計算。 
[--step|-s step]                      //意指每筆資料的間隔時間,一般使用者設定'300',即每五分鐘為一間隔。
[DS:ds-name:DST:heartbeat:min:max]
[RRA:CF:xff:steps:rows]

重要參數說明︰

DS 全名"Data Source",就是資料來源。這有點像是在RRD檔這個資料庫建一個可以儲存資料的欄位。

例︰DS:telnet:COUNTER:600:0:100000000

DS表示式總共有六個欄位︰第一個欄位宣告這列式為DS表示式;第二個欄位宣告這個DS在RRD檔裡面的"欄位名稱"(Data Source Name),此例宣告此欄叫做"telnet"(名稱可以自訂);第三個欄位叫做DST(Data Source Type),習慣上常用 GAUGE(個別值,像CPU loading) 及COUNTER (累計值,像流量資料) 在產生圖檔時, GAUGE 是 100 就畫100在 Y 軸上;但如果是 COUNTER ,此次值為100,而前一值是 98,則會在Y軸上畫 2;第四個欄位稱做有效期(heartbeat),範例裡的值為'600',假設要取12:00的資料,而前後300秒裡的值(11:55-12:05)經過平均或是取最大或最小都算是12:00的有效值;第五個欄位和第六個欄位為這個欄位允許可以存放的最大最小值,此例允許最小為0,最大為100000000,如果不想設限制可以再第五個欄位和第六個欄位以 "U:U"表示。

RRA全名為Round Robin Archive,簡單來說就是其實就是什麼類資料要存幾筆,資料的儲存分成四類,分別為AVERAGE, MIN, MAX, LAST 意即平均值,最大值,最小值,最後一筆 。

例︰0.5:1:603

因為我們將 step 定為 300 秒是指若原計算時間點為 12:00 的話,記錄時要以 11:57:30~12:02:30 的平均值為主,這個值若在此時間點內只有一筆資料的話,其意即是平均值,所以此一值即表原 telnet…等共要記錄幾筆,603 是指要存 603 筆,若超過603筆,則最早之一筆將被移出。
0.5:6:603 第三個欄位表示取 6 筆資料(每筆為 step 值,在此意即5分鐘)為平均值( 30 分鐘), 存 603 筆
0.5:24:603 24 即二小時
0.5:288:800 288 即一天

以下為建檔的完整範例︰

$LEE# rrdtool create lee.rrd -s 300 \       //此列為建立'lee.rrd'這個資料檔,step值為300s
?DS:input:COUNTER:600:0:100000000 \       //Data Source第一欄
?DS:output:COUNTER:600:0:100000000 \     //Data Source第-二欄
?RRA:AVERAGE:0.5:1:603 \                         //每隔五分鐘(1*5)存一次資料的平均值
?RRA:AVERAGE:0.5:6:603 \                         //每隔三十分鐘(6*5)存一次資料的平均值
?RRA:AVERAGE:0.5:24:603 \                       //每隔兩小時(24*5)存一次資料的平均值
?RRA:AVERAGE:0.5:288:603 \                     //每隔一天(288*5)存一次資料的平均值
?RRA:MAX:0.5:1:603 \                                  //每隔五分鐘存一次資料的最大值
?RRA:MAX:0.5:6:603 \                                  //每隔三十分鐘存一次資料的最大值
?RRA:MAX:0.5:24:603 \                                //每隔兩小時存一次資料的最大值
?RRA:MAX:0.5:288:603                                //每隔一天存一次資料的最大值
$LEE#

  • 抓取資料

同上面所說,對於不會Shell Script或者是Perl..等可以處理字串的方法的人,這部份算是比較難的。 最好先花點時間先稍微閱讀一下此類資訊會比較好上手,以下提供一份不錯的Shell Script的教學文件http://www.study-area.org/cyril/scripts/scripts/。

以下為部分簡單的範例︰

$LEE# snmpget -c public  192.168.0.1 ifInOctets.4 
interfaces.ifTable.ifEntry.ifInOctets.4 = Counter32: 13526287

如果某台機器有安裝snmp的服務,則可用snmpget查詢此主機上面的資料,至於可以查詢到什麼資料端看那台機器所提供的MIB功能強不強大。上面的例子使用snmpget的指令嘗試抓取 192.168.0.1 這台主機的位址," -c"參數代表此台主機的通訊名稱,一般的主機預設為" public",但是也可以自訂,要了解某台主機的通訊名稱請向管理者詢問。" ifInOctets.4"中的 ifInOctets 為查詢此台主機的輸入流量,後面的" .4 "則代表第四個網路介面。

下面的:interfaces.ifTable.ifEntry.ifInOctets.4 = Counter32: 13526287 為主機端回應的結果,因為我們要的資料為「13526287」(此值就是輸入流量)這個值,這時候就是字串處理函式發揮強大功能的時候啦!

$LEE# snmpget -c public 192.168.0.1  ifInOctets.4 | sed -e 's/.*ter32: \(.*\)/\1/'
13526287

回傳值為「13526287」,是的,這就是我們要的結果。 到底是什麼讓前面的那串文字不見而取的我們要的數值呢?  奧妙就在於後面的那串古怪的語法,「sed -e 's/.*ter32: \(.*\)/\1/'」,不瞭解的話請自行翻閱Shell Script的教學文件,不然用法千百種講也講不完。      重要的是這只是我們往後的Script檔裡面的一個小小的範例,下面的範例將會附上一個完整的Script檔,您就能瞭解怎麼把這先抓回來的資料使用在RRDtool上了。

當然,您不一定要使用snmpget,也可以使用snmpwalk、tcpdump..等等抓資料回來分析,說誇張點,凡是有數字會「動」的東西都可以經過處理變成我們要的資料,然後畫成圖表。


  • 更新RRD檔資料

RRD的Update指令大概算是RRDtool裡面最簡單的指令了吧!

語法︰rrdtool update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...]
這個很好理解,基本上就是根據 DS來更新資料,如上述之lee.rrd,若有需要更新時

$LEE# rrdtool update lee.rrd 1061811856:1199:0:821073  // 後三個欄位分別代表(時間:欄位一值:欄位二值)

上面的 1061811856 即時間值,如果就是要現在的時間值,則可以 N 代表,但要轉換成秒值,通常我們都會以`date +%s`來轉換。可以試試看,在FreeBSD輸入`date +%s`:

LEE# date +%s
1105334125    //從1970/1/1 到現在的秒數

 

注︰請注意在Linux下和FreeBSD下指令"date"的用法並不相同。如在Linux下"date -d"為轉換某日期成為秒數,而BSD下"date -d"則為系統設定時間,使用不當容易造成系統時間錯誤。


  • 繪製圖表 

RRDtool繪圖語法︰(以下僅列出常用的)
rrdtool graph image-filename
-s 繪圖資料的起始時間,預設是一天前,單位是"秒數"
-e 繪圖資料的結束時間,預設是現在,亦可使用 date 方式來達到前三天至昨天圖檔
--no-minor 不要副格線
-t 圖檔標題
-v Y 軸說明
-w 資料區的寬度,資料區指的是數據顯示的部份,而非說明或圖例
-h 資料區的高度
-u Y 軸正值高度
-l Y 軸負值高度
-M 自動調整畫圖的Y軸最大值

DEF 其語法為 DEF:vname:rrd_filename:DS_name:[AVERAGE|MAX..]
這個有點像是上面的DS(Data Source),亦即在圖表中宣告一個資料來源,必須先宣告,讓以下的圖從這邊取資料。
CDEF 一個虛擬的變數,就是把DEF的資料拿來做加工,其值為 DEF 的某些運算,其運算式需寫成後序,中間以逗號隔開。
EX: a=1+3 寫成 a=1,3 +
http=(input+output)/1024 寫成 http=input,output,+,1024,/

LINE函數其語法︰LINE{1|2|3}:vname[#rrggbb[:legend]],用這條函式就是您想把資料用線條的方式表示,其中依照線條的粗細又可分為LINE1、LINE2、LINE3三種SIZE;vname這欄填的就是您為DEF這個地方宣告的名稱,這個名稱可自己隨意取;#rrggbb這裡填的就是你想要線條顯示出來的顏色,使用RGB代碼;legend裡面填的是AVERAGE、MAX等表示取值的方式。下面為例子︰


(此圖取自RRDtool完全攻略文章中)

AREA函數其語法︰AREA:vname[#rrggbb[:legend]],用這條函式就是您想把資料用填充塊狀方塊的方式表示,其他後面的參數請參照LINE的用法,做出來的範例如下︰


(此圖取自RRDtool完全攻略文章中)

STACK函數其語法︰STACK:vname[#rrggbb[:legend]],則是畫出資料數值至其上的數值,也就是要有資料數值在 STACK 數值之上,用法同上兩個。
如果使用 AREA/STACK 時需特別注意圖蓋圖的問題,一定要先畫大的值,再畫小的值,才會有層次的效果,不然,最大的數據若最後畫,會直接把小的資料蓋過去,導致小值無法顯示出來。

COMMENT 說明欄字,如上圖的的"Last Updated'字樣為使用COMMENT:"Last Updated"指令產生,可以用 \n 等換行符號。
GPRINT:GPRINT GPRINT:vname:CF:format vname 即DEF 中的 vname,而 CF 看你要輸出的文字是AVERAGE/MAX/MIN/LAST 等數值,format 如同 printf 中的格式,
做出來如下圖例︰


  • 其他少用的RRDtool的指令

rrdtool info rrdfile.rrd - 顯示出rrd檔目前的資料儲存方式(如每幾分鐘球平均或算最大值....等等)。

rrdtool dump rrdfile.rrd > filename.xml  - 把rrd二進位檔的資料以XML的資料格式匯出。

rrdtool restore filename.xml filename.rrd [--range-check|-r] - 把rrd匯出的XML檔匯入rrd的二進位檔內。

rrdtool fetch rrdfile.rrd CF [--resolution|-r resolution] [--start|-s start] [--end|-e end] - 抓取rrd資料檔內的特定資料。

rrdtool tune rrdfile.rrd [--heartbeat|-h ds-name:heartbeat] [--minimum|-i ds-name:min] [--maximum|-a ds-name:max] [--data-source-type|-d ds-name:DST] [--data-source-rename|-r old-name:new-name] - 調整rrd資料檔內的資料記錄方式。

以上指令詳細使用方式請參照官方網站︰www.rrdtool.org


  • 簡單實作範例

寫了那麼多,還是來個簡單的從頭到尾的範例吧!

步驟一︰ 先在console下建立RRD檔,

$LEE# rrdtool create test.rrd -s 300 DS:input:COUNTER:600:0:100000000 \  //檔名請自訂,可以把test.rrd改掉
?DS:output:COUNTER:600:0:100000000 \
?RRA:AVERAGE:0.5:1:603 \
?RRA:AVERAGE:0.5:6:603 \
?RRA:AVERAGE:0.5:24:603 \
?RRA:AVERAGE:0.5:288:603 \
?RRA:MAX:0.5:1:603 \
?RRA:MAX:0.5:6:603 \
?RRA:MAX:0.5:24:603 \
?RRA:MAX:0.5:288:603
$LEE# ls
test.rrd       //這樣就是建立成功了

步驟二︰把下面的Script碼複製,用文書編輯器新建一個檔,把以下內容放到那個檔(假設叫做 test.sh),並且依照黃色字的指示在相關變數裡面填入您自己主機的相關資料,填完後把黃色的註解刪除(不然執行時會出現錯誤),最後打 "sh test.sh"(看您的檔取什麼名稱)執行即可。

#!/bin/sh                        //宣告使用的shell為 Bourne Shell

#抓資料並更新
rrd_path="/root/rrd/test.rrd" //這個位址請指定為您存放rrd檔的目錄
rrd_data="192.168.0.1"      //這個IP位址請自行換成您要偵測的主機(目標主機須有執行:snmpd)
image_path="/root/rrd/html"  //裡請把""裡面替換成您要存放圖檔的目錄
sec=300
while [ 1 ]              //這裡使用無窮迴圈跑此Script
do
input=`snmpget -c public $rrd_data ifInOctets.4 | sed -e 's/.*ter32: \(.*\)/\1/'`
output=`snmpget -c public $rrd_data ifOutOctets.4 | sed -e 's/.*ter32: \(.*\)/\1/'`
now=`date +%s`
echo "rrdtool update $rrd_path $now:$input:$output" >> test.cmd   //紀錄update的資料
rrdtool update $rrd_path $now:$input:$output

#畫圖
rrdtool graph $image_path/test.png \
--title "Local Network" \                   \\換成您想要的圖檔標題
DEF:v1=$rrd_path:input:AVERAGE \
DEF:v2=$rrd_path:output:AVERAGE \
AREA:v1#FF0000:"Input" \
AREA:v2#00FF00:"Output" \
-v "Value"
sleep $sec
done 

可以跑出一個圖,大概如下圖︰

上面只是個極為簡單的範例,事實上還有很多的參數可以設定,可以讓圖表更為精緻,您可以參考官方網站或者是下面的RRDtool完全攻略教學文件獲得進一步的資訊!


  • RRDtool備份

聰明的您在看完上面的文章一定會想到,如果哪一天您的愛機遭遇不測(被雷打中?!),那裡頭的寶貴資料不就全毀了? 其實在RRDtool中最重要的資料檔也不過是所謂的RRD資料檔,只要有這個檔圖就可以再畫,所以我們只要利用簡單的Shell Script就能達到備份的效果︰

以下假設您的電腦有兩顆硬碟,以下的範例示範如何定期的把資料備份到另外一個槽的資料夾︰

#!/bin/sh
rrd_path="/root/rrd"        //RRD檔所在資料夾
rrd_file="a.rrd b.rrd c.rrd"    //RRD的檔名,可能不只一個,此例為三個
dest="/home/backup"     //備份檔預定存放的資料夾

for data  in $rrd_file
do
cp $rrd_path/$data  $dest
done

假設此Script 名稱為 backup.sh 放在/root/rrd資料夾底下,則我們可以在/etc/crontab這個檔或是打"crontab -e"裡面加入以下這行︰

*    12     *     *     *     root    /root/rrd/backup.sh         //在每天中午十二點備份這些RRD檔到另外一個資料夾

 


參考資料:
      rrdtool完全攻略 出處:酷學園 作者:Abelyang

RRDtool 官方網站﹕http://www.rrdtool.org

转自 http://www.blogjava.net/ruoyoux/articles/257138.html

RRDTool (比较全)相关推荐

  1. rrdtool 画图

    步骤. 1.建库 rrdtool create /home/zzz/wwwroot/liu/tcpdump.rrd -s 60 -b '1060686480' DS:telnet:GAUGE:600: ...

  2. 监控cacti中的RRDtool用法详解

    RRDtool 作为一个合格的运维工程师,监控技能必须是要掌握的,当然监控的软件很多很多(cacti,nagios,zabbix...).而生产环境中一般只运用1.2种而已.所以全部掌握这些有点不靠谱 ...

  3. zabbix监控哪些东西_监控系统选型,一篇全搞定

    之前,写过几篇有关线上问题排查的文章,文中附带了一些监控图,有些读者对此很感兴趣,问我监控系统选型上有没有好的建议? 图片来自 Pexels 目前我所经历的几家公司,监控系统都是自研的.其实业界有很多 ...

  4. RHEL 5.4 下安装和使用 ntop 全纪录(ntop:Linux下可通过Web访问的网络流量监控工具)...

    RHEL 5.4 下安装和使用 ntop 全纪录 1. ntop介绍 Ntop是一种监控网络流量工具,用ntop显示网络的使用情况比其他一些网络管理软件更加直观.详细.Ntop甚至可以列出每个节点计算 ...

  5. [003]python数据类型一__python_全栈基础

    您好!此笔记的文本和代码以网盘形式分享于文末! 因个人能力有限,错误处欢迎大家交流和指正!基础部分内容简单,但多且零散!                                        ...

  6. 最全的渗透测试具体详细检测方法

    越来越多的网站以及app手机端客户注重安全渗透测试服务,上线前必须要对平台进行全面的预渗透测试找出安全漏洞以及BUG,很多客户找我们SINE安全,做渗透测试服务的时候对具体的流程可能不太了解,下面我们 ...

  7. 【HPC最全最新离线安装开源资源管理、作业调度软件-SLURM】

    文章目录 HPC 离线最全安装开源资源管理.作业调度软件-SLURM 一.★ 软件简介 1.1 软件定义 1.2 软件架构 1.3 slurm 插件 1.5 slurm配置模式分类 1.6 slurm ...

  8. 运维必知必会的监控知识体系全梳理

    公众号回复:干货,领取价值58元/套IT管理体系文档 公众号回复:ITIL教材,领取最新ITIL4中文教材 正文 监控是整个运维乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供详实的 ...

  9. 玩转Python必备:史上最全的Python库,【值得收藏,事半功倍】

    库名称     简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器 ...

最新文章

  1. python中int表示的数据类型是_python中的基本数据类型之 int bool str
  2. pb打印选择页数_要想打印不卡纸,卡纸原因要了解
  3. python数据挖掘主要特点_python数据挖掘(从数据集中抽取特征)
  4. element el-input 自动获取焦点和IE下光标位置解决方法
  5. android okhttp 多线程,android – Okhttp Authenticator多线程
  6. Faster RCNN算法详解
  7. stl中copy()函数_std :: rotate_copy()函数以及C ++ STL中的示例
  8. 纯CSS实现侧边栏/分栏高度自动相等
  9. nginx An attempt was made to access a socket in a way forbidden by its access permissions
  10. linux umount 时出现device is busy 的处理方法--fuser
  11. java中一级缓存_java – 集群环境中的hibernate一级缓存
  12. 重点推荐:HP大中华区总裁孙振耀退休感言
  13. 投资、理财、炒股记事
  14. 解决Tuxera NTFS for Mac软件安装问题 手动批准mac内核扩展
  15. mybatis-plus 自定义QueryWrapper(一)实现查询函数
  16. debian nginx php配置文件,在debian上安装配置nginx + php-FPM + APC
  17. #边学边记 必修4 高项:对事的管理 第六章 项目质量管理 质量管理基础
  18. 基于灰度直方图和边界方向直方图的图像检索
  19. Excel文件批量重命名
  20. outlook添加账号接受服务器,如何在outlook添加账号

热门文章

  1. 游戏帧同步和状态同步
  2. Css实现刘海,纯CSS样式写刘海屏效果
  3. 数论[计算机数学专题(5)]
  4. SOUI自定义控件(1)
  5. 打开jupyter notebook 报错 404GET/static/components/marked/lib/marked.js?
  6. apache的url重写
  7. Solr Replication
  8. STM32GPIO寄存器CRL、CRH、IDR、ODR、BSRR、BRR
  9. 了解.net框架 MonoRail
  10. Uniapp之API promise化