环境说明:
操作系统:Centos 5.8_x86_64
cacti版本:cacti-0.8.8a
spine版本:cacti-spine-0.8.8a

说明:这里只介绍如何安装配置cacti,并不涉及如何配置监控远程主机。


一、安装依赖环境包:

yum install httpd php php-mysql php-snmp mysql mysql-server net-snmp net-snmp-utils php-gd vixie-cron
如果为编译安装apache,需要指定--enable-sockets

yum install rrdtool --nogpgcheck

service mysqld start
service httpd start
service crond start
service snmpd start

chkconfig httpd on
chkconfig mysqld on
chkconfig snmpd on
chkconfig crond on

确定php扩展模块:
  mysql,SNMP,XML,Session,Sockets,GD,LDAP(如果安装了php-ldap模块的话)

给MySQL用户root添加密码:
mysqladmin --user=root password centos

二、安装配置cacti


tar xf cacti-0.8.8a.tar.gz -C /var/www/html/
mv /var/www/html/cacti-0.8.8a /var/www/html/cacti

创建cacti数据库
mysqladmin -uroot -p create cacti    

如果是中文版则,需要如下命令创建
mysql> create database cacti default character set utf8;

导入sql语句
mysql -uroot -p cacti < /var/www/html/cacti/cacti.sql
mysql> GRANT ALL ON cacti.* TO cacti@localhost IDENTIFIED BY 'centos';
mysql> flush privileges;

vim /var/www/html/cacti/include/config.php  <<

$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cacti";
$database_password = "centos";

useradd cacti
cd /var/www/html/cacti
chown -R cacti rra/ log/

echo "*/5 * * * * /usr/bin/php /var/www/html/cacti/poller.php &> /dev/null" > /var/spool/cron/cacti
注意:首次执行poller.php时应使用cacti用户,否则生成的rrd文件cacti将没有写入权限!

三、配置snmp使可以监控本机

vim /etc/snmp/snmpd.conf  <<

com2sec notConfigUser  default         public   ==>  改为
com2sec notConfigUser  127.0.0.1       public

四、配置使用spine来执行获取数据

依赖关系:
mysql-devel
net-snmp-devel

编译安装
tar -xf cacti-spine-0.8.8a.tar.gz -C /usr/src/
cd /usr/src/cacti-spine-0.8.8a/
./configure
make && make install

提供配置文件
cd /usr/local/spine/etc/
cp spine.conf.dist spine.conf
vi spine.conf     >>   修改一下内容

DB_Host         localhost
DB_Database     cacti
DB_User         cacti
DB_Pass         centos
DB_Port         3306
DB_PreG         0

启用spine
登录cacti的网页,点击Settings,在页面上方点击Paths,找到Alternate Poller Path,写入spine的路径:/usr/local/spine/bin/spine,然后点击Save保存。
再点击页面上方的Poller,找到Poller Typer项,在下拉列表中选择spine,然后点击Save保存。

通过浏览器访问http://serverip/cacti

五、被监控端配置

yum install net-snmp

vim /etc/snmp/snmpd.conf   ==>

com2sec  notConfigUser   192.168.56.201(监控端IP)    public
view all included  .1   80
access notConfigGroup "" any noauth exact all none none

六、相关知识点

测试snmp通过如下命令:
snmpwalk -v 2c -c public localhost system


模版:
    图形模版:图是如何绘制
    数据模版:定义如何获取数据及保存方法
    主机模版:归好类的图形和数据模版

获取数据-->保存数据-->绘图

自定义顺序:
1、定义脚本收集数据,执行脚本输出结果为:XXX:0-9 XXX:0-9
    Name:输入数据收集方法名称
    InputType:获取数据的方法
    InputString:/bin/bash <path_cacti>/scripts/xx.sh <hostname> <snmp_community>
    创建完成后,添加输入字段和输出字段:
    输入字段为脚本引用的各个变量
    输出字段为脚本执行后生成的各个字段,名字要和输出的名字一致
2、定义数据模版
    根据输出字段添加各自的数据源
3、定义数据源
4、定义图像模版
    1、创建图像模板
        Vertical Lable  tcp_3 conn
    2、添加图像(Graph Template Items)
        Text Format:该颜色线条的说明
        Graph Item Type:图像类型:
            GPRINT:打印,类似当前值,最大值,平均值
            COMMENT:显示到图形中的
4、图形管理添加图形
    定义数据源所关联的图像


常用相关命令:
1、查看一rrd文件的最后一次或第一次的更新时间
rrdtool last localhost_load_1min_5.rrd | xargs -i date -d '1970-01-01 {} sec utc'
rrdtool first localhost_load_1min_5.rrd | xargs -i date -d '1970-01-01 {} sec utc'

2、查看rrd文件的内容
rrdtool fetch XXX.rrd AVERAGE

2、查看rrd文件结构信息
rrdtool info XXX.rrd    >>

filename = "eth0.rrd"
rrd_version = "0003"
step = 300                                        # RRDtool 希望每5分钟收到一个数据
last_update = 1163862985          # 这是最近一次更新的 timestamp 。可以用 date 转换为具体的时间
ds[eth0_in].type = "COUNTER"              # 有一个名为 eth0_in 的 DS,DST是 COUNTER
ds[eth0_in].minimal_heartbeat = 600       # hearbeat 时间是600 秒
ds[eth0_in].min = 0.0000000000e+00        # eth0_in 的最小值是 0 (bytes)
ds[eth0_in].max = 1.2500000000e+07        # eth0_in 的最大值是 1250000000 (bytes)
ds[eth0_in].last_ds = "UNKN"      
ds[eth0_in].value = 0.0000000000e+00
ds[eth0_in].unknown_sec = 85
ds[eth0_out].type = "COUNTER"
ds[eth0_out].minimal_heartbeat = 600
ds[eth0_out].min = 0.0000000000e+00
ds[eth0_out].max = 1.2500000000e+07
ds[eth0_out].last_ds = "UNKN"
ds[eth0_out].value = 0.0000000000e+00
ds[eth0_out].unknown_sec = 85
rra[0].cf = "AVERAGE"                             # 第一个 RRA 的编号是0,不是1。
rra[0].rows = 600                                 # 共保存 600 个记录
rra[0].pdp_per_row = 1                    # 每个 CDP 由一个 PDP 统计得出
rra[0].xff = 5.0000000000e-01             # 只要当前interval 的 PDP 为 unknown ,则该 CDP 的值也是unknown
rra[0].cdp_prep[0].value = NaN
rra[0].cdp_prep[0].unknown_datapoints = 0
rra[0].cdp_prep[1].value = NaN
rra[0].cdp_prep[1].unknown_datapoints = 0
rra[1].cf = "AVERAGE"                             # 第二个 RRA 的编号是 1。同样也是 AVERAGE 型。
rra[1].rows = 600                                 # 也是保存 600 个记录
rra[1].pdp_per_row = 4                    # 每个 CDP 由4个 PDP 的求平均值得出
rra[1].xff = 5.0000000000e-01             # 每个 CDP 最多允许2个 PDP 为 unknown ,超过则该 CDP 为unknown