使用HAProxy对MySQL进行负载均衡和状态监控
乐搜(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运行:
- #!/usr/local/bin/bash
- MYSQL_HOST="mdb1"
- MYSQL_PORT="3307"
- MYSQL_USERNAME="michael"
- MYSQL_PASSWORD="michael@lesoo.com"
- /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
- iostat=`grep "Slave_IO_Running" /tmp/check_mdb1_rep.txt |awk '{print $2}'`
- sqlstat=`grep "Slave_SQL_Running" /tmp/check_mdb1_rep.txt |awk '{print $2}'`
- #echo iostat:$iostat and sqlstat:$sqlstat
- if [ "$iostat" = "Yes" ] && [ "$sqlstat" = "Yes" ];
- then
- # mysql is fine, return http 200
- /bin/echo "HTTP/1.1 200 OK\r\n"
- /bin/echo "Content-Type: Content-Type: text/plain\r\n"
- /bin/echo "\r\n"
- /bin/echo "MySQL ($MYSQL_HOST:$MYSQL_PORT) replication is running.\r\n"
- /bin/echo "\r\n"
- else
- # mysql is down, return http 503
- /bin/echo "HTTP/1.1 503 Service Unavailable\r\n"
- /bin/echo "Content-Type: Content-Type: text/plain\r\n"
- /bin/echo "\r\n"
- /bin/echo "MySQL ($MYSQL_HOST:$MYSQL_PORT) replication is *down*.\r\n"
- /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文件,在末尾添加如下一行
- mdb1_replication 8822/tcp
这段代码的意思就是定义一个系统的服务,名称叫mdb1_replication, 占用8822端口,使用TCP协议访问(这里名称和端口可以自己定义,只要不和系统别的服务重名和端口重复即可)
然后编写/etc/inetd.conf,在文件末尾添加如下一行
- 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,正常应该看到如下运行结果
- %telnet localhost 8822
- Trying 127.0.0.1...
- Connected to localhost.
- Escape character is '^]'.
- HTTP/1.1 200 OK\r\n
- Content-Type: Content-Type: text/plain\r\n
- \r\n
- MySQL (mdb2:3307) replication is running.\r\n
- \r\n
- Connection closed by foreign host.
- %
3. 配置Haproxy的监控
在HA配置文件中添加类似下面的部分内容
- listen mdb_3307 192.168.0.8:3307
- mode tcp
- maxconn 100
- balance roundrobin
- option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
- server www1:3307 www1:3307 weight 1 check port 9922 inter 2s rise 2 fall 2
- server mdb2:3307 mdb2:3307 weight 3 check port 9922 inter 2s rise 2 fall 2 backup
- option tcpka
上面这段配置我就不过多说明了,这是HAProxy的配置语法,如果对HA有不明白的地方,欢迎讨论。
补充: 目前我们的系统已经实现了 Nginx / Memcached / Sphinx / MySQL 等各个后端应用的负载均衡和状态监控,还有短信报警等环节,有兴趣讨论交流的,欢迎和我联络!
建议继续学习:
- Mysql监控指南 (阅读:19794)
- 解析nginx负载均衡 (阅读:14506)
- 批量添加主机到cacti+nagios的监控报警系统中 (阅读:13273)
- 我常用的主机监控shell脚本 (阅读:11503)
- 7 天打造前端性能监控系统 (阅读:10121)
- 如何监控HP服务器硬件状态 (阅读:9109)
- Cacti 添加 Nginx 监控 (阅读:8919)
- Linux下三种常用的流量监控软件对比 (阅读:8688)
- Cacti 添加 Memcached 监控 (阅读:8117)
- Cacti 添加 Apache 监控 (阅读:7578)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Michael 来源: Michael`s blog
- 标签: HAProxy 监控 负载均衡
- 发布时间:2011-09-20 22:37:39
- [54] IOS安全–浅谈关于IOS加固的几种方法
- [52] android 开发入门
- [52] 如何拿下简短的域名
- [51] 图书馆的世界纪录
- [49] Oracle MTS模式下 进程地址与会话信
- [49] Go Reflect 性能
- [47] 【社会化设计】自我(self)部分――欢迎区
- [46] 读书笔记-壹百度:百度十年千倍的29条法则
- [37] 程序员技术练级攻略
- [29] 视觉调整-设计师 vs. 逻辑