Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1066190
  • 博文数量: 186
  • 博客积分: 4939
  • 博客等级: 上校
  • 技术积分: 2075
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 17:15
文章分类

全部博文(186)

文章存档

2018年(1)

2017年(3)

2016年(11)

2015年(42)

2014年(21)

2013年(9)

2012年(18)

2011年(46)

2010年(35)

分类: PHP

2013-06-05 16:24:15

  1. <?php

  2. /* Logic of this script

  3. if( 1088 is alive)

  4.         {check xxx_scheduler…@fwmrm_status

  5.         return READ or WRITE
  6.         }

  7. else { return WRITE}

  8. Note: when it's WRITE, NSC would take it OOS

  9. */

  10. $status="HTTP/1.1 500 Internal Server Error"; // error 500 by default

  11.     if(stristr($_GET["server"],'Forecast13')){ $instance_id=1; }

  12.         elseif(stristr($_GET["server"],'Forecast12')){ $instance_id=2; }

  13.         else{
  14.         header($status);
  15.         print "ERROR: unknown scheduler server";
  16.         die(1);
  17. }


  18. function check_1088($host)
  19. {

  20. $fp = fsockopen($host,1088,$errno,$errstr,30);

  21. if(!$fp){

  22.    return 0;

  23. } else {
  24.     $out = "GET / HTTP/1.1rn";
  25.     $out .= "Host: forecast12.xxx.net\r\n";
  26.     $out .= "User-Agent: freewheel\r\n";
  27.     $out .= "Connection: Close\r\n\r\n";
  28.     fwrite($fp,$out);

  29.     fclose($fp);

  30. /* Scheduler is alive */

  31. return 1; }

  32. }

  33. if (check_1088($_GET["server"]))

  34. {

  35. $link=mysql_connect('forecast12','user','xxx') // create connection to MySQL Server
  36.         or die("ERROR: cannot connect to MySQL Server!".mysql_error());

  37. $query_str=mysql_real_escape_string("SELECT status FROM forecast_scheduler_instance WHERE instance_id=$instance_id"); // prevent SQL injection

  38. if(!mysql_select_db('fwmrm_status', $link)){ // make sure you can connect to AND select DB...or die
  39.         header($status);
  40.         print "ERROR: cannot select database";
  41.         mysql_close($link);
  42.         die(1);
  43. }

  44. $result=mysql_query($query_str) or die("Error:...".mysql_error());


  45. if(!$result or empty($result)) {
  46.         header($status);
  47.         print "ERROR: null query response";
  48.         mysql_close($link);
  49.         die(1);
  50. }


  51. // Looks good...set HTTP status code 200 and print query response

  52. list($mysql_return_str)=mysql_fetch_row($result);
  53. $status="HTTP/1.1 200 OK";
  54. header($status);
  55. print $mysql_return_str;
  56. mysql_close($link);

  57. } else {

  58. /* Scheduler:1088 is not in service,hence mark it 'WRITE' so that NSC would take it OOS. */

  59. print "WRITE";}
  60. ?>

对后端的infobright做health check ,之简单的检查tcp 3306不够放心,毕竟好多情况下端口开启,但服务不正常。因此写了个php,思路是:通过自定义检查方式,在monitor里填写目的ip/port然后 "GET /xxx.php?server=xxx",首先检查端口是否alive,然后判断该机器是否是维护状态(人为的在database写入一个记录READ/WRITE),最后返给Netscaler , NSC 根据这个判断该service是否正常。

有个问题就是假如目标database/table有问题,健康检查依然会频繁的尝试连接,最后导致user被lock,需要flush host来解锁,此时NSC会把该应用设为down。

p.s 一些补充,

注意为了模拟浏览器的http/1.1,需要在健康检查里面填写

GET /analyticsapp/xxx.php?server=yyyHTTP/1.1\r\nHost:example.host.com\r\nConnection:Close\r\n\r\n


HTTP1.1在Request消息头里头多了一个Host域, HTTP1.0则没有这个域。所以要加上否则web服务器可能会当做一个bad request。

而\r\n是默认的回车标记,后边的connection:close是客户端直接关闭连接,在web服务器开启keepalive的时候可以节约资源,毕竟这个只是一个简单的request.
而http/1.0是没有的。具体内容可以参考Http/1.1的一些东西。


阅读(1803) | 评论(0) | 转发(0) |
0

上一篇:redis和python小试

下一篇:简单认识infobright

给主人留下些什么吧!~~