linux中 snmp及rrdtool和cacti安装及使用
- SNMP定义:
- SNMP版本:
- SNMP监控对象:
- SNMP报文总计有5类:
- get OID:获取某个OID对应的值。
- get next:子节点上所有信息(只能在末端的上层使用)
- getbulk (v2或者V3)获取从某个OID开始,之下的OID对应的值。
- set 设置某个OID的值
- get response
- centos下开启snmp管理和代理的功能。
- 验证和使用snmp的相关信息
- 上面的默认配置我们先不进行改动,可以使用net-snmp和net-snmp-utils 来进行验证。先开启snmpd的服务
- 修改配置文件,获取自己想要的相关信息。
- RRDTOOL:
- RRD的解释:rrd是指一个圆周数据库,每个数据的存储点和数据的最大值已在最初的时候被限定,每次更新的时候,将数据插入对应的槽里面即可。
- 把上文用snmp获取到的磁盘,内存,cpu,等信息用rratool进行存储,且归档,分5分钟,15分钟和30分钟归档。
- 然后编写脚本,进行数据更新。
- 将脚本赋予执行权限,且放到定时任务中,每五分钟执行一次.
- 内存使用情况:内存大小,swap总量,内存总量,内存已使用量,内存未使用量,内存Buffter量,内存cached量。
- 创建rrd文件,数据源为内存大小,swap大小,内存可用大小,swap可用大小,内存buffter大小,内存cached大小
- [root@rhel5-2 ~]# rrdtool create mem.rra DS:memtotal:GAUGE:600:U:U DS:swaptotal:GAUGE:600:U:U DS:memfree:GAUGE:600:U:U DS:swapfree:GAUGE:600:U:U DS:buffer:GAUGE:600:U:U DS:cached:GAUGE:600:U:U RRA:AVERAGE:0.5:1:800 RRA:AVERAGE:0.5:6:2400 RRA:AVERAGE:0.5:24:1200 RRA:MAX:0.5:1:800 RRA:MAX:0.5:6:2400 RRA:MAX:0.5:24:1200 RRA:MIN:0.5:1:800 RRA:MIN:0.5:6:2400 RRA:MIN:0.5:24:1200
- 编写脚本,进行数据更新:
- 创建rrd文件,数据源为内存大小,swap大小,内存可用大小,swap可用大小,内存buffter大小,内存cached大小
- 将脚本放到定时运行中.每五分钟运行一次.
- 从.rra数据中获取数据:fetch
- cacti安装及使用,cacti是一款基于rrdtool的绘图监控软件,可以用来监控众多的资源,并且官方论坛有很多插件可以使用,完全没必要自己写监控模板,易用性更好。更方便。
- 安装参考官方文档:网址:http://docs.cacti.net/manual:088:1_installation.1_install_unix 简洁说下我自己的安装,由于是在虚拟机底下操作,所以很多安全性没有兼顾。下面简单说下。
- 配置PHP:
- 关闭Safe Mode,由于cacti使用外部的命令,如rrdtool,所以需要关闭Safe Mode ,在/etc/php.ini里面改成safe_mode = Off
- 配置时区,我第一次安装的时候没有参考配置手册,时区没有改,一直无法安装成功,最后打开了php的调试模式才找到问题所在。修改如下,在中国的一般用Asia/Shanghai即可。
- 允许上传文件,由于导入模板需要用到上传文件的功能。找到以下内容,去掉注释即可。
- php其他的配置由于采用yum安装,会自动配置好,就不用配置了。如果不是采用yum安装的,还需要配置php的xml,pcre,mysql,xml的扩展参数。
- 配置httpd,主要有两点,第一就是httpd要能将php给php的模块处理,还有就是cacti所在的目录能够被访问到。
- 由于使用yum 安装的php,那么默认就会将php的扩展给装好。php是以httpd的一个模块存在的,省去了很多配置的问题。
- 我们这里直接采用httpd默认的安装目录/var/www/html作为cacti的父目录,由于默认配置里面已经配置了,就可以不用配置。
- httpd访问可能存在防火墙或者selinux的限制,所以关闭iptables和selinux。
- 配置snmp,上面已经讲的很清楚了。
- 配置mysql,将刚才装的mysql装个密码,由于mysql版本比较低,默认密码为空,如果是mysql5.5以上,默认密码会在错误日志里面。将其找到,然后进行密码修改,这里版本比较低,直接进行密码修改。
- 好了,前面的准备工作做好了,正式开始安装cacti
- 将cacti的安装文件放在httpd的网页目录下我这里是/var/www/html
- 创建数据库
- 导入数据库
- 创建cacti的mysql数据库和密码并且给其授权
- 配置cacti安装文件的路径和数据库密码等。
- 配置cacti里面的文件权限,我这里将cacti的目录权限全部改成apache,这样方便一些。
- 将poller.php放进自动执行任务列表里面。(poller的用处,用来执行获取监控数据的程序,poller是单线程的任务,如果监控数量比较多,建议换成Spine )
- 启用httpd,输入127.0.0.1/cacti即可运行了。
- 使用cacti模板,监控对应的对象。我们这里提供两个主机,一个 windows xp ip为192.168.8.13 由于windows xp是网上下的ghost版本,安装不了snmp的服务,缺少一些文件,所以用192.168.8.10,2012 r2的服务器替代。,一个centos的主机192.168.8.21,我们用cacti分别监控着两个主机的cpu利用率,内容利用率,磁盘利用率和网络情况。
- 先监控windows的cpu利用率,内存利用率,磁盘利用率和网络利用率。监控模板和方法参考以下资料
- 安装windows snmp的代理软件和 snmp-informant-standard v1.7
- 首先在12 r2上面添加snmp的服务器,且安装snmp-informant-ST,且配置snmp的community和访问权限。配置方法如下图,
- 导入cacti关于windos监控的模板
- 下载模板 wget https://github.com/mrlesmithjr/cacti/archive/master.zip 这个是一个git上面的对应的监控模板,好处是这个有主机模板,我也没有用过,不知道怎么样,我们来一起用下。
- 按照说明文档进行安装:
- 监控linux 主机的模板也一样,到网上找相应的模板,在被监控机上安装snmp,配置snmp的信息。然后利用相应的模板监控对应的资源即可。
- 自己利用上面的snmp获取的信息,自己写监控的模板。就以内存为例。将上面获取的内存大小,swap总量,内存总量,内存已使用量,内存未使用量,内存Buffter量,内存cached量。数据进行保存,且绘制成图片。
- 先进行数据查询:参考上面的代码,编写获取数据的脚本。
- cacti中添加date input methods。具体的配置如下,先添加input type为script/command的类型,然后输入input string 然后配置input fileds 和output fields.
- 接着配置date templates ,date input method选刚才我们新建的那个。注意date source item中的internal data source name一定要跟脚本输出的名字一样,且跟output field一一对应,这样才不会错。
- 然后配置graph templates : 我为这个数据源,配置了两个图形模板,一个是 ram的,一个是swap的。
- 然后添加数据源,添加主机图形,就可以看到了。
简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个
应用层协议(application layer protocol)、数据库模型(database schema)和一组资源对象。该协议能够支持网络管理系统,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。该协议是互联网工程工作小组(IETF,Internet Engineering Task Force)定义的internet协议簇的一部分。SNMP的目标是管理互联网Internet上众多厂家生产的软硬件平台,因此SNMP受Internet标准网络管理框架的影响也很大。SNMP已经出到第三个版本的协议,其功能较以前已经大大地加强和改进了。
来自百度百科。
V1:三种模式:1、ro 只读模式 2、RW 读写模式 3、trap模式 agent主动通知NMS。
V2:认证加强,采用community-string-based也称为V2C
V3:认证更加加强,数据传输使用加密方式。
MIB库里面定义被监控的对象,OID采用树形结构来定义:其中1.3.6.1是用来定义internet的。1.3.6.1.2.1为mib-2 的标准库,里面包含了system,interface,at(address translation),ip,icmp,tcp,udp,egp等相关的信息定义,在linux中就可以直接使用,不用再去定义和实现。只谈internet时候:{1.3.6.1.2.1}等同于{internet(1).2.1} 也就是mib-2
LINUX下提供SNMP功能的主要是两个包:net-snmp(agent)是snmp的代理实现,net-snmp-utils(NMS-comand) 管理端命令行。
我们在测试的情况下本机即作为代理,又作为管理端,所以两个软件都装。直接利用yum install net-snmp net-snmp-utils -y
然后进行配置。net-snmp的配置文件在/etc/snmp/snmp.conf和/etc/snmp/smtptrap.conf两个配置文件
我们先来配置/etc/snmp/snmp.conf
先定义密码,community就是指密码,source定义访问源,可以定义为其他的网络,sec.name就是指密码的名称,后面会用到。
下面的组配置 groupname就是组名称 sercuitymodel指加密版本v1还是v2c,sercurityname就是定义这个组使用哪个密码配置。
接着定义可以查看的MIB的选项,name对此view定义一个别名组,后面的授权访问会用到。subtree就是使用MIB的OID。
access定义了访问选项 group定义了访问的组,ace.model指访问版本,read 是指哪些MIB是允许读取的,write是指哪些MIB是允许写入数据的。notif哪些是运行主动通知的。
这里定义了community为public的密码可以访问.1.3.6.1.2.1.1 根据上图就是可以查看系统相关信息,以及.1.3.6.1.2.1.6tcp的相关信息
service snmpd start
然后分别查看系统和网络的相关信息
查看系统相关的:snmpwalk -v 2c -c public 192.168.8.21 system
查看TCP相关的:[root@rs1 snmp]# snmpwalk -v 2c -c public 192.168.8.21 tcp
也可以使用:[root@rs1 snmp]# snmpwalk -v 2c -c public 192.168.8.21 查看所有的SNMP信息。
[root@rs1 snmp]# snmpwalk -v 2c -c public 192.168.8.21 system SNMPv2-MIB::sysDescr.0 = STRING: Linux rs1.loony 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (51348017) 5 days, 22:38:00.17 SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf) SNMPv2-MIB::sysName.0 = STRING: rs1.loony SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf) SNMPv2-MIB::sysORLastChange.0 = Timeticks: (13) 0:00:00.13 SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDMIBObjects.3.1.1 SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching. SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching. SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB. SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP. SNMPv2-MIB::sysORUpTime.1 = Timeticks: (12) 0:00:00.12 SNMPv2-MIB::sysORUpTime.2 = Timeticks: (12) 0:00:00.12 SNMPv2-MIB::sysORUpTime.3 = Timeticks: (12) 0:00:00.12 SNMPv2-MIB::sysORUpTime.4 = Timeticks: (12) 0:00:00.12 SNMPv2-MIB::sysORUpTime.5 = Timeticks: (12) 0:00:00.12 SNMPv2-MIB::sysORUpTime.6 = Timeticks: (12) 0:00:00.12 SNMPv2-MIB::sysORUpTime.7 = Timeticks: (12) 0:00:00.12 SNMPv2-MIB::sysORUpTime.8 = Timeticks: (13) 0:00:00.13 | [root@rs1 snmp]# snmpwalk -v 2c -c public 192.168.8.21 tcp TCP-MIB::tcpRtoAlgorithm.0 = INTEGER: other(1) TCP-MIB::tcpRtoMin.0 = INTEGER: 200 milliseconds TCP-MIB::tcpRtoMax.0 = INTEGER: 120000 milliseconds TCP-MIB::tcpMaxConn.0 = INTEGER: -1 TCP-MIB::tcpActiveOpens.0 = Counter32: 6898 TCP-MIB::tcpPassiveOpens.0 = Counter32: 5665 TCP-MIB::tcpAttemptFails.0 = Counter32: 2800 TCP-MIB::tcpEstabResets.0 = Counter32: 60 TCP-MIB::tcpCurrEstab.0 = Gauge32: 3 TCP-MIB::tcpInSegs.0 = Counter32: 1495648 TCP-MIB::tcpOutSegs.0 = Counter32: 1499951 TCP-MIB::tcpRetransSegs.0 = Counter32: 1847 TCP-MIB::tcpConnState.0.0.0.0.22.0.0.0.0.0 = INTEGER: listen(2) TCP-MIB::tcpConnState.0.0.0.0.111.0.0.0.0.0 = INTEGER: listen(2) TCP-MIB::tcpConnState.0.0.0.0.11211.0.0.0.0.0 = INTEGER: listen(2) TCP-MIB::tcpConnState.0.0.0.0.50799.0.0.0.0.0 = INTEGER: listen(2) TCP-MIB::tcpConnState.127.0.0.1.25.0.0.0.0.0 = INTEGER: listen(2) TCP-MIB::tcpConnState.127.0.0.1.199.0.0.0.0.0 = INTEGER: listen(2) TCP-MIB::tcpConnState.127.0.0.1.631.0.0.0.0.0 = INTEGER: listen(2) TCP-MIB::tcpConnState.192.168.8.21.22.192.168.8.1.38980 = INTEGER: established(5) TCP-MIB::tcpConnState.192.168.8.21.22.192.168.8.1.60101 = INTEGER: established(5) TCP-MIB::tcpConnState.192.168.8.21.22.192.168.8.148.49217 = INTEGER: established(5) TCP-MIB::tcpConnLocalAddress.0.0.0.0.22.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnLocalAddress.0.0.0.0.111.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnLocalAddress.0.0.0.0.11211.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnLocalAddress.0.0.0.0.50799.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnLocalAddress.127.0.0.1.25.0.0.0.0.0 = IpAddress: 127.0.0.1 TCP-MIB::tcpConnLocalAddress.127.0.0.1.199.0.0.0.0.0 = IpAddress: 127.0.0.1 TCP-MIB::tcpConnLocalAddress.127.0.0.1.631.0.0.0.0.0 = IpAddress: 127.0.0.1 TCP-MIB::tcpConnLocalAddress.192.168.8.21.22.192.168.8.1.38980 = IpAddress: 192.168.8.21 TCP-MIB::tcpConnLocalAddress.192.168.8.21.22.192.168.8.1.60101 = IpAddress: 192.168.8.21 TCP-MIB::tcpConnLocalAddress.192.168.8.21.22.192.168.8.148.49217 = IpAddress: 192.168.8.21 TCP-MIB::tcpConnLocalPort.0.0.0.0.22.0.0.0.0.0 = INTEGER: 22 TCP-MIB::tcpConnLocalPort.0.0.0.0.111.0.0.0.0.0 = INTEGER: 111 TCP-MIB::tcpConnLocalPort.0.0.0.0.11211.0.0.0.0.0 = INTEGER: 11211 TCP-MIB::tcpConnLocalPort.0.0.0.0.50799.0.0.0.0.0 = INTEGER: 50799 TCP-MIB::tcpConnLocalPort.127.0.0.1.25.0.0.0.0.0 = INTEGER: 25 TCP-MIB::tcpConnLocalPort.127.0.0.1.199.0.0.0.0.0 = INTEGER: 199 TCP-MIB::tcpConnLocalPort.127.0.0.1.631.0.0.0.0.0 = INTEGER: 631 TCP-MIB::tcpConnLocalPort.192.168.8.21.22.192.168.8.1.38980 = INTEGER: 22 TCP-MIB::tcpConnLocalPort.192.168.8.21.22.192.168.8.1.60101 = INTEGER: 22 TCP-MIB::tcpConnLocalPort.192.168.8.21.22.192.168.8.148.49217 = INTEGER: 22 TCP-MIB::tcpConnRemAddress.0.0.0.0.22.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnRemAddress.0.0.0.0.111.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnRemAddress.0.0.0.0.11211.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnRemAddress.0.0.0.0.50799.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnRemAddress.127.0.0.1.25.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnRemAddress.127.0.0.1.199.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnRemAddress.127.0.0.1.631.0.0.0.0.0 = IpAddress: 0.0.0.0 TCP-MIB::tcpConnRemAddress.192.168.8.21.22.192.168.8.1.38980 = IpAddress: 192.168.8.1 TCP-MIB::tcpConnRemAddress.192.168.8.21.22.192.168.8.1.60101 = IpAddress: 192.168.8.1 TCP-MIB::tcpConnRemAddress.192.168.8.21.22.192.168.8.148.49217 = IpAddress: 192.168.8.148 TCP-MIB::tcpConnRemPort.0.0.0.0.22.0.0.0.0.0 = INTEGER: 0 TCP-MIB::tcpConnRemPort.0.0.0.0.111.0.0.0.0.0 = INTEGER: 0 TCP-MIB::tcpConnRemPort.0.0.0.0.11211.0.0.0.0.0 = INTEGER: 0 TCP-MIB::tcpConnRemPort.0.0.0.0.50799.0.0.0.0.0 = INTEGER: 0 TCP-MIB::tcpConnRemPort.127.0.0.1.25.0.0.0.0.0 = INTEGER: 0 TCP-MIB::tcpConnRemPort.127.0.0.1.199.0.0.0.0.0 = INTEGER: 0 TCP-MIB::tcpConnRemPort.127.0.0.1.631.0.0.0.0.0 = INTEGER: 0 TCP-MIB::tcpConnRemPort.192.168.8.21.22.192.168.8.1.38980 = INTEGER: 38980 TCP-MIB::tcpConnRemPort.192.168.8.21.22.192.168.8.1.60101 = INTEGER: 60101 TCP-MIB::tcpConnRemPort.192.168.8.21.22.192.168.8.148.49217 = INTEGER: 49217 TCP-MIB::tcpInErrs.0 = Counter32: 0 TCP-MIB::tcpOutRsts.0 = Counter32: 3028 TCP-MIB::tcpConnectionState.ipv4."192.168.8.21".22.ipv4."192.168.8.1".38980 = INTEGER: established(5) TCP-MIB::tcpConnectionState.ipv4."192.168.8.21".22.ipv4."192.168.8.1".60101 = INTEGER: established(5) TCP-MIB::tcpConnectionState.ipv4."192.168.8.21".22.ipv4."192.168.8.148".49217 = INTEGER: established(5) TCP-MIB::tcpConnectionProcess.ipv4."192.168.8.21".22.ipv4."192.168.8.1".38980 = Gauge32: 7794 TCP-MIB::tcpConnectionProcess.ipv4."192.168.8.21".22.ipv4."192.168.8.1".60101 = Gauge32: 7658 TCP-MIB::tcpConnectionProcess.ipv4."192.168.8.21".22.ipv4."192.168.8.148".49217 = Gauge32: 47690 TCP-MIB::tcpListenerProcess.ipv4."0.0.0.0".22 = Gauge32: 1662 TCP-MIB::tcpListenerProcess.ipv4."0.0.0.0".111 = Gauge32: 1311 TCP-MIB::tcpListenerProcess.ipv4."0.0.0.0".11211 = Gauge32: 54954 TCP-MIB::tcpListenerProcess.ipv4."0.0.0.0".50799 = Gauge32: 1398 TCP-MIB::tcpListenerProcess.ipv4."127.0.0.1".25 = Gauge32: 1746 TCP-MIB::tcpListenerProcess.ipv4."127.0.0.1".199 = Gauge32: 12021 TCP-MIB::tcpListenerProcess.ipv4."127.0.0.1".631 = Gauge32: 1480 TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".22 = Gauge32: 1662 TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".80 = Gauge32: 58869 TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".111 = Gauge32: 1311 TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".3306 = Gauge32: 57764 TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".11211 = Gauge32: 54954 TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00".53816 = Gauge32: 1398 TCP-MIB::tcpListenerProcess.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:01".631 = Gauge32: 1480 [root@rs1 snmp]# |
在监控中,我们比较关注主机的相关信息,例如内存,swap,存储,等信息,我们通过修改配置文件来获取。
首先找到mib-2库中25代表主机。那么我们直接开启这个访问,修改
/etc/snmp/snmpd.conf里面的view systemview included .1.3.6.1.2.1.25.1.1改成:
view systemview included .1.3.6.1.2.1.25
这样就可以通过snmpwalk来获取相关HOST的信息了。
[root@rs1 snmp]# snmpwalk -v 2c -c public 192.168.8.21 host
不过貌似hrsw的信息太多了,也就是软件的信息。所以要想办法过滤下。我们并不需要软件的信息。
感觉这个过滤很麻烦,然后用上万能的百度大法(虽然我想用谷歌的)。
查到到cpu和内存相关的如下:
来自 <http://www.cnblogs.com/aspx-net/p/3554044.html#commentform>
|
来自 <http://www.cnblogs.com/aspx-net/p/3554044.html#commentform> 注:.1.3.6.1.4.1.2021.9.1里面的信息,必须在snmpd.conf里面进行授权 通过disk进行授权, |
|
看了下都是.1.3.6.1.4.1下面的相关信息,果断在/etc/snmp/snmpd.config 里面的的添加view内容
然后重启snmpd:service snmpd restart
这样可以获取到:cpu信息如下,分别为cpu空闲,系统使用率和用户使用率。
内存相关信息:依次为:内存大小,swap总量,内存总量,内存已使用量,内存未使用量,内存Buffter量,内存cached量
获取磁盘信息:上面的磁盘信息获取的有问题,继续百度.
获取到OID的是.1.3.6.1.2.1.25.2.3.1
把虽有的对应的1后面的信息累加起来就是一套完整的信息了
1 | hrstorageram:Physical memory:units=1024bytes:size=1012352 | 这个就是物理内存总数1012353K |
2 | hrstoragevirtualmemory:virtual memory:units=1024bytes:size=258208 | 这个就是虚拟内存总数=物理内存+swap |
10 | hrstoragevirtualmemory:swap space:units=1024bytes:size=1572856 | swap的大小1572856k |
31 | htsoragefixeddisk:/:units=4096:size=3356140 | /根分区的大小 3346140X4=13384560K |
35 | htsoragefixeddisk:/dev/shm:units=4096:size=126544 | /dev/shm大小为 126544X4=506176K |
36 | htsoragefixeddisk:/boot:units=1024:size=495844 | /boot分区大小为 495844X1=495844 |
相应的可以看到,我们没有获取到磁盘的使用率,继续百度。
可以看到使用的大小,那么一比较就可以知道使用率了.
参考链接:RRD简体中文教程 、rrdtool学习笔记
rrd中数据存储模式:先存储pdp的数据,然后再根据cf运算对pdp进行运算后,将数据存储到cdp里面去,我们画图和使用就使用cdp的数据,所以事先要定义好pdp的ds数据源和cf的cdp的数据。
用法:rrdtool create filename [--start|-b start time] [--step|-s step]
[DS:ds-name:DST:dst arguments]
[RRA:CF:cf arguments]
其中:DS如下:
[DS:ds-name:DST:heartbeat:min:max]
// DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
RRA如下:
RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows
参数:filename:rra的文件名,默认为.rra结尾。
--start|-b start time:第一个记录的时间,小于这个时间的记录RRD不会记录。时间是timestamp格式。默认为当前时间的10秒后。如果你需要一天前的时间可以这么定义。-b $($date -d '1 days ago' +%s).
--step|-s:指步长,就是pdp里面每个槽位的时间差,默认是300S,
DS:ds-name:DST:dst arguments:DS 指明定义数据源,ds-name就是数据源的名字,DST指明数据源的类型,nts包含以下几类:1、COUNTER:只记录差值,只增\GUAGE:原始值,不做更改\DERIVE:累加,可增、可减。\ABSOLUTE:相对初始值,\COMPUTE:COMPUTE 比较特殊,它并不接受输入,它的定义是一个表达式,能够引用其他DS并自动计算出某个值。例如 :DS:eth0_bytes:COUNTER:600:0:U DS:eth0_bits:COMPUTE:bytes,8,* 则值eth0_bytesX8为实际存储eth0_bits的值。
『
COUNTER/DERIVE/AVSOLVTE 虽然都是取差值,但会再除以两次间隔间的秒数。
例,两次间隔间为300秒,那画出来的就是 2/300,-2/300 的值
Values = 300, 600, 900, 1200 实际值输入值(每隔300S输入一个)
Step = 300 seconds 刷新周期
COUNTER DS = 1, 1, 1, 1 COUNTER定义的DS的值
DERIVE DS = 1, 1, 1, 1 DERIVE定义的DS的值
ABSOLUTE DS = 1, 2, 3, 4 ABSOLUTE定义的DS的值
GAUGE DS = 300, 600, 900, 1200 GAUGE定义的DS的值
来自 <http://www.cnblogs.com/frankliiu-java/articles/1663818.html>
』
dst arguments=heartbeat:min:max,heartbeat:指槽位在多少时间内接受数据有效,min,max:最小值和最大值。
RRA:定义归档的数据
CF:指pdp到cdp的运算类型。
CF三种类型:AVERAGE,MIN,MAX,LAST.依次为下面steps个槽位内pdp中数据的平均值,最小值,最大值和最后一个值。
cf arguments:CF的具体参数.
xff:steps:rows
xff:0-1的数字,表示多少比例内的unkown可以进行正常的CF,超过后直接unkown.
steps:多少个槽位的pdp进行cf合成一个cdp.
rows:总共存储多少位cdp。stpsXpdp的stepsXrows就是总存储时间。
[root@rhel5-2 ~]# rrdtool create rootdisk.rra DS:total:GAUGE:600:U:U DS:used:GAUGE:600:U:U RRA:AVERAGE:0.5:1:8640 RRA:MAX:0.5:6:8640 RRA:MIN:0.5:6:8640 RRA:MAX:0.5:12:8640 RRA:MIN:0.5:12:8640
#!/bin/bash
Host=localhost
Community=public
Total=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.9 | grep Total\.1.*INTEGER.* | sed -r 's@^.*INTEGER:[[:space:]]@@g'`
Used=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.9 | grep dskUsed\.1.*INTEGER.* | sed -r 's@^.*INTEGER:[[:space:]]@@g'`
#echo $Total \n $Used
/usr/bin/rrdtool update /root/rootdisk.rra N:"$Total":"$Used"
echo N:"$Total":"$Used"
[root@rhel5-2 ~]# cat memrraupdate.sh
#!/bin/bash
Host=localhost
Community=public
Snmpdate=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4`
Ramtotal=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep memTotalReal.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
Swaptotal=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep TotalSwap.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
Ramfree=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep AvailReal.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
Swapfree=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep AvailSwap.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
Buffer=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep Buffer.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
Cached=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep Cached.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
/usr/bin/rrdtool update /root/mem.rra N:"$Ramtotal":"$Swaptotal":"$Ramfree":"$Swapfree":"$Buffer":"$Cached"
rrdtool fetch filename CF [--resolution|-r resolution] [--start|-s start] [--end| -e end]
其中cf的类型必须是rra中有的才行。要想读取rra中的数据,有两个条件要满足:
1、时间范围。
2、解析度要求。如果解析度不够,会默认输出已存在的大于给定解析度上一档的解析度。
如果不指定--start --end -r 则默认输出reslolution最小的RRA数据。
我用的系统是Linux rhel5-2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
所以安装官方文档安装如下的软件包:
其中由于不使用ldap的相关的认证,所以没有安装。所有软件都是yum安装的。
yum install -y httpd php php-mysql php-snmp php-xml mysql mysql-server net-snmp net-snmp-utils
安装好之后就可以根据文档配置相关的环境了。
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Asia/Shanghai"
file_uploads = On
service iptables stop
setenforce 0
service mysqld start
shell> mysqladmin --user=root password somepassword
shell> mysqladmin --user=root --password reload
然后解压缩安装文件 tar zxcf cacti*.tar.gz
mysqladmin --user=root create cacti
mysql -uroot -p cacti <cacti.sql
grant all on *.cacti to "cactiuser"@"%" identified by 'cactipasswd'
编辑cacti目录下的include/config.php 修改下面的对应项
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";这里就是创建mysql的cacti用户
$database_password = "cacti";这里是创建mysql cacti用户的密码。
/* load up old style plugins here */
$plugins = array();
//$plugins[] = 'thold';
/*
Edit this to point to the default URL of your Cacti install
ex: if your cacti install as at http://serverip/cacti/ this
would be set to /cacti/
*/
$url_path = "/cacti/";这里配置cacti在主机里面的路径,这里我放在了/cacti/下,不用做更改。如果你是直接放在根下.将其改成/即可。
/* Default session name - Session name must contain alpha characters */
#$cacti_session_name = "Cacti";
crontab -e里面添加如下内容:
*/5 * * * * php /var/www/html/cacti/poller.php > /dev/null 2>&1
注意:我这里使用的是root用户来执行poller,所以6步里面的配置cacti的文件权限对此没有影响,因为root可以写入普通用户的文件。如果你上面的文件权限设置为其他用户,这里要做相应的更改。
还有就是频率文件,这里是5分钟运行一次poller,也就是默认300S的步长,如果监控里面的步长有更改,也同样要更改这里的计划任务时间。
且验证是否安装OK。在centos上使用snmpwalk命令进行验证:
[root@rhel5-2 ~]# snmpwalk -v 2c -c public 192.168.8.10
你会看到出现很多滚动的信息,就是代表安装OK了。那么继续配置cacti的相关东西。
将snmp_informant_standard_*.xml 放到/cacat/resource/snmp_queries下,然后导入host的xml文件,再添加device就可以了。下图是画出的图像
还有一个问题就是他网络流量里面没有写接口名称,只写了mac地址,后期需要自己一个一个对起来。
#!/bin/bash
Host=$1
Community=$2
#!/bin/bash
#Host=localhost
#Community=public
/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 > /tmp/cacit-get-mem-tmpfile.txt
Ramtotal=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep memTotalReal.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
Swaptotal=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep TotalSwap.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
Ramfree=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep AvailReal.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
Swapfree=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep AvailSwap.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
Buffer=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep Buffer.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
Cached=`/usr/bin/snmpwalk -v 2c -c $Community $Host .1.3.6.1.4.1.2021.4 | grep Cached.0 |sed -r 's@^.*INTEGER:[[:space:]]@@g' | cut -d" " -f1`
echo -n "Ramtotal:$Ramtotal Ramfree:$Ramfree Swaptotal:$Swaptotal Swapfree:$Swapfree Buffer:$Buffer Cached:$Cached"
#-n为了避免输出的时候自动换行。
将脚本命名为cacti-mem-get.sh 然后赋予执行权限。最后丢到 cacti安装目录下的scripts目录下,更改下属组和属主权限。
inputfiles的配置。一定要注意画红框框的地方,可以用来继承hosttemplates里面的hostname 的值,这样就不用自己手动输入了。
community也是,可以用来继承主机上面的snmp_community的值。
outputfiled的设置。画红线的名字,要跟脚本输出一致。就可以了。
完整的配置如下图。
.
红框里面的纵轴的标签,这个根据实际的值填,由于我的脚本获取的数据的单位是kbyte , 所以我填的是kbyte .如果想进行换算,最好能在脚本里面就换算好,这样比较方便。