各位用户为了找寻关于用HAProxy来检测MySQL复制的延迟的教程的资料费劲了很多周折。这里教程网为您整理了关于用HAProxy来检测MySQL复制的延迟的教程的相关资料,仅供查阅,以下为您介绍关于用HAProxy来检测MySQL复制的延迟的教程的详细内容
在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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41$ less agent.php
<!--?php
// Simple socket server
// See http://php.net/manual/en/function.stream-socket-server.php
$port
=
$argv
[1];
$mysql_port
=
$argv
[2];
$mysql
=
"/usr/bin/mysql"
;
$user
=
'haproxy'
;
$password
=
'haproxy_pwd'
;
$query
=
"SHOW SLAVE STATUS"
;
function
set_weight(
$lag
){
# Write your own rules here
if
(
$lag
==
'NULL'
){
return
"down"
;
}
else
if
(
$lag
< 10){
return
"up 100%"
;
}
else
if
(
$lag
-->= 10 &&
$lag
< 60){
return
"up 50%"
;
}
else
return
"up 5%"
;
}
set_time_limit(0);
$socket
= stream_socket_server(
"tcp://127.0.0.1:$port"
,
$errno
,
$errstr
);
if
(!
$socket
) {
echo
"
$errstr
(
$errno
)
n";
}
else
{
while
(
$conn
= stream_socket_accept(
$socket
,9999999999999)) {
$cmd
=
"$mysql -h127.0.0.1 -u$user -p$password -P$mysql_port -Ee "
$query
" | grep Seconds_Behind_Master | cut -d ':' -f2 | tr -d ' '"
;
exec
(
"$cmd"
,
$lag
);
$weight
= set_weight(
$lag
[0]);
unset(
$lag
);
fputs
(
$conn
,
$weight
);
fclose (
$conn
);
}
fclose(
$socket
);
}
?>
如果你希望脚本从端口6789发出连接到运行在3306端口上的MySQL实例,这样运行:
? 1$ php agent.php 6789 3306
你还需要指定MySQL用户:
? 1mysql>
GRANT
REPLICATION CLIENT
ON
*.*
TO
'haproxy'
@
'127.0.0.1'
IDENTIFIED
BY
'haproxy_pwd'
;
代理启动后,你可以检测一下它是否正常运行:
? 1 2 3 4 5 6# telnet 127.0.0.1 6789
Trying 127.0.0.1...
Connected
to
127.0.0.1.
Escape
character
is
'^]'
.
up 100%
Connection
closed
by
foreign
host.
假设它运行在本地的应用服务器上,有两个复制正在运行(192.168.10.2和192.168.10.3),应用的读请求在3307端口,你需要在HAProxy中配置一个前端和后端,像这样:
代码如下: frontend read_only-front bind *:3307 mode tcp option tcplog log global default_backend read_only-back backend read_only-back mode tcp balance leastconn server slave1 192.168.10.2 weight 100 check agent-check agent-port 6789 inter 1000 rise 1 fall 1 on-marked-down shutdown-sessions server slave2 192.168.10.3 weight 100 check agent-check agent-port 6789 inter 1000 rise 1 fall 1 on-marked-down shutdown-sessions
现在所有的都准备好了,现在让我们看看怎么使用HAProxy来动态的改变重滞服务器,代码如下:
代码如下: # Slave1 $ mysql -Ee "show slave status" | grep Seconds_Behind_Master Seconds_Behind_Master: 0 # Slave2 $ mysql -Ee "show slave status" | grep Seconds_Behind_Master Seconds_Behind_Master: 0 # HAProxy $ echo "show stat" | socat stdio /run/haproxy/admin.sock | cut -d ',' -f1,2,18,19 # pxname,svname,status,weight read_only-front,FRONTEND,OPEN, read_only-back,slave1,UP,100 read_only-back,slave2,UP,100 read_only-back,BACKEND,UP,200
时延1
代码如下: # Slave1 $ mysql -Ee "show slave status" | grep Seconds_Behind_Master Seconds_Behind_Master: 25 # Slave2 $ mysql -Ee "show slave status" | grep Seconds_Behind_Master Seconds_Behind_Master: 0 # echo "show stat" | socat stdio /run/haproxy/admin.sock | cut -d ',' -f1,2,18,19 # pxname,svname,status,weight read_only-front,FRONTEND,OPEN, read_only-back,slave1,UP,50 read_only-back,slave2,UP,100 read_only-back,BACKEND,UP,150
时延2
代码如下: # Slave1 $ mysql -Ee "show slave status" | grep Seconds_Behind_Master Seconds_Behind_Master: 0 # Slave2 $ mysql -Ee "show slave status" | grep Seconds_Behind_Master Seconds_Behind_Master: NULL # echo "show stat" | socat stdio /run/haproxy/admin.sock | cut -d ',' -f1,2,18,19 # pxname,svname,status,weight read_only-front,FRONTEND,OPEN, read_only-back,slave1,UP,100 read_only-back,slave2,DOWN (agent),100 read_only-back,BACKEND,UP,100
结论
在HAProxy 1.5中代理检查是一个很好的新增功能。 在上面的设置中是简单的: 举例来说, 如果 HAProxy 连接代理失败,它就不会被标记。 推荐与代理检查一起,保持常规的健康度检查。
细心的读取者们(reads)将会注意到这个配置,如果在所有节点上都被复制, HAProxy将会停止发送给读取者. 这可能不是最好的解决方案。但可能的选项是:停止代理并标记服务器为UP,使用状态套接字(socket)或者添加主节点作为备份服务器。
最后一点,使用Percona工具集的pt-heartbeat替代Seconds_Behind_Master,您可以编辑代理的代码,可以对复制的延迟进行测量 。