Mycat系列—Haproxy+Mycat实现负载均衡
Posted 互联网有啥事
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mycat系列—Haproxy+Mycat实现负载均衡相关的知识,希望对你有一定的参考价值。
本文基于如下的拓扑图:
+-------------+
| uplink |
+-------------+
|
|
+-------------+
| haproxy |
+-------------+
|
+------------------+------------------+
| | |
+-------------+ +-------------+ +-------------+
| MyCat01 | | MyCat02 | | MyCat03 |
+-------------+ +-------------+ +-------------+
一、在一台服务器上安装 Haproxy
haproxy的安装请参考:HAProxy系列—Linux下的安装、HAProxy系列—配置文件详解
二、修改 Haproxy 的配置文件
这里我们使用轮询的调度方式。
~]# vim /usr/local/haproxy/conf/haproxy.cfg
global
log 127.0.0.1 local0 ##记日志的功能
maxconn 4096
chroot /usr/local/haproxy
daemon
defaults
log global
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
listen admin_status
bind 192.168.1.5:1080 ##VIP
stats uri /stats ##统计页面
stats auth admin:admin
mode http
option httplog
listen allmycat_service
bind 192.168.1.5:8096 ##转发到 mycat 的 8066 端口,即 mycat 的服务端口
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
balance roundrobin
server mycat_64 192.168.1.64:8066 check port 48700 inter 5s rise 2 fall 3
server mycat_83 192.168.1.83:8066 check port 48700 inter 5s rise 2 fall 3
timeout server 20000
listen allmycat_admin
bind 192.168.1.5:8097 ##转发到 mycat 的 9066 端口,即 mycat 的管理控制台端口
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
balance roundrobin
server mycat_64 192.168.1.64:9066 check port 48700 inter 5s rise 2 fall 3
server mycat_83 192.168.1.83:9066 check port 48700 inter 5s rise 2 fall 3
timeout server 20000
三、在其他三台服务器上安装MyCat
mycat 的安装请参考:Mycat系列—Linux下Mycat的安装配置
四、修改 MyCat 的配置文件
因为使用轮询的调度方式,没有其他的特殊规则,所以三台 MyCat 服务器的配置完全一样。
[root@mycat-server-01 ~]# vim /usr/local/mycat/conf/schema.xml
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1" />
<dataNode name="dn1" dataHost="localhost1" database="mldn" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 修改成实际的服务器地址,用户名和密码 -->
<writeHost host="hostM1" url="192.168.1.50:3306" user="root"
password="888888">
</writeHost>
</dataHost>
</mycat:schema>
修改 server.xml 文件,添加可以使用的用户名和密码,还有数据库。
[root@mycat-server-01 ~]# vim /usr/local/mycat/conf/server.xml
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
五、配置监听 mycat 是否存活
在所有 Mycat server 上都需要添加检测端口 48700 的脚本,为此需要用到 xinetd,xinetd 为
linux 系统的基础服务。
1、如果 xinetd 没有安装,使用如下命令安装:
[ ]
2、检查/etc/xinetd.conf 的末尾是否有这一句:includedir /etc/xinetd.d,没有就加上
[ ]
3、检查 /etc/xinetd.d 文件夹是否存在,不存在也加上
[ ]
[ ]
4、增加 /etc/xinetd.d/mycat_status
监听 mycat 是否存活的配置,执行以下命令:
~]# vim /etc/xinetd.d/mycat_status
service mycat_status
{
flags = REUSE
socket_type = stream
port = 48700
wait = no
user = root
server = /usr/local/mycat/bin/mycat_status
log_on_failure += USERID
disable = no
}
5、增加 /usr/local/mycat/bin/mycat_status 脚本
[root@mycat-server-01 ~]# vim /usr/local/mycat/bin/mycat_status
#/usr/local/mycat/bin/mycat_status
# This script checks if a mycat server is healthy running on localhost. It will
# return:
#
# "HTTP/1.x 200 OK\r" (if mycat is running smoothly)
#
# "HTTP/1.x 503 Internal Server Error\r" (else)
mycat=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`
if [ "$mycat" = "0" ];
then
/bin/echo -e "HTTP/1.1 200 OK\r\n"
else
/bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
fi
给新增脚本赋予可执行权限:
[root@mycat-server-01 ~]# chmod a+x /usr/local/mycat/bin/mycat_status
6、/etc/services 中加入 mycat_status 服务
在末尾加入以下内容:
[ ]
mycat_status 48700/tcp
重启 xinetd 服务
[ ]
7、验证 mycat_status 服务是否启动成功
如果成功会现实如下内容:
[root@mycat-server-01 ~]# netstat -antup|grep 48700
tcp6 0 0 :::48700 :::* LISTEN 25154/xinetd
六、启动服务器
按一下顺序启动所有的服务器。
1、先启动所有的 MyCat 服务器
在这里使用 console 方式启动 MyCat 服务器,主要是为了方便观察输出信息。
[ ]
2、然后启动 Haproxy 服务器
[ ]
从另一个窗口可以看到 Haproxy 启动信息:
[root@haproxy-server-master ~]# tail -f /var/log/haproxy.log
Nov 28 14:46:47 localhost haproxy[7636]: Server allmycat_admin/mycat_64 is UP, reason: Layer7 check passed, code: 200, info: "OK", check duration: 118ms. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.
Nov 28 14:46:50 localhost haproxy[7636]: Server allmycat_service/mycat_64 is UP, reason: Layer7 check passed, code: 200, info: "OK", check duration: 68ms. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.
Nov 28 14:47:59 localhost haproxy[7852]: Proxy admin_status started.
Nov 28 14:47:59 localhost haproxy[7852]: Proxy allmycat_service started.
Nov 28 14:47:59 localhost haproxy[7852]: Proxy allmycat_admin started.
可以看到已经启动成功。
至于那些测试,这里就不写了,小伙伴们自己来测试一下吧。测试的时候可以通过 MyCat 服务器的窗口来观察请求被分配到哪个服务器上。
附、配置过程中遇到的问题
1、遇到 haproxy[5633]: proxy allmycat_admin has no server available! 问题
此时一定要到 haproxy 的日志文件查看具体的错误信息,进行分析。
[root@haproxy-server-master ~]# tail -200 /var/log/haproxy.log
Nov 28 12:52:08 localhost haproxy[6333]: Server allmycat_service/mycat_64 is DOWN, reason: Layer7 invalid response, info: "/usr/local/mycat/bin/mycat_status:<E8><A1><8C>9: mycat: <E6><9C><AA><E6><89><BE><E5><88><B0><E5><91><BD><E4><BB><A4>", check duration: 67ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Nov 28 12:52:09 localhost haproxy[6333]: Server allmycat_service/mycat_83 is DOWN, reason: Layer7 invalid response, info: "/usr/local/mycat/bin/mycat_status:<E8><A1><8C>9: mycat: <E6><9C><AA><E6><89><BE><E5><88><B0><E5><91><BD><E4><BB><A4>", check duration: 90ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Nov 28 12:52:09 localhost haproxy[6333]: proxy allmycat_service has no server available!
Nov 28 12:52:10 localhost haproxy[6333]: Server allmycat_admin/mycat_64 is DOWN, reason: Layer7 invalid response, info: "/usr/local/mycat/bin/mycat_status:<E8><A1><8C>9: mycat: <E6><9C><AA><E6><89><BE><E5><88><B0><E5><91><BD><E4><BB><A4>", check duration: 95ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Nov 28 12:52:11 localhost haproxy[6333]: Server allmycat_admin/mycat_83 is DOWN, reason: Layer7 invalid response, info: "/usr/local/mycat/bin/mycat_status:<E8><A1><8C>9: mycat: <E6><9C><AA><E6><89><BE><E5><88><B0><E5><91><BD><E4><BB><A4>", check duration: 82ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Nov 28 12:52:11 localhost haproxy[6333]: proxy allmycat_admin has no server available!
通过错误信息可以看到,我们写的脚本 /usr/local/mycat/bin/mycat_status 存在问题,此时有两个方面可以进行检查:
检查脚本的可执行权限;
检查脚本中的逻辑和语法是否正确。
问题1:添加可执行权限:
[root@mycat-server-01 ~]# chmod a+x /usr/local/mycat/bin/mycat_status
问题2:检查脚本中的逻辑和语法是否正确:
[root@mycat-server-01 ~]# /usr/local/mycat/bin/mycat_status
/usr/local/mycat/bin/mycat_status:行9: mycat: 未找到命令
HTTP/1.1 503 Service Unavailable
可以看到明显的,修改一下:
由:
mycat =`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`
改为:
mycat=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`
把 mycat= 之间的空格去掉。
2、遇到 reason: Layer7 invalid response 问题
可以按照上面的方法进行决解。
以上是关于Mycat系列—Haproxy+Mycat实现负载均衡的主要内容,如果未能解决你的问题,请参考以下文章
# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用