视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
用HAProxy来检测MySQL复制的延迟的教程
2020-11-09 21:01:06 责编:小采
文档


 在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
    <!--?php
    // Simple socket server
    // See http://php.com/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);
    }
    ?>
    

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

    $ php agent.php 67 3306
    

    你还需要指定MySQL用户:
     

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

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

    # telnet 127.0.0.1 67
    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 67 inter 1000  rise 1  fall 1 on-marked-down shutdown-sessions
    server slave2 192.168.10.3 weight 100 check agent-check agent-port 67 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,您可以编辑代理的代码,可以对复制的延迟进行测量 。

    您可能感兴趣的文章:

  • 深入mysql主从复制延迟问题的详解
  • 利用pt-heartbeat监控MySQL的复制延迟详解
  • 下载本文
    显示全文
    专题