• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 用HAProxy来检测MySQL复制的延迟的教程

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了haproxy mysql,haproxy教程,haproxy,haproxy配置文件详解,haproxy keepalived等相关知识,希望本文的分享对您有所帮助

 在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.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);
}
?>
</div>

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

$ php agent.php 6789 3306
</div>

你还需要指定MySQL用户:
 

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

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

# 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.
</div>

假设它运行在本地的应用服务器上,有两个复制正在运行(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</div>

现在所有的都准备好了,现在让我们看看怎么使用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 </div>

时延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 </div>

时延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 </div>

结论

在HAProxy 1.5中代理检查是一个很好的新增功能。 在上面的设置中是简单的: 举例来说, 如果 HAProxy 连接代理失败,它就不会被标记。 推荐与代理检查一起,保持常规的健康度检查。

细心的读取者们(reads)将会注意到这个配置,如果在所有节点上都被复制, HAProxy将会停止发送给读取者. 这可能不是最好的解决方案。但可能的选项是:停止代理并标记服务器为UP,使用状态套接字(socket)或者添加主节点作为备份服务器。

最后一点,使用Percona工具集的pt-heartbeat替代Seconds_Behind_Master,您可以编辑代理的代码,可以对复制的延迟进行测量 。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2018-12-05SQL Server 2005 模板参数使用说明
  • 2018-12-05mysql自增长AUTO_INCREMENT实例用法
  • 2018-12-05MSSQL 删除数据库里某个用户所有表里的数据
  • 2018-12-05linux系统用户管理与grep正则表达式详解
  • 2017-05-11MySQL插入数据时插入无效列的解决方法
  • 2018-12-05关于优化步骤的详细介绍
  • 2018-12-05linux如何实现定时备份mysql数据库(代码)
  • 2018-12-05CPU资源和可用内存大小对数据库性能有何影响?
  • 2018-12-05PHP学习散记 2012_01_07(MySQL)
  • 2017-05-11强制修改mysql的root密码的六种方法分享(mysql忘记密码)

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MySQL主从同步、读写分离配置步骤
    • mysql使用备份工具ibbackup进行数据库备份
    • linux下指定mysql数据库服务器主从同步的配置实例
    • MySQL之——如何防止人为误操作MySQL数据库
    • 详解mysql5.7.17 winx64.zip安装配置的方法(图文)
    • MySQL索引优化和in or替换为union all
    • 远程无法连接SQL2000及MySQL的原因和解决办法
    • mysql中用于数据迁移存储过程分享
    • 如何解决mysqlimport: Error: 13, Can't get stat of 的问题
    • linux修改mysql数据库文件的路径

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有