HAProxy实现mycat集群的负载均衡

发布时间 2023-04-02 17:17:53作者: 周文豪

上文我们已经实现了mycat集群(https://www.cnblogs.com/zwh0910/p/17278863.html),现在我们来实现mycat集群的负载均衡

在前面架构中,虽然对mycat做了集群,保障了mycat的可靠性,但是,应用程序需要连接到多个mycat,显然不是很友好的,也就是说缺少负载均衡的组件,接下来我们来了解下HAProxy。

一、HAProxy简介

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理

HAProxv特别适用于那些负载特大的web5站点,这些站点通常又需要会话保持或七层外理。HAProxy云行在当前的硬件上,完全可以支持数以万计的并发连接。并目它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(UserSpace)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

包括 GitHub,Bitbucket、Stack Overfilow、Reddit,Tumblr、Twitter和 Tuenti在内的知名网站,及亚马逊网服务系统都使用了HAProxy。

官网: http://www.haproxy.org/

 关于并发性能,haproxy可以做到千万级的并发。(当然了,运行环境不同,测试结果也不相同的)

架构

二、部署安装HAProxy

我们依然是通过 docker进行安装。

拉取镜像

docker pull haproxy:2.5.13

创建目录,用于存放配置文件

mkdir /root/haproxy

编写配置文件:

cd haproxy/
vim haproxy.cfg

内容如下:

global
    log     127.0.0.1 local2
    maxconn   4000
    daemon
defaults
    mode          http
    log           global
    option         httplog
    option         dontlognull
    option http-server-close
    option forwardfor    except 127.0.0.0/8
    option         redispatch
    retries         3
    timeout http-request  10s
    timeout queue      1m
    timeout connect     10s
    timeout client     1m
    timeout server     1m
    timeout http-keep-alive 10s
    timeout check      10s
    maxconn         3000
listen  admin_stats
    bind  0.0.0.0:4001
    mode http
    stats uri    /dbs
    stats realm Global\ statistics
    stats auth  admin:admin123
listen  proxy-mysql
    bind  0.0.0.0:4002
    mode tcp
    balance roundrobin
    option  tcplog
    server  mycat1 localhost:8066 check port 8066 maxconn 2000
    server  mycat2 localhost:8067 check port 8067 maxconn 2000

global为全局配置,defaults为默认配置,listen为监听,admin_stats为管理界面,端口为4001,登录认证的账号为admin,密码为admin123,uri为浏览器访问的路径IP:prot/uri。proxy-mysql为mysql代理,端口为4002,采用的负载均衡策略balance为roundrobin。

云服务器要放开4001和4002端口

保存退出

创建容器

docker create --name haproxy --net host -v /root/haproxy:/usr/local/etc/haproxy haproxy:2.5.13

启动容器:

docker restart haproxy && docker logs -f haproxy

结果如下:

[root@hecs-140905 haproxy]# docker restart haproxy && docker logs -f haproxy
haproxy
[NOTICE]   (1) : haproxy version is 2.5.13-6f0edfa
[NOTICE]   (1) : path to executable is /usr/local/sbin/haproxy
[WARNING]  (1) : config : 'option forwardfor' ignored for proxy 'proxy-mysql' as it requires HTTP mode.
[NOTICE]   (1) : New worker (8) forked
[NOTICE]   (1) : Loading success.

浏览器访问:http://114.115.246.152:4001/dbs,显示如下:

输入haproxy.cfg文件中配置的用户名admin,密码admin123,点击登录后进入如下页面:

测试通过haproxy代理连接到两个mycat

注意:用户名和密码使用mycat的用户和密码

打开TB_AD表,

此时已经实现了通过haproxy代理对接两个mycat,并且两个mycat又分别对接到两个mysql集群。亲测有效