最近工作需要,碰到一个大量rrd写入的IO问题,决定使用rrdcached。
rrdcached官方文档:http://oss.oetiker.ch/rrdtool/doc/rrdcached.en.html
中文翻译(感谢翻译者):http://blog.chinaunix.net/space.php?uid=17196076&do=blog&id=2817737
本次使用rrdtool的最新版,rrdtool-1.4.7
下载地址:
http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.7.tar.gz
另外业务使用php来读写rrd文件,因此需要调用php的rrdtool extension,注意,一定要1.4.x版本以上,以前用的php_rrdtool.tar.gz和rrdtool.so是不支持rrdcached的。
最新版rrd.so源码下载:
http://pecl.php.net/package/rrd
rrd.so(原来叫rrdtool.so)的编译安装:
然后在php.ini里填上extension=rrd.so
之后
然后启动rrdcached,启动参数自己根据需要,参考官方文档进行调整
#注意对sock文件的权限进行修改,否则php将无法读取,web是我启动php的用户,你们改成自己的。
随后添加环境变量
这样的话,在命令行中使用/usr/local/rrdtool/bin/rrdtool update命令时,数据就会先存储到rrdcached中。
若想要php支持rrdcached,则需在PHP代码的开头加入:
如此,将RRDCACHED_ADDRESS也注册到php的环境变量中,这样才会生效,这一点官方文档和网上都没有明确的说法,自己测试了好久,orz,好吧,我笨。
然后通过 nc -U /dev/shm/rrdcached.sock ,再输入stats回车,即可看到rrdcached是否正常工作,例如:
没钱,好痛苦…… _(:3」∠)_
rrdcached官方文档:http://oss.oetiker.ch/rrdtool/doc/rrdcached.en.html
中文翻译(感谢翻译者):http://blog.chinaunix.net/space.php?uid=17196076&do=blog&id=2817737
本次使用rrdtool的最新版,rrdtool-1.4.7
下载地址:
http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.7.tar.gz
另外业务使用php来读写rrd文件,因此需要调用php的rrdtool extension,注意,一定要1.4.x版本以上,以前用的php_rrdtool.tar.gz和rrdtool.so是不支持rrdcached的。
最新版rrd.so源码下载:
http://pecl.php.net/package/rrd
rrd.so(原来叫rrdtool.so)的编译安装:
tar -zxvf rrd-1.1.0.tgz
cd rrd-1.1.0
/usr/local/php/bin/phpize
ln -s /usr/local/rrdtool/lib/librrd.so.4 /lib64/librrd.so.4
#不知是否我的人品问题,如果不做软连接,则会提示:
#error: rrd lib version seems older than 1.3.0, update to 1.3.0+
#configure会直接退出,检查config.log才发现conftest找不到librrd.so.4,故做软链接
./configure --with-php-config=/usr/local/php/bin/php-config
make
cp modules/rrd.so /usr/lib
然后在php.ini里填上extension=rrd.so
之后
[root@localhost rrd-1.1.0]# /usr/local/php/bin/php -i | grep rrd
rrd
rrd tool module => enabled
rrd tool module version => 1.1.0
rrdtool library version => 1.4.7 #看到这行则成功
RRDCACHED_ADDRESS => unix:/dev/shm/rrdcached.sock
PWD => /root/rrd-1.1.0
_SERVER["RRDCACHED_ADDRESS"] => unix:/dev/shm/rrdcached.sock
_SERVER["PWD"] => /root/rrd-1.1.0
然后启动rrdcached,启动参数自己根据需要,参考官方文档进行调整
#注意对sock文件的权限进行修改,否则php将无法读取,web是我启动php的用户,你们改成自己的。
/usr/local/rrdtool/bin/rrdcached -l unix:/dev/shm/rrdcached.sock -s web -F -w 3600 -z 3600 -f 86400
chown web.web /dev/shm/rrdcached.sock
随后添加环境变量
echo 'export RRDCACHED_ADDRESS="unix:/dev/shm/rrdcached.sock"' >> /etc/profile
这样的话,在命令行中使用/usr/local/rrdtool/bin/rrdtool update命令时,数据就会先存储到rrdcached中。
若想要php支持rrdcached,则需在PHP代码的开头加入:
putenv("RRDCACHED_ADDRESS=unix:/dev/shm/rrdcached.sock");
如此,将RRDCACHED_ADDRESS也注册到php的环境变量中,这样才会生效,这一点官方文档和网上都没有明确的说法,自己测试了好久,orz,好吧,我笨。
顺便给出一小段测试代码,初学者随手写的……大牛们勿喷……
<?php
#phpinfo();
putenv("RRDCACHED_ADDRESS=unix:/dev/shm/rrdcached.sock");
$opts_cpu = array( "--step", "1",
"--start",time()-10,
"DS:ds0:GAUGE:2:0:90000000000",
"RRA:MAX:0.5:1:600"
);
$fname = "/home/web/rrd/Liv.rrd";
$ret = rrd_create($fname, $opts_cpu);
if($ret == 0) {
$err = rrd_error();
error_log(time()."|Liv|-1|create|".$err);
}
else{
for($i = 0; $i < 10; $i++) {
mt_srand((double)microtime()*1000000*getmypid());
$rrdtime = time();
$data = mt_rand();
echo $data."\r\n";
sleep(2);
$uret = rrd_update($fname, array("$rrdtime:$data"));
if($uret == 0) {
$err = rrd_error();
error_log(time()."|Liv|-1|update|".$err);
}
}
}
然后通过 nc -U /dev/shm/rrdcached.sock ,再输入stats回车,即可看到rrdcached是否正常工作,例如:
[root@localhost ~]# nc -U /dev/shm/rrdcached.sock
stats
9 Statistics follow
QueueLength: 0
UpdatesReceived: 18794128
FlushesReceived: 1
UpdatesWritten: 963771
DataSetsWritten: 17810163
TreeNodesNumber: 98816
TreeDepth: 20
JournalBytes: 0
JournalRotate: 0
没钱,好痛苦…… _(:3」∠)_
PS : 有兴趣的可以google一下这篇论文:Application Buffer-Cache Management for Performance:Running the World’s Largest MRTG