Cacti —— 以 SNMP 轮询 + RRDtool 环形存储为核心的网络流量绘图与故障管理平台
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. 参考链接
- 官网:https://www.cacti.net/
- GitHub 仓库:https://github.com/Cacti/cacti
- 官方文档:https://docs.cacti.net/
- 下载页(版本号以官方最新稳定版为准):https://www.cacti.net/info/downloads
- 通用安装说明:https://docs.cacti.net/General-Installing-Instructions.md
- CentOS/RHEL/ROCKY 安装(含 Spine):https://docs.cacti.net/Install-Under-CentOS_LAMP.md
- 系统工具(重建 Poller Cache 等):https://docs.cacti.net/System-Utilities.md