本文将概述一些自己在使用中的问题(并不会给出step by step的使用介绍),以供参考,详细信息请留言。
既然别人的轮子已经很好用了,我自己就不发明了。使用Cacti可以较为快速搭建一个MySQL性能监控平台:
Cacti是一个用于监控网络流量、主机负载的工具,并可以将这些采集到的数值信息转换为图形展示。Cacti使用RRDtool实现数据存储和绘图,可以方便、美观的实现数据图形化。通过给Cacti增加MySQL的
监控模板,就能够实现对MySQL相关参数的监控和图形展示。
一、 安装中的问题
Cacti的安装是一个复杂的工程,需要安装PHP(需要某些模块)、httpd、RRDtool等。
1. php缺少某些模块
如果你用的是默认安装php,你可能甚至连mysql模块都没有,这时候,你需要给你php安装上一些需要的模块。例如:mysql,curl等。
2. RRDtool版本
Cacti使用RRDtool存储数据、绘制图形。这里需要注意的是,在安装好RRDtool后,必需要到Cacti的后台,填写RRDtool的相关配置,例如安装路径、版本等。
二、 使用中的问题
1. 数据接近0的时候,显示奇怪的数据
如下图,在数据接近于0的时候我们会看到数据显示的是100m:
事实上,这里的单位 m 表示微,即需要除以1000。100m表示0.1。
Cacti中使用如下单位:M(兆)、K(千)、m(微)。
2. 日志中的奇怪错误
在Cacti运行一段时间后,我在Cacti的log中看到如下错误:CMDPHP: Poller[0] Host[16] DS[25] WARNING: Result from CMD not valid. Partial Result: U…… 貌似这是一个
bug。将Poller Type改为
spine可以避免这个问题。
3. 采集到异常数据
Cacti有时会采集到一些异常的数据,例如,采集到一些非常大(比正常数据大100倍)。这时候,绘制图形的时候,会看到纵坐标的比例会被这些数据拉大到K甚至M,以至于正常数据已经无法观察了。
导致这种异常数据的原因有很多,这里给出两个剔除这些异常的办法
- 先用rrdtool dump出RRA文件中的数据,删除异常数据,然后使用rrdtool restore数据
- 修改Cacti模板中的Data Source模板,设置一个合理的最大值(Maximum Value)
4. 采集使用的MySQL用户需要什么权限
因为需要执行SHOW /*!50002 GLOBAL */ STATUS、SHOW SLAVE STATUS、SHOW /*!50000 ENGINE*/ INNODB STATUS等权限,所以一般需要如下权限设置:
GRANT PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'cacti'@'%'
需要注意的是,不需要ALL PRIVILEGES。
三、 一些改进
1. 修改采集、展示数据的步长(interval)
默认下,Cacti是每隔五分钟采集一次数据,并存放到rra文件中,现在希望修改为每隔一份采集、展示相关数据。我们需要做如下修改:
- 选择console=>Settings=>Poller,把其中的Poller Interval和Cron Interval改为Every Minute。
- 修改crontab中的采集脚本为*/1 * * * * php /www/cacti/poller.php > /dev/null 2>&1
- 最后,你还需要修改Data Template中的step值,将其修改为60
2. 批量增加Device
如果待监控的主机数量很多的时候,一台台添加Device是很痛苦的,可以通过编写一些脚本来实现批量增加Device。
这里提供一个编写批量脚本的思路:通过编写一个页面接收添加Device时,需要Post的表单的数据,然后使用curl模拟表单提交。实践证明这种方式是可行的,事实上,我就使用这样的脚本来批量添加Device的。
3. 我的主机端口不是3306
使用mysql-cacti-templates模板的时候,如果你的端口不是3306的话,mysql-cacti-templates中的脚本是无法正确的连接目标主机的MySQL的。这时候,只需对模板中的采集脚本做一个小小的修改就可以了。大约在脚本的226行下面增加如下内容
$conn = @mysql_connect($options['host'], $user, $pass);
//Modified by orczhou
//Now we'll try some other Ports.
if ( !$conn ) {
$conn = @mysql_connect($options['host'].":3307", $user, $pass);
}
这就是我在使用过程中遇到的一些问题与解决,你有什么好的经验呢?分享一下吧