首页 > 数据库 > MySQL > 正文

用HAProxy来检测MySQL复制的延迟的教程

2024-07-24 13:07:01
字体:
来源:转载
供稿:网友
这篇文章主要介绍了用HAProxy来检测MySQL复制的延迟的教程,HAProxy需要使用到PHP脚本,需要的朋友可以参考下
 

 在MySQL世界里,HAProxy 通常来作为软件负载均衡器使用。彼得.博罗什在过去的邮件中解释了如何使用percona xtradb集群(pxc)来对其设置。所以它只发送查询到可应用的节点。同样的方法可用于常规主从设置来读取负载并分散到多个从节点。不过,使用MySQL复制,另一个因素开始发挥作用:复制延迟。在这种情况下,被提及到的 Percona xtraDB 集群以及我们提出只返回“向上”或者“向下”的检查方法行不通。我们将希望依赖其复制延迟来调整内部Haproxy的一个权重。这就是我们要做的在这篇文章中使用HAProxy 1.5。

HAProxy的代理检测


HAProxy 1.5运行我们运行一个代理检测,这是一项可以添加到常规健康检测项的检测。代理检测的好处是返回值可以是‘up'或 ‘down',但也可以是个权重值。

代理是什么呢?它是一个简单的可以访问给定端口上TCP连接的程。所以,如果我们要在一台MySQL服务器上运行代理,这需要:

  •     如果不运行复制的话确保服务在HAProxy上是停止的
  •     如果复制延迟小于10s,设置weight为100%
  •     如果延迟大于等于10s,小于50s,设置weight为50%
  •     在其他情况下设置weight为5%


我们可以使用这样一个脚本:

  1. $ less agent.php 
  2. <!--?php 
  3. // Simple socket server 
  4. // See http://php.net/manual/en/function.stream-socket-server.php 
  5. $port = $argv[1]; 
  6. $mysql_port = $argv[2]; 
  7. $mysql = "/usr/bin/mysql"
  8. $user = 'haproxy'
  9. $password = 'haproxy_pwd'
  10. $query = "SHOW SLAVE STATUS"
  11. function set_weight($lag){ 
  12.   # Write your own rules here 
  13.   if ($lag == 'NULL'){ 
  14.     return "down"
  15.   } 
  16.   else if ($lag < 10){ 
  17.     return "up 100%"
  18.   } 
  19.   else if ($lag -->= 10 && $lag < 60){ 
  20.     return "up 50%"
  21.   } 
  22.   else 
  23.     return "up 5%"
  24. set_time_limit(0); 
  25. $socket = stream_socket_server("tcp://127.0.0.1:$port", $errno, $errstr); 
  26. if (!$socket) { 
  27.   echo "$errstr ($errno) 
  28. n"; 
  29. else { 
  30.   while ($conn = stream_socket_accept($socket,9999999999999)) { 
  31.     $cmd = "$mysql -h127.0.0.1 -u$user -p$password -P$mysql_port -Ee "$query" | grep Seconds_Behind_Master | cut -d ':' -f2 | tr -d ' '"
  32.     exec("$cmd",$lag); 
  33.     $weight = set_weight($lag[0]); 
  34.     unset($lag); 
  35.     fputs ($conn, $weight); 
  36.     fclose ($conn); 
  37.   } 
  38.   fclose($socket); 
  39. ?> 


 

 

如果你希望脚本从端口6789发出连接到运行在3306端口上的MySQL实例,这样运行:
 

  1. $ php agent.php 6789 3306 
?
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表