轉自:http://www.jianshu.com/p/b925b1584ab2
RRDTool 是一套監測工具,可用於存儲和展示被監測對象隨時間的變化情況。比如,我們在 Windows 電腦上常見的內存和 CPU 使用情況。
RRD 數據庫在被創建的時候就已經定義好了大小,當空間存儲滿了以后,又從頭開始覆蓋舊的數據,所以和其他線性增長的數據庫不同,RRD 的大小可控且不用維護。
你可以把 RRD 理解為一個有時間刻度的圓環,每個刻度上可以存儲一個數值,同時有一個從圓心指向最新存儲值的指針。
可以想象,隨着時間推移,指針會繞着圓心一直移動下去,當它指向下一個刻度后,就可以在那個位置上存儲一個新的數值。但是,指針只能繞一個方向前進,假設你存儲了時刻3的監測值,那就不能再存儲時刻2的監測值了。如下圖所示:

創建 RRD 基本語法
rrdtool create filename
[--start|-b start-time]
[--step|-s step]
[DS:ds-name:DST:dst-arguments]
[RRA:CF:xff:step:rows]
其中
rrdtool create filename
表示使用 rrdtool 命令 create 創建一個名為 filename 的數據庫文件,通常 RRD 數據庫文件的后綴為 .rrd ,但是你隨便使用文件名也不會有影響。
--start|-b start-time
這個選項表示 RRD 數據庫的起始 (start/begin) 時間點為 start-time,這是一個從 1970-01-01 00:00:00 開始計時,以秒為間隔的一個整數值。所以,start-time 是一個代表時間點的整數值,表示 RRD 數據庫記錄的監測值從這個時刻開始。
[--step|-s step]
這個選項表示監測的時間間隔,即多久時間去獲取一次被監測對象的數值,默認值為5分鍾(300秒)。比如,我們可以從10:00開始每60秒去獲取一次電腦內存的使用值,這個時候 step 就是 60,獲取到的數值如下圖所示:

[DS:ds-name:DST:dst-arguments]
這個選項用來定義數據源(Data Source)屬性,包括數據源名稱 ds-name,比如我們可以給監測內存使用率的數據源命名為 memory-rate。
還要定義數據源類型(Data Source Type),常用的有以下4種數據源類型,分別是:
1、GAUGE
實測值,RRD 將如實記錄,比如溫度變化曲線:

2、COUNTER
計數值,這是一個只增不減的正整數。比如,汽車行駛里程,從汽車第一次上路開始,里程就從0開始不斷增長。
假設每隔30分鍾監測一次汽車里程,當 RRD 收到 COUNTER 類型的數據時,並不會像 GAUGE 類型那樣直接存儲,而是計算變化率:

計算原理: (12121km - 12100km) / (10:30 - 10:00) = 11000m / 1800s = 6.11m/s
所以,RRD 對於 COUNTER 類型的數據源存儲的是變化率,對於上述里程表而言就是行駛速度。
(注:第一個存儲值為 UNKNOWN,因為沒有更早的數據,所以沒有變化可言)
3、ABSOLUTE
ABSOLUTE 類型存儲的也是變化率,假設我們正在微信和好友聊天,每五分鍾我們會看一下有沒有新消息,如果有的話就立即處理,這樣未讀提醒就會變為0,然后下一個五分鍾后繼續看未讀新消息數,會得到這樣一個監測表:

計算原理:120條 / 300秒 = 0.4條/秒
這樣我們就可以知道一段時間內聊天快慢的情況,數值越大表示5分鍾內收到的未讀消息越多,聊天也就越火熱。
4、DERIVE
DERIVE 類型存儲的也是變化率,和 COUNTER 類型不同的是,監測值可以增長也可以下降,例如水庫的水位監測:

可以看到水位一時升高,一時降低,通過計算變化率能夠監測某一時段水位正在升高還是降低,以及相應的速度。
[RRA:CF:xff:step:rows]
RRA (Round Robin Archive) 是用來定義 RRD 數據庫歸檔模型,RRDTool 繪圖展示監測情況的時候就從 RRA 中獲取數據。
為什么不直接獲取存儲的原始數據來繪圖呢?
這得從監測場景的實際需求出發,通常我們對最近一小時或一天的監測數據最關心,對於一個月或者一年以上的監測數據有個大概的認知就可以。
假設我們每秒監測一次某台服務器 CPU 使用率,那么一年后將獲得:
1 x 60秒 x 60分鍾 x 24小時 x 365天 = 31536000
個監測值。
如果這么多數據點在一張圖表上展示,即使一個數據點只占一個像素,你也可以想象得多長的圖片才能完整展示監測數據。
但是,如果我們把每60秒監測的60個原始數據點計算出一個平均值 AVERAGE(d1,d2,d3,...,d60) 的話,這樣數據量就比使用原始值降低了60倍!這種經過計算平均值后得到的數據稱為歸檔值。
雖然喪失了一定的精度,但是並不影響我們觀察一年來的變化趨勢。
RRD 提供的歸檔方法有4種,除了上述的計算平均值 AVERAGE 方法外,還有:
計算最大值 MAX(d1,d2,d3,...dn) = 最大的那個監測值
計算最小值 MIN(d1,d2,d3,...dn) = 最小的那個監測值
計算最后值 LAST(d1,d2,d3,...dn) = 最后的那個監測值