rabbitmq消息件在idc機房監控中的應用

  rabbitmq-server是一個消息中間件,由erlang語言寫就。erlang號稱是能達到六西格瑪標準的電信級編程語言,時下很流行撒。IDC服務器監控似乎跟這個東西風馬牛不向及啊,呵呵,其實監控本質就是消息的傳送。這麼就說得通了。
   進程自動監控的想法是很早以前就有了,當時的情況是這樣的:客服人員經常晚上半夜三更給我打電話,說系統慢啊,不可訪問啊,其實我上去一看,90%的問 題出在程序員寫的Java程序上,現象非常討厭,進程是存在的,日誌照常甩出,端口依然存活,就是反映慢到死,這個問題到現在也還是無解啊!沒辦法,只能 夠重啓應用程序,一重啓就好。這麼做的次數多了,自己也煩不勝煩。於是就想出個偷懶的主意,能否讓客服自己來重啓進程呢?當然可以了,給客服個WEB頁 面,上面有重啓的連接,點擊即可。問題也來了,頁面麼,就用php可以搞定,但是涉及到要重啓進程,php顯然是不適合做這件事的,理由如下:php運行 的時候是繼承了apache設置的權限,缺省應該是nobody,如果用suexec或者其他身份運行,明顯就是爲php提升了權限,這樣很可能會帶來大 問題,不可取。比較可行的方法是:php發送消息到消息服務器,然後各服務器跟消息服務器通訊,取出各自的消息,再由本地進程控制重啓。這樣漏洞比較少。 也沒有權限的危險。
  具體實現的架構如下:
  php提供展示頁面,調用stomp協議發送消息;rabbitmq做消息中間服務器,存儲並轉發消息;服務器端用Python來接收stomp消息,並調用shell命令執行重啓等命令。結構圖如下:

  所用到的軟件:
  rabbitmq-server-1.5.5.tar.gz
  rabbitmq-stomp-5ee5e2c0b64a.tar.bz2(不要下default.zip那個包,不能用)
  Python-2.6.2.tgz
mkdir -p /data/mq
cd /data/mq
wget http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2
tar jxvf Python-2.6.2.tar.bz2
cd Python-2.6.2
./configure --prefix=/data/python262;make;make install
cd ..;rm -rf Python-2.6.2
wget http://erlang.org/download/otp_src_R13B.tar.gz
tar zxvf otp_src_R13B.tar.gz
cd otp_src_R13B
./configure --prefix=/data/erlang;make;make install
cd ..;rm -rf otp_src_R13B
export PATH=/data/python262/bin:/data/erlang/bin:$PATH
wget http://www.rabbitmq.com/releases/rabbitmq-server/v1.5.5/rabbitmq-server-1.5.5.tar.gz
tar zxvf rabbitmq-server-1.5.5.tar.gz
ln -s rabbitmq-server-1.5.5 rabbitmq-server
cd rabbitmq-server
make all
cd ..;rm -rf rabbitmq-server-1.5.5.tar.gz
wget http://hg.rabbitmq.com/rabbitmq-stomp/archive/5ee5e2c0b64a.tar.bz2
tar jxvf rabbitmq-stomp-5ee5e2c0b64a.tar.bz2
cd rabbitmq-stomp-5ee5e2c0b64a
make
cd ..;rm -rf rabbitmq-stomp-5ee5e2c0b64a.tar.bz2
vi rabbitmq-server/scripts/rabbitmq-server
SERVER_START_ARGS=
改成:
SERVER_START_ARGS='
-pa /data/mq/rabbitmq-stomp-5ee5e2c0b64a/ebin
-rabbit
stomp_listeners [{"0.0.0.0",61613}]
extra_startup_steps [{"STOMP-listeners",rabbit_stomp,kickstart,[]}]'

./rabbitmq-server/scripts/rabbitmq-server -detached
#缺省的用戶是guest,密碼也是guest,這太不安全了,改之:
./rabbitmq-server/scripts/rabbitmqctl delete_user guest
./rabbitmq-server/scripts/rabbitmqctl add_user songxr Loveyou
./rabbitmq-server/scripts/rabbitmqctl map_user_vhost songxr /

  這樣rabbitmq+stomp就配置好了。
  搜遍了網上的php stomp客戶端,有好幾個,都是一堆文件,其實我們只用到了一個最簡單的功能,就是發送,乾脆自己寫了個函數:

function sendmsg($host,$port,$login,$passcode,$timeout,$msg,$queue) {
  $msg_connect = "CONNECTnlogin:$loginnpasscode:$passcodennx00";
  $msg_send = "SENDndestination:$queuenreceipt:oknn$msgx00";
  $msg_disconnect = "DISCONNECTnnx00";
  if(!($r = fsockopen($host,$port))) return false;
  stream_set_timeout($r, $timeout);
  if(!fwrite($r, $msg_connect.$msg_send.$msg_disconnect)){
          $md = stream_get_meta_data($r);
          if($md['timed_out']) return false;
  }
  if(!('CONNECTED' == fread($r,9))){
          $md = stream_get_meta_data($r);
          if($md['timed_out']) return false;
  }
  fread($r,44);
  $md = stream_get_meta_data($r);
  if($md['timed_out']) return false;
  if(!("RECEIPTnreceipt-id:ok" == fread($r,21))){
          $md = stream_get_meta_data($r);
          if($md['timed_out']) return false;
  }
  if (!(strstr(fgets($r,100),'access_refused'))) {
          fclose($r);
          return true;
  }else{
          fclose($r);
          return false;
  }
}

  發送端程序下載:mqphp.tar.gz
  各個客戶端的Python端採用Jason R Briggs的stomp類,加上daemon類和實際執行的server.py和shell腳本,一共四個文件:
  接收端程序下載:mq.tar.gz
  用這個方法就可以遠程管理機房的服務器進程了,當然最後別忘了爲php程序加上口令密碼驗證......
Popularity: 95% [?]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章