MyCat 之路 | Haproxy+Mycat实现负载均衡

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liupeifeng3514/article/details/82797097

本文基于如下的拓扑图


                   +-------------+
                   |   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 服务器的配置完全一样。

[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 48700
tcp6       0      0 :::48700                :::*                    LISTEN      25154/xinetd  

六、启动服务器


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

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

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

[root@mycat-server-02 ~]# /usr/local/mycat/bin/mycat console

可以看到 MyCat 启动成功的信息:

jvm 1    | 2017-11-28 14:46:43,857 [INFO ][WrapperSimpleAppMain] localhost1 index:0 init success  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:265) 
jvm 1    | MyCAT Server startup successfully. see logs in logs/mycat.log
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. 检查脚本的可执行权限;
  2. 检查脚本中的逻辑和语法是否正确。

问题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 问题

可以按照上面的方法进行决解。

猜你喜欢

转载自blog.csdn.net/liupeifeng3514/article/details/82797097
今日推荐