一、概念原理
RRDtool是指Round Robin Database 工具(环状数据库)。Round robin是一种处理定量数据、以及当前元素指针的技术。想象一个周边标有点的圆环--这些点就是时间存储的位置。从圆心画一条到圆周的某个点的箭头--这就是指针。就像我们在一个圆环上一样,没有起点和终点,你可以一直往下走下去。过来一段时间,所有可用的位置都会被用过,该循环过程会自动重用原来的位置。这样,数据集不会增大,并且不需要维护。RRDtool处理RRD数据库。它用向RRD数据库存储数据、从RRD数据库中提取数据(来源百度问答 )。rrdtool数据存储结构图如下:
<a href="https://www.361way.com/wp-content/uploads/2015/01/rrdtool.png"><img src="https://www.361way.com/wp-content/uploads/2015/01/rrdtool.png" alt="rrdtool" width="675" height="209" class="alignnone" /></a>
二、rrdtool 的规划
在使用rrdtool create文件和update数据之前,需要考虑以下几点:
A)是一个 RRD 文件中包括多个监测对象(DS),还是分成多个 RRD 文件 ?RRDtool 提供了 tune 操作,可以增加监测对象或者删除 RRD 文件中的某个对象,而且绘图时也可以指定要画的是那个对象,这点看个人喜欢而定。
B)如何统计取得的数据 :5分钟、20分钟、2小时、1天。RRDtool 则可以自己设置。
C)如何保存/统计这些数据 :RRDtool 的数据存放则需要自己定义。规划如下:
每日统计图(5分钟平均) : 600 个,大约2天的时间 每周统计图(20分钟平均) : 600 个,大约8天的时间 每月统计图 (2小时平均) : 600 个,50 天的时间 每年统计图 (1天平均) :730 个, 2年的时间
<br />
D) 要以什么方式绘图 :MRTG 只有曲线(LINE)和方块(AREA)两种;RRDtool 除了这两种外,还有一种是 STACK 方式。就是在前一个曲线或者方块的基础上绘图图,而不是直接从 X 轴开始绘图。这样绘制出来的图比较清晰,不会出现交叉的现象,但此时 Y 轴的值等于当前对象的值加上前一个绘图对象的值。例如前一个对象(cpu 的系统进程利用率)的值是10,采用的是 AREA 方式绘图。当前对象(cpu 的用户级进程的利用率)是5,采用的是 STACK 方式,则“cpu的用户级进程利用率”对应的Y轴刻度是10+5=15;所以如果不加说明,别人可能会误解。
三、创建rrd数据库
1、全局参数
rrdtool create filename [--start|-b start time] [--step|-s step] [DS:ds-name:DST:dst arguments] [RRA:CF:cf arguments]
<br />
其中 filename 、DS 部分和 RRA 部分是必须的。其他两个参数可免。
- filename:默认是以 .rrd 结尾,但也以随你设定。
- step :就是 RRDtool “期望” 每隔多长时间就收到一个值。和 MRTG 的 interval 同样含义。默认是5分钟。我们的脚本也应该是每5分钟运行一次。
- start :给出 RRDtool 的第一个记录的起始时间。RRDtool 不会接受任何采样时间小于或者等于指定时间的数据。也就是说 –-start指定了数据库最早的那个记录是从什么时候开始的。如果 update 操作中给出的时间在 –-start 之前,则 RRDtool拒绝接受。–satrt 选项也是可选的。按照 我们在前一篇中的设定,则默认是当前时间减去 600*300秒,也就是50个小时前。 如果你想指定–start 为1天前,可以用–start $(date -d ‘1 days aog’ +%s) ,–start 选项的值必须是 timestamp 的格式。
- DS :DS 用于定义 Data Soure 。也就是用于存放脚本的结果的变量名(DSN)。就是我们前面提到的 eth0_in ,eth0_out, lo_in , lo_out 。DSN 从 1-19 个字符,必须是 0-9,a-z,A-Z 。
- DST :DST 就是 Data Source Type 的意思。有 COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE 5种。由于网卡流量属于计数器型,所以这里应该为 COUNTER 。
- RRA :RRA 用于指定数据如何存放。我们可以把一个RRA 看成一个表,各保存不同 interval 的统计结果。
- PDP :Primary Data Point 。正常情况下每个 interval RRDtool 都会收到一个值;RRDtool 在收到脚本给来的值后 会计算出另外一个值(例如平均值),这个值就是 PDP ;这个值代表的一般是“xxx/秒”的含义。注意,该值不一定等于RRDtool收到的那个值。除非是GAUGE 。
- CF :CF 就是 Consolidation Function 的缩写。也就是合并(统计)功能。有 AVERAGE、MAX、MIN、LAST 四种分别表示对多个PDP 进行取平均、取最大值、取最小值、取当前值四种类型。具体作用等到 update 操作时再说。
- CDP :Consolidation Data Point 。RRDtool 使用多个 PDP 合并为(计算出)一个 CDP。也就是执行上面 的CF 操作后的结果。这个值就是存入RRA的数据,绘图时使用的也是这些数据。
<br />
rrdtool create Flow.rrd \ --start $(date -d "1 year ago" +%s) \ --step 300 \ DS:eth0_in:GAUGE:600:0:5000 \ DS:eth0_out:GAUGE:600:0:5000 \ RRA:AVERAGE:0.5:1:600 \ RRA:AVERAGE:0.5:6:700 \ RRA:AVERAGE:0.5:24:775 \ RRA:AVERAGE:0.5:288:797 \ RRA:MAX:0.5:1:600 \ RRA:MAX:0.5:6:700 \ RRA:MAX:0.5:24:775 \ RRA:MAX:0.5:444:797 \ RRA:MIN:0.5:1:600 \ RRA:MIN:0.5:6:700 \ RRA:MIN:0.5:24:775 \ RRA:MIN:0.5:444:797
<br />
上面第2-4个 RRA的记录数实际上用的是700,775,797,为什么不是 600,600,730呢?
600 samples of 5 minutes (2 days and 2 hours)= 180000 秒 (2.08天) 700 samples of 30 minutes (2 days and 2 hours, plus 12.5 days)= 1260000 秒 (14.58天 ,2周) 775 samples of 2 hours (above + 50 days) = 5580000 秒 (64.58 天,2个月) 797 samples of 1 day (above + 732 days, rounded up to 797) = 68860800 秒(2年)
<br />
可以看出每个 RRA 都存储了相应单位2倍时间的数据,例如每天的 RRA 存储2天的数据,每周的 RRA 存储2周的数据,每月的 RRA 存储2个月的数据,每年的 RRA 存储2年的数据 。
2、DST详解
DST 的选择是十分重要的,如果选错了 DST ,即使你的脚本取的数据是对的,放入 RRDtool 后也是错误的,更不用提画出来的图是否有意义了。如何选择 DST 看下面的描述 :
COUNTER :必须是递增的,除非是计数器溢出(overflows)。在这种情况下,RRDtool 会自动修改收到的值。例如网络接口流量、收到的packets 数量都属于这一类型。
DERIVE:和 COUNTER 类似。但可以是递增,也可以递减,或者一会增加一会儿减少。
ABSOLUTE :ABSOLUTE 比较特殊,它每次都假定前一个interval的值是0,再计算平均值。
GAUGE :GAGUE 和上面三种不同,它没有“平均”的概念,RRDtool 收到值之后字节存入 RRA 中。
COMPUTE :COMPUTE 比较特殊,它并不接受输入,它的定义是一个表达式,能够引用其他DS并自动计算出某个值。例如:DS:eth0_bytes:COUNTER:600:0:U DS:eth0_bits:COMPUTE:bytes,8,* 这在流量统计Bit和byte不同单位时会用到。
AVERAGE 类型适合于看“平均”情况,例如一天的平均流量。
MAXIMUM 、MINIMUM在每个 CDP 的周期内最高是达到多少,最低又是多少。
LAST 类型适用于 “累计”的概念,例如从xxx时候到目前共累计xxxx 这样的需求。例如邮件数量,可以用 LAST 来表示 30 分钟内总共收到多少个邮件。
新建一个测试脚本,可以看下这五类的区别:
total_input_traffic = 0 total_output_traffic = 0 starttime=`date +%s` endtime=`echo "$starttime+31536000"|bc` while true: total_input_traffic = $RANDOM total_output_traffic = $RANDOM /usr/bin/rrdtool updatev /opt/rrdtool/COUNTER/eth0.rrd $starttime:$total_input_traffic:$total_output_traffic /usr/bin/rrdtool updatev /opt/rrdtool/DERIVE/eth0.rrd $starttime:$total_input_traffic:$total_output_traffic /usr/bin/rrdtool updatev /opt/rrdtool/ABSOLUTE/eth0.rrd $starttime:$total_input_traffic:$total_output_traffic /usr/bin/rrdtool updatev /opt/rrdtool/GAUGE/eth0.rrd $starttime:$total_input_traffic:$total_output_traffic if $starttime>=$endtime break; starttime+=300
<br />
注:
1、这里是每五分钟取一次数据,一共取一年的数据。具体测试时,可以减小时间差和step步长。
2、这里的脚本也可以使用python time、random、python-rrdtool模块进行操作。时间差可以使用int(time.strftime(‘%s’)) + 1000 这样计算。
1、COUNTER
<a href="https://www.361way.com/wp-content/uploads/2015/01/counter.png"><img src="https://www.361way.com/wp-content/uploads/2015/01/counter.png" alt="counter" width="661" height="261" class="alignnone" /></a>
获取的是随机值,就存在后面value比前value值小,如公式说明:(2000-3000)/300(setup)=UNKNOWN/300=UNKNOWN ,所以图会断断续续的。
2、DERIVE
<a href="https://www.361way.com/wp-content/uploads/2015/01/derive.png"><img src="https://www.361way.com/wp-content/uploads/2015/01/derive.png" alt="derive" width="556" height="229" class="alignnone" /></a>
DERIVE除了支持是递增,也递减。所以这里显示的也是断断续续的。
3、ABSOLUTE
<a href="https://www.361way.com/wp-content/uploads/2015/01/ABSOLUTE.png"><img src="https://www.361way.com/wp-content/uploads/2015/01/ABSOLUTE.png" alt="ABSOLUTE" width="458" height="241" class="alignnone" /></a>
4、GAUGE
<a href="https://www.361way.com/wp-content/uploads/2015/01/GAUGE.png"><img src="https://www.361way.com/wp-content/uploads/2015/01/GAUGE.png" alt="GAUGE" width="559" height="256" class="alignnone" /></a>
四、rrdtool graph
rrdtool graph COUNTER/day.png -w 700 -h 200 \ -n TITLE:11:'/opt/rrdtool/wdjt.ttf' \ -n UNIT:8:'/opt/rrdtool/simhei.ttf' \ -n LEGEND:8:'/opt/rrdtool/simhei.ttf' \ -c SHADEA#DDDDDD \ -c SHADEB#808080 \ -c FRAME#006600 \ -c FONT#006699 \ -c ARROW#FF0000 \ -c AXIS#000000 \ -c BACK#FFFFFF \ -Y -X 3 \ -t "服务器流量统计" -v "流量" \ --start -1d --end now \ --x-grid MINUTE:12:HOUR:1:HOUR:1:0:'%H' \ DEF:value1=COUNTER/eth0.rrd:eth0_in:AVERAGE \ DEF:value2=COUNTER/eth0.rrd:eth0_out:AVERAGE \ CDEF:value3=value1,value2,+ \ COMMENT:" \n" \ COMMENT:" \n" \ AREA:value1#00ff00:上传 \ GPRINT:value1:LAST:"当前\:%8.0lf" \ GPRINT:value1:AVERAGE:"平均\:%8.0lf" \ GPRINT:value1:MAX:"最大\:%8.0lf" \ GPRINT:value1:MIN:"最小\:%8.0lf" \ COMMENT:" \n" \ LINE2:value2#4433ff:下载 \ GPRINT:value2:LAST:"当前\:%8.0lf" \ GPRINT:value2:AVERAGE:"平均\:%8.0lf" \ GPRINT:value2:MAX:"最大\:%8.0lf" \ GPRINT:value2:MIN:"最小\:%8.0lf" \ COMMENT:" \n" \ COMMENT:"─────────────────────────────────────────────\n" \ LINE3:value3#ff8833:总流量 \ COMMENT:" \n" \ HRULE:350000#ff0000:"报警值" \ COMMENT:" \n" \ COMMENT:"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t最后更新 \:$(date '+%Y-%m-%d %H\:%M')\n" -Y \ COMMENT:"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t系统运维部开发与维护\n"
<br />
概念说明:
1、#分别是 LINE1|2|3,也就是线条的粗细。
2、”–x-grid MINUTE:15:HOUR:1:HOUR:1:0:’%H'”说明如下:
- #GTM:GST:控制次要格网线的位置。GTM 是一个时间单位,可以是 SECOND、MINUTE、HOUR、DAY 、WEEK、MONTH、YEAR 。GST 则是一个数字,控制每隔多长时间放置一根次要格线。例如我们要画一个1天的图表,决定每15分钟一根次要网格线,则格式为 MINUTE:15
- #MTM:MST:控制主要网格线的位置。MTM 同样是时间单位,MST 是一个数字。接上面的例子,决定一个小时1根主要网格线。则格式为 HOUR:1
- #LTM:LST :控制每隔多长时间输出一个label 。决定为1小时1个 label 。则格式为 HOUR:1:0(不清楚0做什么用) ,如10 11 12 13
- #LPR:LFM:LTM:LST只是决定了label的显示位置了,没有指定要显示什么内容。LPR指的是如何放置label。如果LPR为0,则数字对齐格线(适用于显示时间)。如果不为0,则会做一些偏移(适用于显示星期几、月份等)。至于LFM则需要熟悉一下date命令的参数,常用的有%a(星期几)、%b(月份)、%d(天)、%H(小时)、%M(分)、%Y(年)。我们决定显示小时和分,所以用%H%M,最好将’%H:%M’括起来,哪只显示小时就’%H’。
<br />
3、”-Y -X 0 “说明如下:
- Y轴还有一个很方便的选项就是–Y,它可以最大限度的优化Y轴的刻度,建议每次绘图都加上去。
- Y轴另外一个有用的选项就是–X(虽然选项名是-X,但确实是用来设置Y轴刻度值的)。在上面的图我们看到RRDtool自动对Y轴的值进行调整,以k为单位显示。但如果你不想以k显示,而是想固定以某个单位来显示(M,b)该怎么办呢?这就要用到–X选项了。-X后面跟一个参数,参数值范围是-18、-15、-12、-9、-6、-3、0、3、6、9、12、15、18。0表示以原值显示,3表示数值除以1000,也就是以k为单位显示,6就是以M显示,9就是以G显示,12则T。如果你给出1或者2,则RRDtool也可以接受,但会被“静悄悄”的改为0。下面就是一个以原值(-X0)显示原始数据,100k显示 为100000。
<br />
4、字体参数说明
-n TITLE:12: simhei.ttf #修改top标题字体 -n AXIS:8: simhei.ttf #修改X轴数据字体,如01 02 03 04... -n LEGEND:10: simhei.ttf #修改数字报表字体,如最大、最小、平均值及其它 -n UNIT:8: simhei.ttf #修改Y轴标题字符,如"流量" -n WATERMARK:8: simhei.ttf #数据区右则字体,如"RRDTOOL-TOBIOETIKER"
<br />
5、HRULE:100000#ff0000:”报警值”
绘制一根水平线,在 100k 处画一根水平线,并指出这是报警值
6、COLOR参数说明
-c SHADEA#CCCCCC #左上边框color -c SHADEB#000000 #右下边框color -c FRAME#EEEEEE #数据标志说明边框color,如"上传"左边的小正方形。 -c FONT#006699 #图形所有字体color -c ARROW#FF0000 #两个箭头color -c AXIS#FF0099 #两条箭头线color -c BACK#FFFFFF #图形背景(不含数据区)color -c CANVAS#000000 #图形数据区背景color -c MGRID#ee2359 #主网格线color -c GRID#FF0000 #次网格线color
<br />
参考文章:http://bbs.chinaunix.net/viewthread.php?tid=864861&extra=&highlight=rrdtool&page=1