Mycat系列—Haproxy+Mycat实现负载均衡

Posted 互联网有啥事

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mycat系列—Haproxy+Mycat实现负载均衡相关的知识,希望对你有一定的参考价值。

本文基于如下的拓扑图:

 +-------------+ | uplink | +-------------+ | | +-------------+ | haproxy | +-------------+  | +------------------+------------------+ | | |+-------------+ +-------------+ +-------------+| MyCat01 | | MyCat02 | | MyCat03 |+-------------+ +-------------+ +-------------+

一、在一台服务器上安装 Haproxy

haproxy的安装请参考:HAProxy系列—Linux下的安装、HAProxy系列—配置文件详解

二、修改 Haproxy 的配置文件

这里我们使用轮询的调度方式。

[root@haproxy-server-master ~]# 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
<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><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 没有安装,使用如下命令安装:
[root@mycat-server-01 ~]# yum install xinetd -y
2、检查/etc/xinetd.conf 的末尾是否有这一句:includedir /etc/xinetd.d,没有就加上
[root@mycat-server-01 ~]# vim /etc/xinetd.conf
3、检查 /etc/xinetd.d 文件夹是否存在,不存在也加上
[root@mycat-server-01 ~]# ls /etc/ | grep xinetd.d[root@mycat-server-01 ~]# mkdir /etc/xinetd.d
4、增加 /etc/xinetd.d/mycat_status

监听 mycat 是否存活的配置,执行以下命令:

[root@mycat-server-01 ~]# 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
#!/bin/bash#/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 服务

在末尾加入以下内容:

[root@mycat-server-01 ~]# vim /etc/services
mycat_status 48700/tcp # mycat_status

重启 xinetd 服务

[root@mycat-server-01 ~]# service xinetd restart
7、验证 mycat_status 服务是否启动成功

如果成功会现实如下内容:

[root@mycat-server-01 ~]# netstat -antup|grep 48700tcp6 0 0 :::48700 :::* LISTEN 25154/xinetd

六、启动服务器

按一下顺序启动所有的服务器。

1、先启动所有的 MyCat 服务器

在这里使用 console 方式启动 MyCat 服务器,主要是为了方便观察输出信息。

[root@mycat-server-02 ~]# /usr/local/mycat/bin/mycat console
2、然后启动 Haproxy 服务器
[root@haproxy-server-master ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg

从另一个窗口可以看到 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实现负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

HAProxy+Keepalived实现Mycat高可用

06mycat使用haproxy进行负载均衡

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用

7基于 HA 机制的 Mycat 高可用--mycat

HAproxy连接Mycat集群docker-compose版

Haproxy+mycat+mysql集群搭建和高可用