最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小采 时间:2020-11-09 19:49:14
文档

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

用HAProxy来检测MySQL复制的延迟的教程_MySQL:在MySQL世界里,HAProxy 通常来作为软件负载均衡器使用。彼得.博罗什在过去的邮件中解释了如何使用percona xtradb集群(pxc)来对其设置。所以它只发送查询到可应用的节点。同样的方法可用于常规主从设置来读取负载并分散到多个从节点。不过,使用MySQL复
推荐度:
导读用HAProxy来检测MySQL复制的延迟的教程_MySQL:在MySQL世界里,HAProxy 通常来作为软件负载均衡器使用。彼得.博罗什在过去的邮件中解释了如何使用percona xtradb集群(pxc)来对其设置。所以它只发送查询到可应用的节点。同样的方法可用于常规主从设置来读取负载并分散到多个从节点。不过,使用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%

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

    $ less agent.php
    = 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实例,这样运行:

    $ php agent.php 6789 3306
    

    你还需要指定MySQL用户:

    mysql> GRANT REPLICATION CLIENT ON *.* TO 'haproxy'@'127.0.0.1' IDENTIFIED BY 'haproxy_pwd';
    

    代理启动后,你可以检测一下它是否正常运行:

    # 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,您可以编辑代理的代码,可以对复制的延迟进行测量 。

    声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

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

    用HAProxy来检测MySQL复制的延迟的教程_MySQL:在MySQL世界里,HAProxy 通常来作为软件负载均衡器使用。彼得.博罗什在过去的邮件中解释了如何使用percona xtradb集群(pxc)来对其设置。所以它只发送查询到可应用的节点。同样的方法可用于常规主从设置来读取负载并分散到多个从节点。不过,使用MySQL复
    推荐度:
    标签: php 延迟 ha
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top