Cacti —— 以 SNMP 轮询 + RRDtool 环形存储为核心的网络流量绘图与故障管理平台

运维监控软件手册 03-一体化监控平台 20.9 KB 原文

Cacti —— 以 SNMP 轮询 + RRDtool 环形存储为核心的网络流量绘图与故障管理平台

分类:03 一体化监控平台 适用:路由器/交换机/防火墙/服务器等 SNMP 设备;LAN 到上万台设备、以带宽/流量/接口趋势图为核心的场景 一句话:SNMP 定时取数 → RRDtool 落盘 → 模板化出图,配 Spine 加速轮询、Weathermap 画链路流量图 官方:https://www.cacti.net/ | https://github.com/Cacti/cacti | https://docs.cacti.net/ 授权:GNU GPL v2 或更高版本,完全开源;插件生态由社区维护

1. 它解决什么问题

痛点 对应能力
只有 ifconfig/snmpwalk 瞬时值,看不出趋势 RRDtool 环形数据库自动降采样,日/周/月/年趋势图开箱即用
每台交换机手工画图、重复劳动 模板体系:Device / Graph / Data Template + Data Query 一次定义批量套用
设备多、PHP 轮询慢 Spine(C 语言多线程 poller)替代 cmd.php,配合 Boost 批量写库
想看机房/链路整体流量拓扑 Weathermap 插件按链路带宽着色画网络地图
阈值告警、设备宕机无人知 Thold / Monitor / Syslog 等插件 + 邮件通知
需要长期留存且量可控 RRD 固定大小文件,不随时间无限增长,天然适合年级归档

不擅长:秒级监控(默认 5 分钟轮询)、日志全文检索与链路追踪、云原生高基数标签模型(Prometheus 更合适)、复杂 PromQL/多维即席分析。

2. 核心概念与架构

2.1 术语表

术语 含义
Device(主机) 被监控设备,含 hostname、SNMP 版本/团体字、Host Template、轮询/可用性设置
Data Source / Data Template 一项采集数据(对应一个 RRD 文件)/ 其可复用定义(OID、DS 类型、RRA)
Graph / Graph Template 一张图 / 其可复用定义(图元、CDEF、GPRINT、图例)
Data Query 基于 SNMP 索引(如 ifIndex)批量发现接口/磁盘,生成 DS 与 Graph
RRD / RRA / RRDfile 环形数据库文件(放 rra/,每 DS 一个 .rrd,固定大小)/ 归档策略(AVERAGE/MAX、步长、保留点数)
Poller 采集器:cmd.php(默认 PHP)或 Spine(C 多线程);由 cron / cactid 定时触发
Poller Cache 每次轮询执行的「设备→数据源→OID」任务表,改模板/设备后需重建
模板 / Tree / RBAC 设备与图形模板(XML 导入导出)、图形树按区域组织、用户组权限
Boost 大批量场景把 RRD 更新先缓存到 DB,再由后台进程批量落盘,降低 I/O
Weathermap / Thold 链路带宽着色地图插件 / 阈值告警插件(配合通知发邮件)

2.2 组件与数据流(SNMP poller → RRD → Graph)

 网络设备(snmpd,UDP 161)─ SNMP GET/BULKWALK(v1/v2c/v3) ─▶ 采集层
 ┌──────────── 采集层(每 5 分钟,cron 或 cactid) ────────────┐
 │ poller.php ─▶ cmd.php(PHP 单进程)/ Spine(C 多线程)       │
 │      ▲ 从 MySQL 读 Poller Cache(设备→DS→OID 任务)          │
 └──────────┬────────────────────────────────────────────────┘
            │ Counter/Gauge 值(ifInOctets、ifOutOctets)
            ▼  rrdtool update(Boost 可选:先入 DB 再批量落盘)
      rra/<host>_<ds>.rrd(RRA 自动降采样,固定大小)
            ▼  rrdtool graph
 ┌──────────── 展示层(Apache/Nginx + PHP) ──────────────────┐
 │ graph_image.php → Graph Tree → RBAC → 浏览器 PNG/CSV/Realtime│
 └────────────────────────────────────────────────────────────┘
 旁路:Weathermap(地图)、Thold(阈值告警→邮件)、Syslog、Monitor
  • 链路:poller.php 从 MySQL 读 Poller Cache → cmd.php/Spine 经 SNMP 取 OID 值 → rrdtool update 写 rra/*.rrd → 浏览器请求时 rrdtool graph 实时渲染 PNG。
  • RRD 特性:创建时大小即固定,多个 RRA 分别保存 5m/30m/2h/1d 等粒度,旧数据自动归并,因此不随时间膨胀,适合长期趋势。
  • 模板与取值:模板是 XML(Console → Import/Export → Import Templates 预览冲突);改 Data Query/模板需 rebuild_poller_cache.php;流量用 COUNTER(差值/间隔算速率)、CPU 用 GAUGE,CDEF 做单位换算。

3. 安装与部署

当前稳定系列为 1.2.x(另有 1.3 开发分支),具体版本号以官方最新稳定版为准(https://www.cacti.net/info/downloads)。1.2.31 起官方要求 PHP 8.1+ 与 Composer;<xxx> 为占位符。

3.1 环境准备(含 SNMP 前提)

项 要求
Web Apache / Nginx / IIS + PHP;扩展 posix session sockets pdo_mysql xml ldap mbstring pcre json openssl gd zlib,可选 snmp gmp(用 php -m 核对)
PHP 配置 在 /etc/php.ini(及 cli/ 对应文件)设置 date.timezone = Asia/Shanghai;改后 systemctl restart php-fpm,否则安装后 HTTP 500
数据库 MySQL / MariaDB;预建 cacti 库与专用账号;导入 cacti.sql 初始化(源码包内)
RRDtool / SNMP rrdtool(1.2.x 需 ≥1.4)、net-snmp net-snmp-utils(snmpwalk/snmpget/snmpbulkwalk);被监控设备开启 snmpd,UDP 161 放通(Trap 162)
Spine 编译依赖 gcc autoconf automake libtool dos2unix help2man openssl-devel mariadb-devel net-snmp-devel(包名随发行版,以官方文档为准)
端口 / 权限 80/443(Web)、3306(DB)、161/162 UDP(SNMP);rra/、log/ 归 Web 用户可写
时间 / 信创 全节点 NTP 同步,否则 RRD 时间戳与图错位;全链路开源组件可在麒麟/统信 + 鲲鹏/飞腾(arm64) 编译,国产库需验证 MySQL 兼容模式,以官方文档为准

3.2 多种安装方式

方式 A:发行版包(最快)

sudo apt-get install -y cacti     # Debian/Ubuntu;RHEL/Rocky 用 sudo dnf install -y cacti(必要时启 EPEL)
# 安装向导会提示建库、选轮询器;Web 访问 http://<主机>/cacti

方式 B:官方源码 + LAMP(生产常用)

sudo yum install -y httpd php php-mysqlnd php-gd php-snmp php-mbstring php-xml \
  php-ldap php-gmp php-intl php-zip php-json php-process rrdtool net-snmp net-snmp-utils mariadb-server composer
sudo systemctl enable --now httpd mariadb
cd /tmp && wget https://www.cacti.net/downloads/cacti-1.y.z.tar.gz
tar -zxvf cacti-1.y.z.tar.gz && sudo mv cacti-1.y.z /var/www/html/cacti
cd /var/www/html/cacti && sudo composer install      # 1.2.31+ 用 Composer 装 PHP 依赖
mysql -uroot -p<密码> -e "CREATE DATABASE cacti DEFAULT CHARACTER SET utf8mb4;"
mysql -uroot -p<密码> -e "GRANT ALL ON cacti.* TO 'cactiuser'@'localhost' IDENTIFIED BY '<cacti_pass>'; FLUSH PRIVILEGES;"
mysql -uroot -p<密码> cacti < /var/www/html/cacti/cacti.sql
sudo cp include/config.php-dist include/config.php   # 编辑 $database_* 见第 4 章
sudo useradd -r -M cacti && sudo chown -R cacti rra/ log/

方式 C:Spine 编译安装(高并发轮询)

cd /tmp && wget https://www.cacti.net/downloads/spine/cacti-spine-1.y.z.tar.gz
tar -zxvf cacti-spine-1.y.z.tar.gz && cd cacti-spine-1.y.z
./configure && make && sudo make install          # 默认装到 /usr/local/spine/bin/spine
sudo cp /usr/local/spine/etc/spine.conf.dist /etc/spine.conf
sudo chown root:root /usr/local/spine/bin/spine && sudo chmod +s /usr/local/spine/bin/spine
/usr/local/spine/bin/spine                        # 应输出 Using spine config file [/etc/spine.conf]

Web 侧切换:Console → Settings → Poller 把 Poller Type 改为 spine;Paths 里填 Spine / RRDtool / SNMP 二进制路径。

方式 D:cron / systemd 定时任务

# 传统 cron(/etc/cron.d/cacti),每 5 分钟一次,与 300s 轮询周期对齐
echo '*/5 * * * * apache php /var/www/html/cacti/poller.php > /dev/null 2>&1' | sudo tee /etc/cron.d/cacti
sudo systemctl restart crond
# 1.2.16+ 可用 systemd cactid 替代 cron
sudo cp /var/www/html/cacti/service/cactid.service /etc/systemd/system/ && sudo touch /etc/sysconfig/cactid
sudo systemctl daemon-reload && sudo systemctl enable --now cactid

气隙/离线:源码包 + 本地 yum/apt 源即可;Weathermap、Thold 等插件放到 plugins/ 并在「Plugin Management」启用。

3.3 首次启动与验证(含 SNMP 探测)

sudo -u apache php /var/www/html/cacti/poller.php   # 应输出 OK u:... 与 SYSTEM STATS: Time:... Method:cmd.php/spine
tail -n 30 /var/www/html/cacti/log/cacti.log
ls -l /var/www/html/cacti/rra/ | head              # 出现 .rrd 文件即采集成功
snmpwalk -v2c -c <community> <设备IP> 1.3.6.1.2.1.1.1.0           # sysDescr
snmpwalk -v2c -c <community> <设备IP> IF-MIB::ifDescr              # 列接口
snmpget  -v2c -c <community> <设备IP> IF-MIB::ifInOctets.2         # 取单 OID
# Web http://<主机>/cacti 默认 admin/admin 首次强制改密;Console → Devices → Add → Create Graphs

4. 配置文件详解

4.1 路径与关键项

路径 / 键 说明
include/config.php(由 config.php-dist 复制) 数据库连接主配置;⚠️ 勿放进 Web 可下载目录之外
$database_type / $database_default mysql / 库名 cacti
$database_hostname / $database_port DB 地址 / 3306
$database_username / $database_password 专用账号 / 密码
$database_ssl / $database_ssl_key / $database_ssl_ca TLS 连接开关与证书路径(默认 false)
$url_path 子目录部署时设为 /cacti/(根部署留 /)
/etc/spine.conf Spine 专用 DB 连接:DB_Host DB_Database DB_User DB_Pass DB_Port
Console → Settings → Paths PHP / RRDtool / snmpwalk / snmpbulkwalk / Cacti Logfile / Spine 路径
Console → Settings → Poller Poller Type(cmd.php/spine)、轮询间隔、并发进程/线程数
rra/、log/cacti.log、resource/、plugins/ RRD 目录 / 主日志 / SNMP 脚本与模板资源 / 插件目录
cli/rebuild_poller_cache.php 重建 Poller Cache;大系统用 CLI,勿在 UI 里点
cli/upgrade_database.php、cli/audit_database.php 升级 schema / 库一致性检查

4.2 完整可运行最小示例

<?php
// /var/www/html/cacti/include/config.php
$database_type     = 'mysql';
$database_default  = 'cacti';
$database_hostname = 'localhost';
$database_username = 'cactiuser';
$database_password = '<cacti_pass>';
$database_port     = '3306';
$database_ssl      = false;     # 需 TLS 时再补 $database_ssl_key / _cert / _ca
$url_path = '/cacti/';
# /etc/spine.conf(Spine 与 Web 读同一套库;ICMP ping 需给 spine 加 suid)
DB_Host        localhost
DB_Database    cacti
DB_User        cactiuser
DB_Pass        <cacti_pass>
DB_Port        3306

改完校验:sudo -u apache php /var/www/html/cacti/poller.php 能连库、/usr/local/spine/bin/spine 能读配置。

5. 核心使用方法(CLI / Web UI / SNMP)

5.1 命令与操作速览(≥20 条)

# 命令 / 路径 用途
1 systemctl restart|status httpd php-fpm mariadb crond snmpd LAMP 各服务管理
2 php -m | grep -E 'snmp|pdo_mysql|gd' 核对 PHP 扩展
3 rrdtool -v / snmpwalk --version 核对 RRDtool / Net-SNMP 版本
4 sudo -u apache php /var/www/html/cacti/poller.php 手工触发一次轮询
5 php -q cli/rebuild_poller_cache.php --help 查看重建缓存参数
6 php -q cli/rebuild_poller_cache.php 重建 Poller Cache(大系统用 CLI)
7 php -q cli/upgrade_database.php --help 升级前看 schema 升级参数
8 php -q cli/audit_database.php 检查数据库一致性
9 snmpwalk -v2c -c <community> <IP> 1.3.6.1.2.1.1.1.0 验证设备 sysDescr
10 snmpwalk -v2c -c <community> <IP> IF-MIB::ifDescr 列接口名(自动发现依据)
11 snmpbulkwalk -v2c -c <community> <IP> IF-MIB::ifHCInOctets 批量取 64 位计数器
12 snmpget -v2c -c <community> <IP> IF-MIB::ifInOctets.2 取单个 OID 值
13 rrdtool info <file.rrd> / rrdtool fetch <file.rrd> AVERAGE -s -3600 查 RRD 结构 / 取数
14 rrdtool graph <out.png> DEF:x=<file.rrd>:traffic_in:AVERAGE LINE1:x#00FF00:in 手工出图验证
15 rrdtool tune <file.rrd> --maximum traffic_in:<上限> 修正 DS 上限 ⚠️ 改结构前先备份
16 Console → Import/Export → Import Templates 导入设备/图形模板 XML
17 Console → Import/Export → Export Templates 导出模板备份
18 Console → Devices → Add 新增设备(填 SNMP 参数与 Host Template)
19 Devices → 选中 → Create Graphs for this Host 为设备批量建图
20 Console → Graph Trees → Add 建图形树组织视图
22 Console → System Utilities → RRDfile Cleaner / Checker 清理孤儿 RRD / 检查陈旧数据
23 Console → System Utilities → View Boost Status / Poller Cache;Settings → Paths / Poller 查轮询缓存状态、配二进制路径与 Poller Type=spine
24 curl -s "http://<主机>/cacti/graph_image.php?local_graph_id=<id>&rra_id=0" 直接取图验证渲染

5.2 SNMP 探测与模板导入

snmpwalk -v2c -c <community> -On <设备IP> 1.3.6.1.2.1.1.3.0        # sysUpTime
snmpwalk -v2c -c <community> <设备IP> IF-MIB::ifTable | head -n 20   # 接口表
snmpwalk -v3 -l authPriv -u <user> -a SHA -A <auth_pass> -x AES -X <priv_pass> <设备IP> 1.3.6.1.2.1.1.1.0
snmpbulkwalk -v2c -c <community> <设备IP> IF-MIB::ifHCInOctets        # 64 位计数器
snmpget -v2c -c <community> -On <设备IP> IF-MIB::ifHCInOctets.2       # 取两次差值/间隔即速率
模板导入(Web UI):
1. Console → Import/Export → Import Templates → 选 XML → 预览依赖冲突 → Import
2. Console → Devices → 编辑设备 → 关联 Host Template / 勾选 Data Query
3. 改了 Data Query 或模板:CLI 执行 php -q cli/rebuild_poller_cache.php
4. 等 1~2 个轮询周期,Graphs 页出现新图

5.3 poller 与缓存维护

sudo -u apache php /var/www/html/cacti/poller.php   # SYSTEM STATS: Time / Method:cmd.php|spine
php -q cli/rebuild_poller_cache.php --help
php -q cli/rebuild_poller_cache.php                 # 大系统耗时数分钟~数小时,务必走 CLI
php -q cli/audit_database.php
php -q cli/upgrade_database.php --help
grep -E 'WARNING|ERROR|SPINE|POLLER' /var/www/html/cacti/log/cacti.log | tail -n 50

6. 告警与通知

6.1 阈值、静默与升级

需求 做法
阈值告警 装 Thold 插件:按 Data Source / Graph 建 threshold(高/低水位、基线、持续时间)
设备宕机 Monitor 插件 / Device 的 Availability 设置(SNMP/ping 失败)
邮件通知 Console → Settings → Mail/Reporting:SMTP 主机/端口/账号/TLS、From 地址,页面发 Test Email
企微 / 钉钉 / Webhook 原生以邮件为主;经通知脚本 / 外部告警平台转发(如把 Thold 事件写 Webhook,以插件文档为准)
静默 / 维护 Thold 的维护窗口 / 设备 Disabled;批量用 Maint 插件
升级 多阈值分级(Warning/Critical)配不同收件人,或由外部平台按级别升级
确认 / 追溯 Thold 事件列表、User Log(登录审计)、Syslog 插件集中日志

⚠️ 告警能力依赖第三方插件(Thold/Monitor/Syslog/Maint),插件与 Cacti 版本需匹配,启用前在「Plugin Management」核对兼容性。

6.2 邮件配置示例(Web UI)

Console → Configuration → Settings → Mail/Reporting
  Mail Services: SMTP
  SMTP Hostname: <smtp.example.com>   SMTP Port: 587   SMTP Security: TLS
  SMTP Username: <user>   SMTP Password: <pass>
  From Address: cacti@<example.com>   From Name: Cacti
  勾选 "Notify Primary Admin of Issues",保存后点 Send a Test Email 验证
# CLI 侧确认队列/日志(是否发出)
grep -iE 'mail|thold|notify' /var/www/html/cacti/log/cacti.log | tail -n 30

7. 实战场景

场景一:接入一台交换机并画出全部接口流量图

  • 目标 / 步骤:SNMP 可达 → 加设备 → 用 Data Query 自动发现接口 → 批量建图 → 挂到图形树。
snmpwalk -v2c -c <community> <交换机IP> IF-MIB::ifDescr   # 不通查 snmpd/community/UDP 161/ACL
# Web:Console → Devices → Add(Host Template=Generic SNMP Device,SNMP Version=2c,Community=<community>)
# 设备页 Create Graphs for this Host → 勾选 Data Query [SNMP - Interface Statistics] → 选接口 → Create
sudo -u apache php /var/www/html/cacti/poller.php && sudo -u apache php /var/www/html/cacti/poller.php
ls /var/www/html/cacti/rra/ | grep <host_id>
  • 验证:rrdtool info <对应.rrd> 有 DS、Graphs 页出现 In/Out Octets 曲线;snmpbulkwalk 与图量级一致。
  • 回滚:Devices 中删除该主机 → System Utilities → RRDfile Cleaner 归档清理孤儿 RRD;⚠️ 删设备会连带删除其图形与历史 RRD,先导出模板/备份 rra/。

场景二:从 cmd.php 切到 Spine 并重建 Poller Cache

  • 目标 / 步骤:设备数增长后 PHP 轮询超时,改用 Spine 多线程;改模板后重建缓存。
/usr/local/spine/bin/spine                                    # 确认可读库
# Web:Settings → Paths 填 Spine 路径;Settings → Poller 改 Poller Type=spine、调 Threads
php -q cli/rebuild_poller_cache.php                           # 模板/Data Query 变更后,CLI 重建
sudo -u apache php /var/www/html/cacti/poller.php
tail -n 20 /var/www/html/cacti/log/cacti.log | grep -i 'SYSTEM STATS'
  • 验证:日志 SYSTEM STATS 显示 Method:spine 且 Time 明显下降;System Utilities → View Poller Cache 条目数与 DS 数一致,图持续更新。
  • 回滚:Settings → Poller 改回 cmd.php 并重启 cron/cactid;⚠️ 切换期间会漏 1~2 个采集周期,选低峰操作。

场景三:用 Weathermap 画机房链路流量图

  • 目标 / 步骤:把多条 WAN 链路的带宽利用率按颜色呈现在一张拓扑图上。
# 1) 插件放 plugins/,Console → Plugin Management → Install & Enable
# 2) Weathermap Editor → Add Map 命名 <campus-map>;加 NODE,用 LINK 连接并绑定 Cacti 图形数据源
#    (填 graph id 或 RRD 路径,字段以插件版本为准);设 BANDWIDTH 与 0-50-80-100% 色阶
# 3) 地图渲染加入 cron(插件自带重建脚本,以插件文档为准)
rrdtool fetch /var/www/html/cacti/rra/<对应.rrd> AVERAGE -s -3600 | head
# Web:Weathermap 页查看 <campus-map>,链路颜色随利用率变化
  • 验证:地图 LINK 显示实时利用率与颜色;改一条链路带宽上限后颜色随之变化。
  • 回滚:Plugin Management 中 Disable/Uninstall Weathermap,删 plugins/weathermap 前先备份其 configs/ 地图定义;⚠️ 插件目录删除不会动 Cacti 的 RRD 数据。

8. 日常运维与故障排查

操作 / 路径 命令
服务 systemctl restart|status httpd php-fpm mariadb crond|cactid snmpd
日志 /var/www/html/cacti/log/cacti.log;Apache error_log;journalctl -u cactid -f
手工轮询 sudo -u apache php /var/www/html/cacti/poller.php
备份配置 tar czf cacti-etc.tgz /var/www/html/cacti/include /etc/spine.conf
备份数据 mysqldump -u<user> -p<pass> cacti > cacti.sql;tar czf cacti-rra.tgz /var/www/html/cacti/rra ⚠️ 停机或低峰做

故障「现象 → 原因 → 处置」表

现象 原因 处置
图空白 / 全是 NaN rra/ 无写权限、poller 没跑、SNMP 不通 chown -R cacti rra/ log/;手工跑 poller.php 看报错;snmpwalk 验证
Web 安装/访问 500 php.ini 未设 date.timezone、缺 PHP 扩展 设时区、php -m 补扩展后 systemctl restart php-fpm
登录后报 DB 错误 config.php 账号/库名错、库未导 schema 核对 $database_*;mysql -u<user> -p cacti;重新导入 cacti.sql
poller 日志 Host[...] SNMP timeout UDP 161 被防火墙拦、community 错、设备 ACL 放通 161/udp;核对 SNMP 版本/团体字;snmpwalk -v2c -c <community> <IP>
接口流量为 0 或突刺 用了 32 位 ifInOctets 高速口回绕、DS 类型错 改用 IF-MIB::ifHCInOctets(64 位)、DS 设 COUNTER;rrdtool tune 修上限 ⚠️ 先备份
改模板后新接口不出现 Poller Cache 未重建 php -q cli/rebuild_poller_cache.php;等 1~2 周期
Spine 报 FATAL: Connection Failed /etc/spine.conf 与 Web 的 config.php 库配置不一致 对齐 DB_Host/DB_User/DB_Pass/DB_Port;spine 单跑验证
ICMP ping 全失败 spine 未加 suid 或容器缺权能 chmod +s /usr/local/spine/bin/spine;容器按需授权
轮询越来越慢 / 超时 cmd.php 单进程、设备多、DB I/O 高 切 Spine 并调线程数、启用 Boost、拆分多 poller(以官方文档为准)
时间轴错位 / 图断裂 节点 NTP 不同步、主机时间被改 全节点 chrony 同步;⚠️ RRD 时间戳不可回写,必要时重建该 DS

9. 性能、容量与高可用

维度 说明
采集频率 默认 300 秒(5 分钟),cron */5 对齐;调小需同步改 Poller/ Cron 与 RRA 步长
RRD 容量 每 DS 一个固定大小 .rrd,大小 = DS 数 × RRA 行数 × 8 字节;不随时间增长,容量可精确估算
数据保留 由 RRA 定义(多粒度:5m/30m/2h/1d),旧数据自动降采样归并;改 RRA 需重建 RRD ⚠️ 会丢历史
cmd.php vs Spine cmd.php 为 PHP 单进程、简单但慢;Spine 为 C 多线程,适合上千设备;切换见场景二
Boost 大批量先写 DB 缓存再批量 rrdtool update,降低随机 I/O;System Utilities → View Boost Status 看状态
多 Poller / 分布式 支持远端/多轮询器分担设备(以官方分布式文档为准);Web 与 DB 可分离部署
自监控 监控 poller 单次耗时(SYSTEM STATS: Time)、cacti.log 的 WARNING/ERROR、RRD 更新陈旧度(RRDfile Checker)、MySQL 连接数
HA 要点 Web 无状态可多实例 + LB;MySQL 主从;rra/ 放共享存储或定期同步;⚠️ 多 poller 同时写同一 RRD 需避免冲突

10. 安全加固、备份与升级

项 做法
首次登录 ⚠️ 立刻把默认 admin / admin 改掉;禁用示例账号、按 RBAC 建用户组与图形树权限
SNMP v3 设备与 Cacti 均配 v3:-l authPriv -u <user> -a SHA -A <auth_pass> -x AES -X <priv_pass>;禁用 v1/v2c 明文团体字;ACL 限定采集源 IP
最小权限 DB 账号仅授权 cacti 库;poller 以 Web 用户(apache/cacti)运行;rra/ log/ 仅该用户可写
文件保护 config.php、/etc/spine.conf 含密码,chmod 640、属主收紧、不进版本库
TLS / 入口 前置 Nginx/Apache 终止 HTTPS;Web 目录禁目录列表;限制 /cli、/include 直接访问
配置备份 tar czf cacti-etc-$(date +%F).tgz /var/www/html/cacti/include /etc/spine.conf;导出模板 XML
数据备份 mysqldump -u<user> -p<pass> cacti > cacti.sql + tar czf cacti-rra.tgz rra/;⚠️ 运行中拷 RRD 可能不一致,低峰或停 poller
恢复 停 poller → 恢复 DB 与 rra/ → php -q cli/audit_database.php → 手工跑一次 poller 验证
升级 读官方 Upgrade 文档;备份 DB + rra/ + config.php;替换源码 → composer install → 浏览器升级向导 / cli/upgrade_database.php;⚠️ 跨 1.x 大版本先核对 PHP/RRDtool 要求
回滚 恢复备份的源码目录、DB 与 RRD,改回旧版 config.php;⚠️ 新版 schema 可能不向下兼容,务必先在测试机验证
信创适配 麒麟/统信 + 鲲鹏/飞腾(arm64) 编译 PHP/MySQL/Net-SNMP/RRDtool;国产库验证 MySQL 兼容模式;全栈离线可用

11. 常见坑(现象 → 原因 → 解决)

# 现象 原因 解决
1 安装后 HTTP 500 php.ini 缺 date.timezone 或扩展 设时区、php -m 补齐、restart php-fpm
2 图全 NaN / 无 .rrd rra/ log/ 属主不对、poller 未执行 chown -R cacti 后手工 poller.php 看输出
3 SNMP 超时 UDP 161 未放通、community 错、设备 ACL snmpwalk -v2c -c <community> <IP> 逐段排查
4 高速口流量突刺/回绕 用了 32 位 ifInOctets 改 ifHCInOctets(64 位)、DS 为 COUNTER;⚠️ rrdtool tune 前备份
5 改模板新接口不出图 Poller Cache 未重建 php -q cli/rebuild_poller_cache.php;大系统勿用 UI 按钮
6 Spine 连不上库 spine.conf 与 config.php 不一致 对齐 DB_* 五项;/usr/local/spine/bin/spine 单跑验证
7 ICMP ping 全失败 spine 未 suid chmod +s /usr/local/spine/bin/spine
8 轮询周期漏点 cron 用户/路径写错、cactid 未起 查 /etc/cron.d/cacti、systemctl status cactid、cacti.log
9 删设备后磁盘不降 孤儿 RRD 不会自动删 System Utilities → RRDfile Cleaner;⚠️ 删除前确认无图引用
10 升级后图全丢 只备份 DB 未备份 rra/,或 RRA 结构变更 DB 与 rra/ 一起备份;跨版本先测试机验证 ⚠️
11 插件装完页面报错 插件版本与 Cacti 不匹配 在 Plugin Management 核对兼容性,Disable 后再排错

12. 速查表

类别 项 值 / 命令
端口 Web / DB / SNMP 80·443 / 3306 / 161·162 UDP
登录 默认账号 admin / admin(⚠️ 首次登录即改)
配置 主配置 include/config.php(由 config.php-dist 复制)
配置 Spine 配置 /etc/spine.conf(DB_Host/DB_Database/DB_User/DB_Pass/DB_Port)
配置 Web 设置 Console → Settings → Paths / Poller / Mail/Reporting
数据 RRD 目录 rra/*.rrd
日志 主日志 log/cacti.log
根目录 源码路径 /var/www/html/cacti
定时 cron */5 * * * * apache php /var/www/html/cacti/poller.php
定时 systemd systemctl enable --now cactid(1.2.16+)
CLI 手工轮询 sudo -u apache php poller.php
CLI 重建缓存 php -q cli/rebuild_poller_cache.php
CLI 库升级 / 体检 cli/upgrade_database.php / cli/audit_database.php
CLI SNMP 探测 snmpwalk -v2c -c <community> <IP> IF-MIB::ifDescr
CLI RRD 查看 rrdtool info|fetch|graph|tune <file.rrd>
Web 模板 Console → Import/Export → Import Templates(XML)
Web 建图 Devices → Create Graphs for this Host
Web 工具 System Utilities → Rebuild poller cache / RRDfile Cleaner / Checker
插件 告警 / 地图 Thold / Monitor / Syslog / Weathermap
轮询器 默认 / 高性能 cmd.php / spine(/usr/local/spine/bin/spine)

13. 选型建议与同类对比

维度 Cacti Zabbix Prometheus + Grafana Netdata
定位 SNMP 流量绘图 + RRD 趋势 企业级全栈监控 指标 + 多维查询/告警 单机秒级自治大盘
采集方式 SNMP 轮询(推/拉以轮询为主) Agent / SNMP / IPMI / 主动被动 exporter 拉取 Agent 本地采集
采集粒度 默认 5 分钟 通常 30~60s 15~60s 1 秒
存储 RRD 固定大小文件 关系库 history/trends 本地 TSDB 本地 dbengine
数据模型 DS + RRA,弱标签 Host/Item/Trigger 标签 + PromQL Chart/Dimension
出图 模板化 PNG 图、Weathermap 地图 内置图 + Grafana Grafana 灵活 自带大盘
告警 依赖 Thold/Monitor 插件 内置 Trigger/Escalation 强 Alertmanager 内置 health + ML
网络设备 SNMP 强(Data Query 自动发现接口) 强 靠 snmp_exporter 弱
长期归档/容量可控 强(RRD 固定大小) 中 需配远端存储 弱(滚动淘汰)
云原生/高基数 弱 弱 强 中
上手成本 中(LAMP + 模板建模) 中 中高 最低

何时选:以交换机/路由器/防火墙的 SNMP 接口流量与带宽趋势为核心、需要年级历史且容量可精确控制、想要 Weathermap 链路地图、已有 LAMP/MySQL 运维能力。

何时不选:需要秒级排障或容器/云原生高基数监控(选 Netdata / Prometheus)、需要开箱即用的强告警与升级链(选 Zabbix / 夜莺)、不愿维护 PHP+MySQL+RRDtool+SNMP 整套栈、需要日志/链路统一平台。

常见组合:Cacti 负责网络设备流量长期趋势图,Zabbix/夜莺负责主机与服务告警,Grafana 做统一展示层。

14. 参考链接

Cacti —— 以 SNMP 轮询 + RRDtool 环形存储为核心的网络流量绘图与故障管理平台 - 知识库 - 起航社区