我们有时会遇到这样的尴尬:
1、发现我们的数据库被更新了,却很难很快定位,是那个页面中那个程序执行了这条语句,尤其是大部分sql语句是很多变量组织起来的,根本无法用grep查找。
2、我们发现某一页面被频繁调用,却无法迅速确定属于DNS轮询中的那个服务器
正因为如此,这次整理了一个几年前写的php mysql扩展的补丁,这个补丁在mysql_query函数内部,发送一条信息给接收服务器,这样所有服务器的数据查询和操作语句都可以发送到统一的服务器上,跟这个日志我们可以迅速解决以上的问题。
但是由于是一个补丁,每次升级php都要改写一遍,所以这次将这部分直接改为一个PHP扩展 dbMonitor ,现在我们大多时候采用的各种PHP框架,都对数据库做了封装,我们就可以在php 框架的合适部分加上这个函数,把sql语句发送出去。
特点:信息发送采用UDP协议
一、信息接收服务器 EventDbMonitor 的安装。
1、安装libevent
wget http://www.monkey.org/~provos/libevent-1.4.4-stable.tar.gz
tar -xvzf libevent-1.4.4-stable.tar.gz
cd libevent-1.4.4-stable
./configure
make&&make install
2、安装log4c
下载 log4c-1.2.1,解压缩
./configure
make&&make install
3、安装 EventDbMonitor
tar -xvzf EventDbMonitor.tgz
cd EventDbMonitor
./configure --prefix=/usr/local/eventdbmonitor
make&&make install
二、运行服务器
要运行Eventdbmonitor ,先要设置 /etc/ld.so.conf 将刚才安装 libevent , log4c的 路径 /usr/local/lib加入,然后运行ldconfig
然后我们到 cd /usr/local/eventdbmonitor/bin目录下
./eventdbmonitor -D 就可以了,这时候可以用pstree看到启动了一个进程
程序参数如下:
--help 打印帮助信息
-I, --ip set listion ip (default:0.0.0.0).
-D, --daemon Run as daemon on background.
-l, --log-level set the loglevel (0,1,2,3,4,5,6,7: emergency ... debug.
-L, --log-path set the path of log file (default:stdout).
-p, --port bind the server on this port (default: 8088).
-v, --version Show the version.
-h, --help Show this page.
注意--log-path 要指定全路径以及日志文件名称,如果不指定这项参数,则会输出在当前目录event.log 文件中。
三、安装PHP扩展 dbMonitor
下载dbMonitor扩展,并解压缩
cd dbMonitor
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make&&make install
编辑php.ini文件,启动扩展
这时候你会看到phpinfo中有dbMonitor的输出信息。
四、使用PHP扩展
<?
dbmonitor_send("127.0.0.1",8088,"sssssssssssssssssssss");
?>
目前只有这个函数,分别是服务器IP地址,端口,你发送的信息。
运行一次试试。
去看看event.log日志文件
Wed Jun 25 13:47:14 2008 [info] 127.0.0.1:57983 [dbmonitor_send]-[/root/xieyingwu/dbmonitor_php5/tests/001.phpt]-[24]-[sssssssssssssssssssss]
格式为
时间 level IP:port [函数]-[文件]-[行数]-[信息]
如果你用awk分析这个日志能很快得到你需要得到的信息。
开源项目地址:http://code.google.com/p/sqlmonitor/
下载地址:http://code.google.com/p/sqlmonitor/downloads/list



