使用HAProxy对MySQL进行负载均衡和状态监控

标签: Web架构/负载/性能 haproxy master memcached MySQL / DB | 发表时间:2011-06-24 17:07 | 作者:Michael Kevin
出处:http://www.toplee.com/blog

转载请保留原文内容,并声明转载地址:http://www.toplee.com/blog/1284.html

乐搜(lesoo.com)使用HAProxy已经很久了,但主要用在前端web请求的负载均衡和状态监控上,对于后端的Memcached以及MySQL却一直没有应用,最近对系统架构进行了小规模的整理,把MySQL也收编到了HAProxy下,经过一段时间的使用,体验还是不错的。

详细的HAProxy的安装配置我就不说了,主要针对HAProxy如何监控检测后端MySQL服务器的状态说两句。

我们的环境由两台master和若干台slave数据库组成,在HA的配置中,可以设置灵活的策略和进行slave的分组,如果系统更大了,将还会根据业务系统来拆分若干个master和slave组。

声明:以下内容应用和验证环境是基于 FreeBSD 8.2 环境,MySQL在5.1以上版本,理论上 Linux 的各个版本基本都能通过,如果有不能通过的情况,请别随意张口扔板砖,欢迎添加评论留言向我提问

HA对MySQL状态监控实现的方式很多,不过大多逻辑都一样,使用自己编写的脚本程序(可以是shell、php、perl等你熟悉的语言)监控mysql的运行情况,然后通过HTTP的方式输出运行结果给HA,我使用的是shell程序来实现的监控,结合 FreeBSD的inetd服务来实现监控端口的提供

1. 监控脚本编写

下面是我写的一段监控shell脚本,用于监控其中一台叫mdb1的master数据库replication运行:

  1. #!/usr/local/bin/bash
  2. MYSQL_HOST="mdb1"
  3. MYSQL_PORT="3307"
  4. MYSQL_USERNAME="michael"
  5. MYSQL_PASSWORD="[email protected]"
  6.  
  7. /usr/local/bin/mysql -h$MYSQL_HOST -P$MYSQL_PORT -u$MYSQL_USERNAME -p$MYSQL_PASSWORD -e "show slave status\G;" > /tmp/check_mdb1_rep.txt
  8. iostat=`grep "Slave_IO_Running" /tmp/check_mdb1_rep.txt  |awk '{print $2}'`
  9. sqlstat=`grep "Slave_SQL_Running" /tmp/check_mdb1_rep.txt |awk '{print $2}'`
  10. #echo iostat:$iostat and sqlstat:$sqlstat
  11. if [ "$iostat" = "Yes" ] && [ "$sqlstat" = "Yes" ];
  12. then
  13. # mysql is fine, return http 200
  14. /bin/echo "HTTP/1.1 200 OK\r\n"
  15. /bin/echo "Content-Type: Content-Type: text/plain\r\n"
  16. /bin/echo "\r\n"
  17. /bin/echo "MySQL ($MYSQL_HOST:$MYSQL_PORT) replication is running.\r\n"
  18. /bin/echo "\r\n"
  19. else
  20. # mysql is down, return http 503
  21. /bin/echo "HTTP/1.1 503 Service Unavailable\r\n"
  22. /bin/echo "Content-Type: Content-Type: text/plain\r\n"
  23. /bin/echo "\r\n"
  24. /bin/echo "MySQL ($MYSQL_HOST:$MYSQL_PORT) replication  is *down*.\r\n"
  25. /bin/echo "\r\n"

上面的代码大概有点shell脚本编写经验的都能明白什么意思,就是用mysql 命令连接指定数据库并 -e 方式执行MySQL命令 “show slave status\G”,用以输出当前MySQL服务器的replication运行状况,里面会有两个主要的状态参数Slave_IO_Running和Slave_SQL_Running, 这两个参数用于表示当前数据库的replication运行是否正常,如果有一个是No,则表示数据库同步歇菜了,把状态据结果通过Linux的管道命令输出到 /tmp/check_mdb1_rep.txt文件(你可以自己随便改个文件名),再使用grep和awk命令把文件中想要的两个参数文本行读取出来并拆分,最后判断是否都是“Yes”, 对于正常情况,我们输出一个HTTP协议标准的header头信息,里面包含关键的Code 200或者Code 503,这个其实就是HAProxy监控最终需要的东西。

上面的解释如果有不明白的,可以留言来问我。

把以上这段代码保存为一个文件,比如 /bin/mdb1_replication.sh ,记得 chmod +x

2. 把脚本变成一个系统TCP监听服务

编写/etc/service文件,在末尾添加如下一行

  1. mdb1_replication 8822/tcp

这段代码的意思就是定义一个系统的服务,名称叫mdb1_replication, 占用8822端口,使用TCP协议访问(这里名称和端口可以自己定义,只要不和系统别的服务重名和端口重复即可)

然后编写/etc/inetd.conf,在文件末尾添加如下一行

  1. mdb1_replication stream tcp nowait root /bin/mdb1_replication.sh mdb1_replication

这段代码的意思是添加一个接受系统inetd管理的服务,服务名称是前面提到的mdb1_replication, 执行的脚本是 /bin/mdb1_replication.sh,其他的几个参数意思就自己man inetd.conf看看吧

然后运行修改运行 /etc/rc.d/inetd restart 启动服务

运行 netstat -anl |grep 8822 看看是否服务和端口起来了,没有起来的话,检查检查哪里出错了,看看系统日志。

最后执行 telnet localhost 8822,正常应该看到如下运行结果

  1. %telnet localhost 8822
  2. Trying 127.0.0.1...
  3. Connected to localhost.
  4. Escape character is '^]'.
  5. HTTP/1.1 200 OK\r\n
  6. Content-Type: Content-Type: text/plain\r\n
  7. \r\n
  8. MySQL (mdb2:3307) replication is running.\r\n
  9. \r\n
  10. Connection closed by foreign host.
  11. %

3. 配置Haproxy的监控

在HA配置文件中添加类似下面的部分内容

  1. listen mdb_3307 192.168.0.8:3307
  2. mode tcp
  3. maxconn 100
  4. balance roundrobin
  5. option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
  6. server www1:3307 www1:3307 weight 1 check port 9922 inter 2s rise 2 fall 2
  7. server mdb2:3307 mdb2:3307 weight 3 check port 9922 inter 2s rise 2 fall 2 backup
  8. option tcpka

上面这段配置我就不过多说明了,这是HAProxy的配置语法,如果对HA有不明白的地方,欢迎讨论。

补充: 目前我们的系统已经实现了 Nginx / Memcached / Sphinx / MySQL 等各个后端应用的负载均衡和状态监控,还有短信报警等环节,有兴趣讨论交流的,欢迎和我联络!

相关 [haproxy mysql 负载均衡] 推荐:

使用HAProxy对MySQL进行负载均衡和状态监控

- Kevin - Michael`s blog
转载请保留原文内容,并声明转载地址:http://www.toplee.com/blog/1284.html. 乐搜(lesoo.com)使用HAProxy已经很久了,但主要用在前端web请求的负载均衡和状态监控上,对于后端的Memcached以及MySQL却一直没有应用,最近对系统架构进行了小规模的整理,把MySQL也收编到了HAProxy下,经过一段时间的使用,体验还是不错的.

Haproxy+KeepAlived 负载均衡

- - CSDN博客系统运维推荐文章
软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现. LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. 还可以使用nginx来实现,不过nginx只工作在7层网络之上. 详细请参考 抚琴煮酒写的“ 软件级负载均衡器(LVS/HAProxy/Nginx)的特点简介和对比”这篇文章,简单很详细,很好.

haproxy负载均衡 xtracluster

- - x-marker的博客
上一篇为xtracluster的安装(http://xmarker.blog.163.com/blog/static/226484057201472610520306/),本篇将记录下使用haproxy在三个数据节点做负载均衡,haproxy可以安装在数据节点,也可以安装在别的节点,如果安装在数据节点,需要注意端口号不能和mysql的3306冲突.

RabblitMQ Cluster + HAProxy(负载均衡)

- - 飞翔的荷兰人
        在本节中,我们主要来学习软件负载均衡器HAProxy在RabbitMQ集群中的使用.         软件负载均衡器HAProxy.         HAProxy的特点是:.         1、HAProxy是支持虚拟主机的,,并能支持上万级别的连接;.         2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;.

使用haproxy做TCP协议负载均衡

- - 行业应用 - ITeye博客
之前有使用过Nginx进行tcp负载均衡,但后来发现nginx总是会跟服务端进行断开连接、断开连接的操作,所以选择一下别的代理进行处理. 写这个的时候,我也只是把haproxy运行成功,而且简单测试了一下,具体适不适合自己的系统还有待测试. 1.下载haproxy:. 从主页下载,我使用的是最新版本,haproxy-1.4.24.tar.gz.

常见分布式负载均衡工具介绍nginx lighttpd haproxy

- - 互联网 - ITeye博客
       在架构系统的时候,通常会涉及到分布式,而处分布式里面最前端的是负载均衡器(当然还有cdn). 在网上搜寻一份,对目前常见的负载均衡器做一些介绍和常见组合,不涉及具体配置. 第一种是常见的硬件有比较昂贵的NetScaler、F5、Radware和Array等商用的负载均衡器,它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用;.

基于域名负载均衡的Haproxy配置

- - 互联网 - ITeye博客
log 127.0.0.1 local0 info #[err warning info debug] //日志位置. daemon #设置成后台运行. nbproc 1 #进程数量. option httplog #http日志格式. retries 3 #三次失败后认为服务器不可用. option redispatch #如果cookie写入了serverId而客户端不会刷新cookie,当serverId对应的服务器挂掉后,强制定向到其他健康的服务器.

(总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解

- - 服务器运维与网站架构|Linux运维|X研究
PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术. 具体的应用需求还得具体分析,如果是中小型的Web应用,比如日PV小于1000万,用Nginx就完全可以了;如果机器不少,可以用DNS轮询,LVS所耗费的机器还是比较多的;大型网站或重要的服务,且服务器比较多时,可以考虑用LVS.

软件级负载均衡器(LVS/HAProxy/Nginx)的特点简介和对比

- - 开源软件 - ITeye博客
原文: http://andrewyu.blog.51cto.com/1604432/697466. 现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术:. 在这里我也有一点要跟大家申明下:很多朋友担心软件级别的负载均衡在高并发流量冲击下的稳定情况,事实是我们通过成功上线的许多网站发现,它们的稳定性也是非常好的,宕机的可能性微乎其微,所以我现在做的项目,基本上没考虑服务级别的高可用了.

atlas+lvs+keepalived mysql多主复制负载均衡搭建

- - x-marker的博客
1.1 mysql数据节点:. 三个节点为xtradb cluster节点. 1.2 keepalived节点:. 虚拟ip为192.168.1.201 . haproxy节点(仅为了对比lvs的性能才安装的):db169(部署在xtradb cluster的一个节点上). 1.3 atlas节点:和xtradb cluster节点部署在一起,也为三个节点.