分享

rabbitmq 消息件在idc机房监控中的应用 - 天狼星技术博客 - 淡定在黑暗和黎明时分!!!

 ShangShujie 2011-01-04


rabbitmq-server是一个消息中间件,由erlang语言写就。erlang号称是能达到六西格玛标准的电信级编程语言,时下很流行撒。IDC服务器监控似乎跟这个东西风马牛不向及啊,呵呵,其实监控本质就是消息的传送。这么就说得通了。
进程自动监控的想法是很早以前就有了,当时的情况是这样的:客服人员经常晚上半夜三更给我打电话,说系统慢啊,不可访问啊,其实我上去一看,90%的 问题出在程序员写的Java程序上,现象非常讨厌,进程是存在的,日志照常甩出,端口依然存活,就是反映慢到死,这个问题到现在也还是无解啊!没办法,只 能够重启应用程序,一重启就好。这么做的次数多了,自己也烦不胜烦。于是就想出个偷懒的主意,能否让客服自己来重启进程呢?当然可以了,给客服个WEB页 面,上面有重启的连接,点击即可。问题也来了,页面么,就用php可以搞定,但是涉及到要重启进程,php显然是不适合做这件事的,理由如下:php运行 的时候是继承了apache设置的权限,缺省应该是nobody,如果用suexec或者其他身份运行,明显就是为php提升了权限,这样很可能会带来大 问题,不可取。比较可行的方法是:php发送消息到消息服务器,然后各服务器跟消息服务器通讯,取出各自的消息,再由本地进程控制重启。这样漏洞比较少。 也没有权限的危险。
具体实现的架构如下:
php提供展示页面,调用stomp协议发送消息;rabbitmq做消息中间服务器,存储并转发消息;服务器端用Python来接收stomp消息,并调用shell命令执行重启等命令。结构图如下:

  


01   rabbitmq-server-1.5.5.tar.gz
02   rabbitmq-stomp-5ee5e2c0b64a.tar.bz2(不要下default.zip那个包,不能用)
03   Python-2.6.2.tgz
04  
05 mkdir -p /data/mq
06 cd /data/mq
08 tar jxvf Python-2.6.2.tar.bz2
09 cd Python-2.6.2
10 ./configure --prefix=/data/python262;make;make install
11 cd ..;rm -rf Python-2.6.2
13 tar zxvf otp_src_R13B.tar.gz
14 cd otp_src_R13B
15 ./configure --prefix=/data/erlang;make;make install
16 cd ..;rm -rf otp_src_R13B
17 export PATH=/data/python262/bin:/data/erlang/bin:$PATH
19 tar zxvf rabbitmq-server-1.5.5.tar.gz
20 ln -s rabbitmq-server-1.5.5 rabbitmq-server
21 cd rabbitmq-server
22 make all
23 cd ..;rm -rf rabbitmq-server-1.5.5.tar.gz
25 tar jxvf rabbitmq-stomp-5ee5e2c0b64a.tar.bz2
26 cd rabbitmq-stomp-5ee5e2c0b64a
27 make
28 cd ..;rm -rf rabbitmq-stomp-5ee5e2c0b64a.tar.bz2
29 vi rabbitmq-server/scripts/rabbitmq-server
30 SERVER_START_ARGS=
31 改成:
32 SERVER_START_ARGS='
33 -pa /data/mq/rabbitmq-stomp-5ee5e2c0b64a/ebin
34 -rabbit
35 stomp_listeners [{"0.0.0.0",61613}]
36 extra_startup_steps [{"STOMP-listeners",rabbit_stomp,kickstart,[]}]'
37 ./rabbitmq-server/scripts/rabbitmq-server -detached
38 #缺省的用户是guest,密码也是guest,这太不安全了,改之:
39 ./rabbitmq-server/scripts/rabbitmqctl delete_user guest
40 ./rabbitmq-server/scripts/rabbitmqctl add_user songxr Loveyou
41 ./rabbitmq-server/scripts/rabbitmqctl map_user_vhost songxr /

  这样rabbitmq+stomp就配置好了。
搜遍了网上的php stomp客户端,有好几个,都是一堆文件,其实我们只用到了一个最简单的功能,就是发送,干脆自己写了个函数:

01 function sendmsg($host,$port,$login,$passcode,$timeout,$msg,$queue) {
02   $msg_connect = "CONNECTnlogin:$loginnpasscode:$passcodennx00";
03   $msg_send = "SENDndestination:$queuenreceipt:oknn$msgx00";
04   $msg_disconnect = "DISCONNECTnnx00";
05   if(!($r = fsockopen($host,$port))) return false;
06   stream_set_timeout($r, $timeout);
07   if(!fwrite($r, $msg_connect.$msg_send.$msg_disconnect)){
08           $md = stream_get_meta_data($r);
09           if($md['timed_out']) return false;
10   }
11   if(!('CONNECTED' == fread($r,9))){
12           $md = stream_get_meta_data($r);
13           if($md['timed_out']) return false;
14   }
15   fread($r,44);
16   $md = stream_get_meta_data($r);
17   if($md['timed_out']) return false;
18   if(!("RECEIPTnreceipt-id:ok" == fread($r,21))){
19           $md = stream_get_meta_data($r);
20           if($md['timed_out']) return false;
21   }
22   if (!(strstr(fgets($r,100),'access_refused'))) {
23           fclose($r);
24           return true;
25   }else{
26           fclose($r);
27           return false;
28   }
29 }

  发送端程序下载:mqphp.tar.gz

  各个客户端的Python端采用Jason R Briggs的stomp类,加上daemon类和实际执行的server.py和shell脚本,一共四个文件:
接收端程序下载:mq.tar.gz

  用这个方法就可以远程管理机房的服务器进程了,当然最后别忘了为php程序加上口令密码验证……

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多