调研背景

为满足公司对现网多台服务器进行性能监控,并输出性能监控图,特对几款监控软件进行调研。目前大多数监控软件都要求在服务器上安装相应的监控软件采集数据再进行监控图输出,而公司考虑到业务的稳定性,不能在服务器上安装监控软件。所以在此我重点对RRDtool这款监控绘图工具进行调研,利用shell脚本在服务器上进行监控数据采集,集中传输到另外一个专用于处理监控数据并输出监控图的服务器上,利用rrdtool进行绘图,满足公司对性能监控的要求。

工具介绍

RRDtool 代表 “Round Robin Database tool” ,作者同时也是 MRTG 软件的发明人。许多监控软件如MRTG、Cacti等都是调用RRDtool来进行绘图的。

官方站点位于http://oss.oetiker.ch/rrdtool/ 。 所谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置。我们可以把用于存储数据的数据库的空间看成一个圆,上面有很多刻度。这些刻度所在的位置就代表用于存储数据的地方。所谓指针,可以认为是从圆心指向这些刻度的一条直线。指针会随着数据的读写自动移动。要注意的是,这个圆没有起点和终点,所以指针可以一直移动,而不用担心到达终点后就无法前进的问题。在一段时间后,当所有的空间都存满了数据,就又从头开始存放。这样整个存储空间的大小就是一个固定的数值。RRDtool 就是使用类似的方式来存放数据的工具。

RRDtool的特点:

· 首先 RRDtool 存储数据,扮演了一个后台工具的角色。但同时 RRDtool 又允许创建图表,这使得RRDtool看起来又像是前端工具。其他的数据库只能存储数据,不能创建图表。

· RRDtool 的每个 rrd 文件的大小是固定的,而普通的数据库文件的大小是随着时间而增加的。

· 其他数据库只是被动的接受数据, RRDtool 可以对收到的数据进行计算,例如前后两个数据的变化程度(rate of change),并存储该结果。

· RRDtool 要求定时获取数据,其他数据库则没有该要求。如果在一个时间间隔内(heartbeat)没有收到值,则会用 UNKN (unknow)代替,其他数据库则不会这样。

工具安装

1.下载RRDtool

cd

wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.8.tar.gz

2.安装RRDtool

#请确保已安装了相关的依赖包:zlib libxml2 libxml2-devel glib2 glib2-devel libpng freetype libart_lgpl pango-devel perl-CPAN

#执行以下命令:

BUILD_DIR=/tmp/rrdbuild

INSTALL_DIR=/usr/local/rrdtool-1.4.8

mkdir -p $BUILD_DIR

mv rrdtool-1.4.8.tar.gz $ BUILD_DIR

cd $BUILD_DIR

tar zxvf rrdtool-1.4.8.tar.gz

cd rrdtool-1.4.8

./configure --prefix=$INSTALL_DIR && make && make install

#安装完成后测试,若输出下图表示安装成功:

/usr/local/rrdtool-1.4.8/bin/rrdtool

clip_p_w_picpath002

工具配置

1.前期规划

A.监测对象:10.46.169.24和10.46.169.45等服务器a.ip连接数(connect) b.cpu平均使用率(cpu) c.15分钟系统平均负载(load) d.内存使用率(memory) e.I/O wait的使用率(iowait)

B.数据文件:采用1个rrd文件保存一台服务器所有监控对象的数据,并以服务器的IP来命名,eg. 169-24.rrd

C.数据获取:利用shell来在服务器上获取监测对象的数据,然后将所有服务器的监控数据统一传输到169.24服务器上,10.46.170.155定时利用wget方法去取数据,保存到本地rrd文件中

D.监测频率:15分钟监测一次,监测频率是指多久获取一次监测对象的数据

E.统计频率:15分钟,1小时,1天,统计频率是指利用监测数据来统计不同时间段内监测对象的平均/最大/最小等的值,统计方式依据用户设定

F.绘图方式:曲线

G.脚本规划:a.rrd_create_24.sh(创建rrd文件) b.rrd_update_24.sh(获取监控数据并更新rrd文件) c.rrd_graph_24.sh(绘图)

2.取数脚本部署

A. 在10.46.169.24上部署取数脚本

#以hongcy/hisun账号登录服务器执行以下步骤:

mkdir /web/fjyd/rrdtool

sudo chmod 775 /web/fjyd/rrdtool

sudo chown -R pulei:develop /web/fjyd/rrdtool

mkdir ~/rrdtool

cd ~/rrdtool

vi rrd_getdata.sh

#rrd_getdata.sh内容如下:

############################################

   1:  #!/bin/bash
   2:   
   3:  #此脚本用于获取本服务器上需要监控对象的数值,保存到本地。170.155定时去取数据
   4:  #luyongxiang,2014-02-13
   5:   
   6:  localFile="/web/fjyd/rrdtool/169-24.txt"
   7:   
   8:  #ip连接率
   9:  #获取ip连接数
  10:  connect=`cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count`
  11:  echo $connect > $localFile
  12:   
  13:  #cpu的使用率
  14:  ##获取cpu空闲率
  15:  #cpu_free=`top -b -n 1| sed -n '1,5p'|grep Cpu|awk -F " " '{print $5}'|awk -F "%" '{print $1}'`
  16:  cpu_free=`sar 1 1|grep Average|awk -F " "'{print $8}'`
  17:  ##计算出cpu的使用率
  18:  cpu=$(echo "scale=1;a=100-${cpu_free};if(length(a) == scale(a)) print 0;print a"|bc)
  19:  echo $cpu >> $localFile
  20:   
  21:  #load系统的负载率
  22:  ##获取15分钟内的平均负载
  23:  loadaverage=`uptime|awk -F ","'{print $6}'`
  24:  ##获取cpu的核芯数量
  25:  cpunum=`grep 'model name' /proc/cpuinfo |wc -l`
  26:  ##计算系统的负载率
  27:  load=$(echo "scale=1;b=${loadaverage}*100/${cpunum};if(length(b) == scale(b)) print 0;print b"|bc)
  28:  echo $load >> $localFile
  29:   
  30:  #memory的使用率
  31:  ##memory的总量
  32:  memory_total=`free -t|grep Mem|awk -F " "'{print $2}'`
  33:  memory_use=`free -t|grep 'buffers/cache'|awk -F " "'{print $3}'`
  34:  memory=$(echo "scale=1;c=${memory_use}*100/${memory_total};if(length(c) == scale(c)) print 0;print c"|bc)
  35:  echo $memory >> $localFile
  36:   
  37:  #iowait率
  38:  iowait=`sar -p 3 1|sed -n '5p'|awk -F " "'{print $6}'`
  39:  echo $iowait >> $localFile
  40:   
  41:  exit 0

############################################

#设置cron

0,15,30,45 * * * * /home/hongcy/rrdtool/rrd_getdata.sh

#设置其他服务器数据同步目录

mkdir /home/rsync_data/rrdtool

#编写脚本,定时将同步过来的数据放置到正确的位置

vi /home/hongcy/rrdtool/mv_rrdtool_data.sh

# mv_rrdtool_data.sh内容如下:

############################################

   1:  #!/bin/bash
   2:   
   3:  #此脚本用于定时将其他服务器同步到169.24的性能监控数据放置到相应的目录,以备170.155服务器取用
   4:   
   5:  rsyncDir="/home/rsync_data/rrdtool"
   6:  destDir="/web/fjyd/rrdtool/"
   7:   
   8:  if [ "`/bin/ls -A $rsyncDir`" != "" ];then
   9:      /bin/mv $rsyncDir/* $destDir 
  10:      sudo /bin/chmod 644 $destDir/*
  11:  fi

############################################



#设置脚本权限

sudo /bin/chmod -R 775 ~/rrdtool

sudo /bin/chown -R hongcy:develop ~/rrdtool

#设置cron

5,20,35,50 * * * * /home/hongcy/rrdtool/mv_rrdtool_data.sh

B. 在10.46.169.45上部署取数脚本

#以hongcy账号登录服务器执行以下步骤:

mkdir /home/hongcy/rrdtool

cd /home/hongcy/rrdtool

vi rrd_getdata.sh

#rrd_getdata.sh内容如下:

############################################

   1:  #!/bin/bash
   2:   
   3:  #此脚本用于获取本服务器上需要监控对象的数值,保存到本地。再同步到10.46.169.24服务器上,170.155定时去169.24取数据.
   4:  #luyongxiang,2014-02-13
   5:   
   6:  localFile="/home/hongcy/rrdtool/169-45.txt"
   7:   
   8:  #ip连接率
   9:  #获取ip连接数
  10:  connect=`cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count`
  11:  echo $connect > $localFile
  12:   
  13:  #cpu的使用率
  14:  ##获取cpu空闲率
  15:  cpu_free=`top -b -n 1| sed -n '1,5p'|grep Cpu|awk -F " "'{print $5}'|awk -F "%"'{print $1}'`
  16:  ##计算出cpu的使用率
  17:  cpu=$(echo "scale=1;a=100-${cpu_free};if(length(a) == scale(a)) print 0;print a"|bc)
  18:  echo $cpu >> $localFile
  19:   
  20:  #load系统的负载率
  21:  ##获取15分钟内的平均负载
  22:  loadaverage=`uptime|awk -F ","'{print $6}'`
  23:  ##获取cpu的核芯数量
  24:  cpunum=`grep 'model name' /proc/cpuinfo |wc -l`
  25:  ##计算系统的负载率
  26:  load=$(echo "scale=1;b=${loadaverage}*100/${cpunum};if(length(b) == scale(b)) print 0;print b"|bc)
  27:  echo $load >> $localFile
  28:   
  29:  #memory的使用率
  30:  ##memory的总量
  31:  memory_total=`free -t|grep Mem|awk -F " "'{print $2}'`
  32:  memory_use=`free -t|grep 'buffers/cache'|awk -F " "'{print $3}'`
  33:  memory=$(echo "scale=1;c=${memory_use}*100/${memory_total};if(length(c) == scale(c)) print 0;print c"|bc)
  34:  echo $memory >> $localFile
  35:   
  36:  #iowait率
  37:  iowait=`sar -p 3 1|sed -n '5p'|awk -F " "'{print $6}'`
  38:  echo $iowait >> $localFile
  39:   
  40:  #将数据传输到10.46.169.24
  41:  /usr/bin/rsync -avzrtp $localFile    rsync://backup@10.46.169.24/rsync_data/rrdtool/  --password-file=/home/shell_scripts/backup_rsync.passwd
  42:   
  43:  exit 0

############################################

#设置脚本权限

sudo /bin/chmod -R 774 ~/rrdtool/

sudo /bin/chown -R hongcy:develop ~/rrdtool

#设置cron

0,15,30,45 * * * * /home/hongcy/rrdtool/rrd_getdata.sh

3.rrdtool部署

在10.46.170.155上部署rrdtool:

A. 安装rrdtool

参考前文工具安装部分安装rrdtool

B. 部署监控项目

mkdir -p /usr/local/rrdtool-1.4.8/data/169.24/

cd /usr/local/rrdtool-1.4.8/data/169.24/

#创建以下脚本

#创建24服务器rrd数据库脚本rrd_create_24.sh

#########################################################################

   1:  #!/bin/bash
   2:   
   3:  #此脚本用于创建一个rrd数据库文件,用于保存监控数据
   4:  #luyongxiang,2014-02-11
   5:   
   6:  rrdhome="/usr/local/rrdtool-1.4.8"
   7:  datadir="$rrdhome/data/169.24"
   8:  tooldir="$rrdhome/bin"
   9:  rrdname="169-24.rrd"
  10:  step="900"
  11:  success="Success to create $rrdname."
  12:  error="Error to create $rrdname."
  13:   
  14:  #创建rrd文件,依据step=900秒(即15分钟)进行1/4/96(15分钟/1小时/1天)分别进行统计平均值和最大值,并分别保存672/720/365个(1周/1月/1年)数据。
  15:  #以下数据都以百分比后的值表示,方便在同一张图上显示多个监控对象的曲线图。
  16:  #--step :就是 RRDtool “期望” 每隔多长时间就收到一个值.
  17:  #DS格式:DS申明:存放脚本的结果的变量名:DS类型:1200是heartbeat:0是最小值:655350是最大值
  18:  #DST共有COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE 5种。最大和最小值可以用U代替,表示不限制
  19:  #RRA用于指定数据如何存放。我们可以把一个RRA看成一个表,各自保存不同的统计结果。
  20:  #格式:RRA申明:统计方式:0.5表示一个统计值中的若被用于统计的数据超过0.5倍为UNKNOWN,则统计值为UNKNOWN:1表示几个值用于统计:672表示保存几个值
  21:  #统计方式有AVERAGE,MAX,MIN,LAST。
  22:  createrrd(){
  23:          $tooldir/rrdtool create ${rrdname} --step ${step} \
  24:          DS:connect:GAUGE:1200:0:655350 \
  25:          DS:cpu:GAUGE:1200:0:100 \
  26:          DS:load:GAUGE:1200:0:100 \
  27:          DS:memory:GAUGE:1200:0:100 \
  28:          DS:iowait:GAUGE:1200:0:100 \
  29:          RRA:AVERAGE:0.5:1:672 \
  30:          RRA:AVERAGE:0.5:4:720 \
  31:          RRA:AVERAGE:0.5:96:365 \
  32:          RRA:MAX:0.5:1:672 \
  33:          RRA:MAX:0.5:6:720 \
  34:          RRA:MAX:0.5:144:365
  35:          [ "$?" == 0 ] && return 0 || return 1
  36:  }
  37:  cd $datadir
  38:  if [ ! -f ${rrdname} ]; then
  39:          createrrd
  40:  else
  41:          read -p "$datadir目录下已存在该文件。删除重建该文件请输入数字1,其他输入将退出:" todo
  42:  if [ "$todo" == "1" ] ;then
  43:                  rm -rf $datadir/$rrdname
  44:                  createrrdexit 0
  45:          fi
  46:          exit 1       
  47:  fi

#########################################################################

#创建24服务器rrd数据库数据更新脚本rrd_update_24.sh

#########################################################################


   1:  #!/bin/bash
   2:   
   3:  #更新rrd数据库的数据。请将此脚本放置于crontab内,15分钟执行一次。
   4:   
   5:  rrdhome="/usr/local/rrdtool-1.4.8"
   6:  datadir="$rrdhome/data/169.24"
   7:  tooldir="$rrdhome/bin"
   8:  rrdname="169-24.rrd"
   9:  sourceURL="http://10.46.169.24/rrdtool/169-24.txt"
  10:  sourceData="$datadir/169-24.txt"
  11:   
  12:  cd $datadir
  13:  if [ -f ${rrdname} ]; then
  14:  #下载源数据
  15:          wget $sourceURL
  16:   
  17:  #IP连接数
  18:          connect=`/bin/sed -n '1p' $sourceData`
  19:   
  20:  #cpu的使用率
  21:          cpu=`/bin/sed -n '2p' $sourceData`
  22:   
  23:  #load系统的负载率
  24:          load=`/bin/sed -n '3p' $sourceData`
  25:   
  26:  #memory的使用率
  27:          memory=`/bin/sed -n '4p' $sourceData`
  28:   
  29:  #iowait率
  30:          iowait=`/bin/sed -n '5p' $sourceData`
  31:   
  32:  #更新rrdtool的数据
  33:          ${tooldir}/rrdtool update ${rrdname} N:${connect}:${cpu}:${load}:${memory}:${iowait}
  34:   
  35:  #更新成功后将临时数据清除
  36:          rm -rf $sourceData
  37:   
  38:  #调用绘图程序
  39:          sh $datadir/rrd_graph_24.sh
  40:   
  41:          exit 0
  42:  else
  43:          echo "数据库文件$datadir/$rrdname不存在,请先创建$rrdname文件"
  44:          exit 1
  45:  fi

#########################################################################

#创建24服务器绘图脚本rrd_graph_24.sh

#########################################################################

   1:  #!/bin/bash
   2:   
   3:  #执行绘图
   4:   
   5:  rrdhome="/usr/local/rrdtool-1.4.8"
   6:  datadir="$rrdhome/data/169.24"
   7:  tooldir="$rrdhome/bin"
   8:  rrdname="169-24.rrd"
   9:  #绘制图片的名称
  10:  pngname="169-24.png"
  11:  #绘图时用的开始时间
  12:  starttime=`date -d "-7 day" +%s`
  13:  #绘图时图片的上标题
  14:  title="169.24 系统性能监控"
  15:  #绘图时图片的左标题
  16:  vtitle="使用率(%)"
  17:  #系统允许的最大IP连接数,已切换成百分比[实际连接数*100/maxConnect=实际连接数/(maxConnect/100)]
  18:  maxConnect="655.35"
  19:   
  20:  cd $datadir
  21:   
  22:  ####绘制系统性能监控图
  23:  #--start:设定绘图的开始时间
  24:  #--width/--height:设定图表的大小,即X、Y轴围起来的范围(不是图片的大小)
  25:  #-t:设定上方横向的标题
  26:  #-v:设定左侧纵向的标题
  27:  #DEF:定义数据源,格式--》DEF:自定义名称=rrd数据库文件:DS名称:DS的类型
  28:  #CDEF:v1=t1,$maxConnect,/  将实际的IP连接数转换成IP连接率
  29:  #COMMENT就是用来输出一些字符串。
  30:  #GPRINT 就是在图表的下方输出最大值、最小值、平均值等
  31:  #绘出监控图,格式--》类型:DEF名称:颜色:显示的名称:绘图方式(STACK表示在前一个的基础上绘图)
  32:   
  33:  ${tooldir}/rrdtool graph ${pngname} \
  34:  --start $starttime \
  35:  --width 1090 --height 546 \
  36:  -t "$title" \
  37:  -v "$vtitle" \
  38:  DEF:t1=${rrdname}:connect:AVERAGE \
  39:  DEF:t2=${rrdname}:cpu:AVERAGE \
  40:  DEF:t3=${rrdname}:load:AVERAGE \
  41:  DEF:t4=${rrdname}:memory:AVERAGE \
  42:  DEF:t5=${rrdname}:iowait:AVERAGE \
  43:  CDEF:v1=t1,$maxConnect,/ \
  44:  COMMENT:" \n" \
  45:  COMMENT:'监控项:--------------当前值-----------平均值-----------最大值-----------' \
  46:  COMMENT:" \n" \
  47:  LINE1:v1#00FF00:"IP Connect" \
  48:  GPRINT:t1:LAST:%13.0lf \
  49:  GPRINT:t1:AVERAGE:%13.0lf \
  50:  GPRINT:t1:MAX:%13.0lf \
  51:  COMMENT:" \n" \
  52:  LINE1:t2#F0FF0F:"CPU    Used" \
  53:  GPRINT:t2:LAST:%13.2lf \
  54:  GPRINT:t2:AVERAGE:%13.2lf \
  55:  GPRINT:t2:MAX:%13.2lf \
  56:  COMMENT:" \n" \
  57:  LINE1:t3#FF0000:"System Load" \
  58:  GPRINT:t3:LAST:%13.2lf \
  59:  GPRINT:t3:AVERAGE:%13.2lf \
  60:  GPRINT:t3:MAX:%13.2lf \
  61:  COMMENT:" \n" \
  62:  LINE1:t4#000000:"Memory  Used" \
  63:  GPRINT:t4:LAST:%13.2lf \
  64:  GPRINT:t4:AVERAGE:%13.2lf \
  65:  GPRINT:t4:MAX:%13.2lf \
  66:  COMMENT:" \n" \
  67:  LINE1:t5#4B0082:"iowait Used" \
  68:  GPRINT:t5:LAST:%13.2lf \
  69:  GPRINT:t5:AVERAGE:%13.2lf \
  70:  GPRINT:t5:MAX:%13.2lf \
  71:  COMMENT:" \n" \
  72:  COMMENT:"上次更新\: $(date '+%Y-%m-%d %H\:%M\:%S' -r $rrdname)"

#########################################################################

#修改脚本的权限

chmod 750 /usr/local/rrdtool-1.4.8/data/169.24/*.sh

注意:

------------------------------------------------------------------------

#新增需要监控的服务器169.45,参考工具配置--2--B步骤,在需要监控的服务器上部署取数脚本,#然后将以上rrdtool部署部分B步骤中涉及的169.24改成169.45,

#167-24改成169-45(除了sourceURL中的IP地址10.46.169.24),

#创建相应的脚本rrd_create_45.sh;rrd_update_45.sh;rrd_graph_45.sh

------------------------------------------------------------------------

#创建rrd文件,执行以下步骤

/usr/local/rrdtool-1.4.8/data/169.24/rrd_create_24.sh

/usr/local/rrdtool-1.4.8/data/169.45/rrd_create_45.sh

#创建统一调度所有监控对象更新数据的shell,新增监控服务器则在此shell中插入执行语句

cd /usr/local/rrdtool-1.4.8/data

vi rrd_update.sh

#rrd_update.sh内容如下:

#########################################################################

   1:  #!/bin/bash
   2:   
   3:  #此脚本用于调用所有服务器的rrd绘图数据更新,并绘制监控图
   4:   
   5:  datadir="/usr/local/rrdtool-1.4.8/data/"
   6:  log="rrdupdate.log"
   7:   
   8:  $datadir/169.24/rrd_update_24.sh > $datadir/rrdupdate.log
   9:  $datadir/169.45/rrd_update_45.sh >> $datadir/rrdupdate.log

#########################################################################

#设置cron(为了防止每次执行cron都发送邮件,将执行日志发生到/dev/null)

#########################################################################

10,25,40,55 * * * * /usr/local/rrdtool-1.4.8/data/rrd_update.sh >/dev/null 2>&1

#########################################################################

注意:

1.请先在需要监控的服务器上部署脚本,再在170.155服务器上进行部署。

2.在rrd_create_*.sh,rrd_update_*.sh,rrd_graph_*.sh脚本中涉及到rrdtool创建,插入数据,绘图的时,不能在其中插入注释等。不然会导致报错。


4.绘图结果

#10.46.169.24监控绘图结果

169-24

#10.46.169.45监控绘图结果

169-45