简介:RRDTool 1.4.7 是面向网络运维与系统监控人员的时序数据存储与分析工具源码包,适用于搭建 Smokeping、Cacti、MRTG 等监控体系,解决性能数据采集、压缩存储与图表展示问题。压缩包共 314 个文件,约 1.29MB,以 49 个 C 源文件与 22 个头文件构成核心实现,辅以 31 个 pod、31 个 html 与 30 个 txt 文档说明用法,另有 16 个 m4、8 个 am 等构建脚本及 configure、Makefile 等编译入口,便于自行编译部署。已有 264 人学习下载。包内文档覆盖 rrdcreate、rrdcached、rrdgraph 等命令手册与入门教程,读者可据此掌握环形数据库创建、心跳间隔更新、数据压缩及折线图、饼图生成流程,并了解与 Smokeping 延迟监控、Cacti 设备性能采集、MRTG 流量图的对接方式,为监控平台选型与二次开发提供参考。
1. 从一台老监控机说起:为什么我还在装 rrdtool-1.4.7
上周帮人恢复一台跑了七八年的监控机,硬盘挂了,系统重装完,Smokeping 起不来,Cacti 的图全是空白,MRTG 日志里一行rrdtool: command not found反复刷屏。这台机器上跑的是老版本监控栈,Smokeping 2.6、Cacti 0.8.8、MRTG 2.16,它们共同的底层依赖就是 rrdtool,而且锁死在 1.4.x 这条线上。新系统自带的包管理器一装就是 1.7 甚至 1.9,装上去看着能用,实际一画图就报unknown RRD version,或者 Perl 模块加载失败,监控面板直接变黑匣子。
rrdtool-1.4.7.tar.gz 这个源码包,就是给这类老监控环境续命用的。它解决的不是「装个新工具」的问题,而是「让一套跑了很多年的监控栈在重装或迁移后原样复活」的问题。适合谁?手上维护着 Smokeping、Cacti、MRTG 这类老监控系统,系统升级后依赖断裂,或者需要在一台新机器上复刻旧环境的运维。装不好会怎样?轻则图表不出、数据写不进,重则整个监控前端 500,排查半天发现只是版本对不上。这篇就按我实际装机的顺序,从环境清点一路写到验证跑通。
2. 装前清点:版本、依赖和编译环境一次对齐
2.1 为什么是 1.4.7 而不是更新的版本
rrdtool 的 RRD 文件格式在 1.4 到 1.7 之间有过兼容性变化,老版本写出来的.rrd文件,新版本读的时候会提示版本不匹配,反过来新版本写的文件老版本也认不了。Smokeping 2.6 和 Cacti 0.8.8 这类老前端,内部调用的 Perl RRDs 模块和 rrdtool 二进制是配套的,你单独把 rrdtool 升到 1.7,Perl 模块的 API 对不上,RRDs::create直接抛异常。所以版本选择不是「越新越好」,而是「跟监控前端对齐」。我一般先确认前端版本,再反推 rrdtool 该用哪个。1.4.7 是 1.4 系列最后一个稳定版,修掉了 1.4.5 之前几个画图相关的 bug,老监控栈基本都认它。
清点的时候重点看三样:现有.rrd文件的版本、Perl 的 RRDs 模块版本、以及前端程序里写死的 rrdtool 路径。用rrdtool info看一个老文件,输出里rrd_version字段就是文件格式版本;perl -MRRDs -e 'print $RRDs::VERSION'看模块版本。两边对不上,就先别急着编译,先把版本关系理清楚。
2.2 编译依赖清单和系统包对照
源码编译 rrdtool 1.4.7 需要的不只是 gcc,它对图形库和 Perl 开发头文件有硬依赖。缺一个,configure阶段不一定报错,但make到一半会挂,或者编出来的二进制没有绘图能力。下面这张表是我在 CentOS 7 和 Ubuntu 18.04 上实际装过的包对照,按需取用。
| 依赖用途 | CentOS/RHEL 包名 | Debian/Ubuntu 包名 |
|---|---|---|
| 编译工具链 | gcc make | build-essential |
| 图形绘制 | libpng-devel libart_lgpl-devel | libpng-dev libart-2.0-dev |
| 字体支持 | freetype-devel fontconfig-devel | libfreetype6-dev libfontconfig1-dev |
| XML 解析 | libxml2-devel | libxml2-dev |
| Perl 绑定 | perl-devel perl-ExtUtils-MakeMaker | perl libperl-dev |
| 压缩库 | zlib-devel | zlib1g-dev |
装依赖这一步别偷懒,我见过有人只装了 gcc 和 libpng,configure过了,make也过了,结果rrdtool graph一跑就报找不到字体,图上的文字全是方块。原因就是 freetype 和 fontconfig 没装,configure 检测不到就静默跳过了字体渲染。所以装完依赖,configure的输出要逐行看,尤其是checking for ...那几行,no的地方要么补包,要么确认确实不需要。
提示:如果系统里已经有旧版 rrdtool 的二进制或库,编译前先确认
which rrdtool和ldconfig -p | grep rrd的结果,避免装完新版本后运行时链接到旧库,出现「版本显示对、行为不对」的玄学问题。
2.3 源码包解压和目录规划
拿到rrdtool-1.4.7.tar.gz后,我习惯放在/usr/local/src下编译,安装前缀用/usr/local/rrdtool-1.4.7,这样跟系统包管理器装的版本物理隔离,出问题好回退。
# 解压到源码目录,保持原始目录名便于追溯版本 cd /usr/local/src tar -zxvf rrdtool-1.4.7.tar.gz cd rrdtool-1.4.7 # 确认解压完整,看 configure 脚本和 NEWS 是否在 ls -l configure NEWS解压后先别急着 configure,看一眼NEWS文件里 1.4.7 相对 1.4.6 改了什么,主要是画图和 RRD 更新相关的修复,这能帮你判断手上的老环境是否正好踩在这些 bug 上。目录规划的核心原则是「版本化安装路径」,不要直接装到/usr/local根下,否则以后想换版本或者卸载,文件散落各处,清理起来很痛苦。用带版本号的前缀,卸载就是删一个目录的事。
3. 编译安装:configure 参数取舍和 make 阶段排错
3.1 configure 关键参数逐个说
rrdtool 1.4.7 的 configure 参数不少,但真正影响老监控环境能不能跑通的就那么几个。下面这条是我在 CentOS 7 上实际用的命令,参数含义逐条说明。
./configure \ --prefix=/usr/local/rrdtool-1.4.7 \ --disable-python \ --enable-perl-site-install \ --with-perl-options='INSTALLDIRS=vendor' \ --disable-tcl--prefix指定安装根目录,所有二进制、库、头文件都落在这个前缀下,跟系统隔离。--disable-python是因为老监控栈用不到 Python 绑定,关掉能少一堆依赖,也避免 Python 版本冲突导致 configure 失败。--enable-perl-site-install和--with-perl-options是给 Perl RRDs 模块用的,让模块装到 Perl 的 vendor 目录,这样 Smokeping 这类 Perl 程序能直接use RRDs找到它,不用手动改@INC。--disable-tcl同理,老环境不用 Tcl 绑定,关掉减少编译面。
configure 跑完,重点看输出末尾的汇总,尤其是Perl modules和Graphing两段。如果 Perl 那段显示disabled,说明 perl-devel 没装好或者路径没检测到,后面 Smokeping 一定加载失败。如果 Graphing 显示缺字体库,回去补 freetype 和 fontconfig。
3.2 make 和 make install 的常见中断
configure 过了不代表 make 顺利。1.4.7 在较新的 gcc 上编译,偶尔会遇到-Werror相关的警告被当成错误,或者某个头文件路径变了导致找不到声明。我遇到最多的是libart相关的链接错误,报undefined reference to art_...,原因是 libart_lgpl 装了但 pkg-config 路径没被找到。
# 先确认 pkg-config 能找到 libart pkg-config --cflags --libs libart-2.0 # 如果找不到,手动指定路径再 configure export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/usr/local/rrdtool-1.4.7 ...(其余参数同上)make 阶段如果报错,别急着删目录重来,先看错误行往上翻,通常是某个.h找不到或者某个函数未声明。把完整错误信息贴出来搜,比盲目重装快。make 成功后make install,装完检查前缀目录下的bin/rrdtool和lib/perl5是否存在,这两个是后续验证的关键。
3.3 环境变量和动态库路径配置
装完不配环境变量,直接敲rrdtool大概率提示找不到命令,因为/usr/local/rrdtool-1.4.7/bin不在 PATH 里。我一般写一个独立的环境脚本,而不是直接改/etc/profile,方便按需加载和回退。
# 写入独立环境文件,避免污染全局 profile cat > /etc/profile.d/rrdtool-1.4.7.sh <<'EOF' export PATH=/usr/local/rrdtool-1.4.7/bin:$PATH export LD_LIBRARY_PATH=/usr/local/rrdtool-1.4.7/lib:$LD_LIBRARY_PATH export PERL5LIB=/usr/local/rrdtool-1.4.7/lib/perl5:$PERL5LIB EOF # 当前会话立即生效 source /etc/profile.d/rrdtool-1.4.7.shPATH让命令行能找到 rrdtool 二进制,LD_LIBRARY_PATH让运行时链接到我们刚编的库而不是系统旧库,PERL5LIB让 Perl 能找到 RRDs 模块。三个变量缺一个,表现都不一样:缺 PATH 是命令找不到,缺 LD_LIBRARY_PATH 是命令在但报库版本错,缺 PERL5LIB 是 Smokeping 启动时报Can't locate RRDs.pm。配完用which rrdtool和echo $PERL5LIB确认一遍。
4. 对接监控前端:Smokeping、Cacti、MRTG 的配置要点
4.1 Smokeping 的 RRDs 模块和路径绑定
Smokeping 用 Perl 写,内部通过 RRDs 模块调 rrdtool。装完 rrdtool 后,先验证 Perl 能不能加载模块,再改 Smokeping 配置。
# 验证 RRDs 模块加载和版本 perl -MRRDs -e 'print "RRDs version: $RRDs::VERSION\n";'输出正常版本号说明模块通了。然后看 Smokeping 的config文件,里面有个datadir指向 RRD 文件存放目录,还有个隐性的 rrdtool 二进制路径依赖。Smokeping 2.6 默认调rrdtool命令,所以 PATH 里必须是 1.4.7 的二进制。如果系统里还有别的 rrdtool,用绝对路径在 Smokeping 的Smokeping::probes或相关配置里锁定,避免调错版本。改完配置重启 Smokeping,看日志里有没有RRDs相关报错,没有就说明绑定成功。
4.2 Cacti 的 rrdtool 路径和版本校验
Cacti 在 Web 界面里有专门的路径配置项,位置在Settings -> Paths,RRDTool Binary Path填/usr/local/rrdtool-1.4.7/bin/rrdtool。填完点保存,Cacti 会自己跑一次版本检测,界面上会显示检测到的版本号。如果显示1.4.7就对了,显示NOT FOUND或者版本号不对,先检查 Web 服务用户(通常是 apache 或 www-data)有没有执行权限,再看open_basedir有没有限制。
# 确认 Web 用户能执行 rrdtool sudo -u apache /usr/local/rrdtool-1.4.7/bin/rrdtool --version这条命令用 Web 服务身份跑一遍,能排除权限问题。Cacti 还有个RRDTool Default Font配置,1.4.7 对字体路径敏感,如果图里文字乱码,把字体路径指到系统实际存在的 ttf 文件,比如/usr/share/fonts/dejavu/DejaVuSansMono.ttf。
4.3 MRTG 的 RateUp 和 rrdtool 协同
MRTG 2.16 默认用自带的 rateup 写日志,要让它走 rrdtool,得在配置文件里加LogFormat: rrdtool,并且确保rrdtool命令在 PATH 里。MRTG 调 rrdtool 的方式比较粗暴,直接拼命令行,所以版本不对时错误信息不明显,往往表现为图不更新但进程不报错。
# MRTG 配置里指定 rrdtool 日志格式 # 在 mrtg.cfg 全局段加入 LogFormat: rrdtool PathAdd: /usr/local/rrdtool-1.4.7/bin LibAdd: /usr/local/rrdtool-1.4.7/lib/perl5PathAdd和LibAdd是 MRTG 找 rrdtool 二进制和 Perl 库的配置项,加上这两行,MRTG 就不依赖全局 PATH 了。改完跑一次mrtg mrtg.cfg,看有没有报错,再等一个采集周期看 RRD 文件有没有更新。
5. 避坑与排查:五个真实翻车现场
5.1 现象:rrdtool 命令能跑,但 Smokeping 报 RRDs 加载失败
原因:Perl 的@INC路径里没有我们装的lib/perl5,PERL5LIB只在当前 shell 生效,Smokeping 以服务方式启动时没继承这个变量。解决:把PERL5LIB写进 Smokeping 的启动脚本或 systemd unit 的Environment里,而不是只依赖/etc/profile.d。验证方法是sudo -u smokeping perl -MRRDs -e 1,用服务身份跑一遍。
5.2 现象:Cacti 版本检测显示 1.4.7,但画图报 unknown RRD version
原因:Cacti 的 poller 和 Web 前端可能用了不同的 rrdtool 路径,或者系统里还有旧版库被优先加载。ldd /usr/local/rrdtool-1.4.7/bin/rrdtool看链接的库路径,如果指向/usr/lib下的旧 libart 或 librrd,说明LD_LIBRARY_PATH没生效。解决:在 Cacti 的 poller 脚本和 Web 服务配置里都显式设置LD_LIBRARY_PATH,别指望全局变量。
5.3 现象:make 到一半报cannot find -lart_lgpl_2
原因:libart_lgpl 装了,但库文件名或路径跟 configure 预期的不一致,常见于 64 位系统库在/usr/lib64而 configure 只找/usr/lib。解决:用--with-libart-libdir=/usr/lib64显式指定,或者建软链接。我一般先find / -name 'libart_lgpl*'确认实际位置,再决定是加参数还是补链接。
5.4 现象:图能出,但中文或特殊字符显示成方块
原因:rrdtool 1.4.7 编译时没启用 fontconfig,或者 graph 命令没指定字体。解决:确认 configure 输出里 fontconfig 是yes,graph 时加--font DEFAULT:12:/path/to/font.ttf。老监控系统里图上的文字多是英文和数字,但主机名带特殊字符时就会暴露这个问题,提前把字体路径配好省事。
5.5 现象:装完新版本后,老 RRD 文件写入报错但读正常
原因:新版本 rrdtool 默认用新的文件格式写,老前端读不了。解决:1.4.7 本身跟老格式兼容,但如果之前误装过 1.7 并写过文件,那些文件已经被升级了。这种情况只能从备份恢复,或者用rrdtool dump导出再restore到旧格式。血泪经验是:升级 rrdtool 前先备份整个datadir,别等出事了才找后悔药。
6. 装完怎么验证:三条命令确认环境真的跑通
装完不验证,等于没装。我一般按「二进制 → Perl 模块 → 实际画图」三层来验,每层都有明确的通过标准,任何一层不过就停下来查,别往下走。
第一层验二进制和版本。rrdtool --version输出里要能看到1.4.7,同时确认which rrdtool指向我们装的前缀路径,而不是系统旧版本。这一步过不了,后面全是白搭。
# 确认二进制路径和版本 which rrdtool rrdtool --version | head -3第二层验 Perl 绑定和库链接。用服务身份跑 RRDs 加载,再用ldd看二进制链接的库路径,确保没有混入系统旧库。
# 用实际运行监控服务的身份验证 Perl 模块 sudo -u apache perl -MRRDs -e 'print $RRDs::VERSION, "\n"' # 检查动态库链接,确认没有指向系统旧版 ldd $(which rrdtool) | grep -E 'rrd|art'第三层是端到端画图。建一个临时 RRD 文件,更新一个数据点,画一张 PNG,看文件是否生成、大小是否正常。这一步能同时验证 create、update、graph 三个核心功能。
# 建临时 RRD,更新数据,画图,三步走通说明环境完整 rrdtool create /tmp/verify.rrd --start now-60 --step 60 \ DS:test:GAUGE:120:0:100 RRA:AVERAGE:0.5:1:10 rrdtool update /tmp/verify.rrd $(date +%s):42 rrdtool graph /tmp/verify.png --start now-60 --end now \ DEF:v=/tmp/verify.rrd:test:AVERAGE LINE1:v#00FF00:test ls -l /tmp/verify.png三条命令都过,PNG 文件有正常大小,说明这套 rrdtool-1.4.7 环境从编译到运行是通的。这时候再去重启 Smokeping、Cacti、MRTG,基本不会再出依赖层面的问题。从那以后我每次装完 rrdtool,不管多急,都强制把这三层验证走一遍,尤其是用服务身份跑 Perl 那步,能提前揪出权限和路径的坑。希望帮到你。
本文还有配套的精品资源,点击获取