HAProxy

HAProxy 是一款开源负载均衡软件,同时提供4层(TCP)和7层(HTTP)代理。

负载均衡

由于普通机器单机处理能力以及可靠性的限制,服务需要在多台机器进行部署,形成集群。 这里,主要有两方面的考虑:

  1. 提高可靠性;
  2. 提高处理能力;

那么,用户(或客户端)如何访问多实例服务呢?

最简单的方案是在客户端进行重试。 以 DNS 解析为例,可以配置多台 DNS 服务器,一台查询失败则尝试另外一台:

../_images/bb73a4fcd260578b645659c6dfd968f1.png

客户端重试

这显然不是最佳的方案,客户端需要支持连接多台服务器,需要自带服务状态探测功能, 还需要具备切换能力。

一个更科学的架构是,提供一台服务器作为接入代理,为客户端访问实际服务器:

../_images/6a1276e4ac55c2597729ae0551084ffd.gif

负载均衡

在这种模式下,客户端只是直接访问代理服务器,由代理服务器将请求转发到后面的处理服务器。 而且,转发对客户端来说是透明的,跟访问一台服务器没啥区别。

此外,技术人员还可以在代理服务器上实现更强大的架构功能:

  1. 代理服务器检查后端服务器状态,及时剔除故障服务器;
  2. 代理服务器控制转发流量,处理能力强的服务器可以多分配一些流量;

这种架构就是 负载均衡 架构,这里的代理服务器就是 负载均衡服务器 。 而 HAProxy 就是运行在负载均衡服务器之上,提供负载均衡能力的那个软件服务。

安装部署

Ubuntu 为例,使用 apt 进行安装:

$ apt install haproxy

对于 Linux 系统, Haproxy 的配置一般存在 /etc 目录之下。 以 Ubuntu 为例,路径是 /etc/haproxy/haproxy.cfg 。 根据实际场景编辑配置文件,然后重启服务即可生效:

$ service haproxy restart

4层负载均衡

下面是以一个实际例子介绍4层负载均衡的配置方式。 这个故事是笔者为了科学上网,操碎心的故事。

最开始,在美国加州买了一台虚拟机,部署上 Shadowsocks 服务端,在国内访问。 加州虽然挺遥远,延迟到部分时间在 200 毫秒不到,还是可以接受的。 但是,有时网络质量突然变差,丢包率急剧上升,几乎不可用。 虽然持续时间不会很长,但是在关键时刻确实很烦人。

为了解决这个问题,笔者又在香港买了另一台虚拟机,双保险科学上网。 平时哪台连不上就切到另一台,基本上没有不可用的情况。 顺便提一下,香港的服务器确实快,我从广州连过去延迟基本在 20 毫秒以下。

一台贵的香港服,一台便宜的加州服作为备胎,问题算是解决了。 然而,手工切来切去很不爽呀!

这时,我想起在广州还有一台服务器呢! 我在上面部一个 HAProxy 服务,将 TCP 连接分发到两台 Shadowsocks 不就好了吗? 于是,下图横空出世:

../_images/bb0878dce5b5e85224e64c2f6208d69a.png

科学上网架构

广州节点 HAProxy 的配置如下:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode    tcp
    option  dontlognull
    contimeout 5000
    clitimeout 50000
    srvtimeout 50000

listen ss-proxy 0.0.0.0:443
    mode tcp
    maxconn 1024
    balance roundrobin
    server hk xxx.xxx.xxx.xxx:443 check
    server ca xxx.xxx.xxx.xxx:443 check

这里采用 tcp 模式,也就是 4层负载均衡 模式。 我的配置分为 globaldefaults 以及 listen 总共 3 节:

global 节主要是一些全局配置,包括日志、运行用户、组以及运行模式等。

defaults 节主要是一些默认配置,包括代理模式、连接超时时长等。

listen 节是重点所在,定义了服务绑定的地址及端口、代理模式、后端服务器以及负载均衡算法等。 例子中,侦听端口是 443 ,转发到两台后端服务器,分别是香港服( hk )以及加州服( ca )。

客户端连接到 HAProxy 之后,就不用动不动切换服务器了——爽!

../_images/fa48a31d52eaa2d04a30e8ddf1dcafe3.png

无须切换服务器

权重调整

listen ss-proxy 0.0.0.0:443
    mode tcp
    maxconn 1024
    balance roundrobin
    server hk xxx.xxx.xxx.xxx:443 weight 256
    server ca xxx.xxx.xxx.xxx:443 weight 1

健康检查

listen ss-proxy 0.0.0.0:443
    mode tcp
    maxconn 1024
    balance roundrobin
    server hk xxx.xxx.xxx.xxx:443 check inter 2s fastinter 1s
    server ca xxx.xxx.xxx.xxx:443 check inter 2s fastinter 1s

下一步

如果你想知道如何实现科学上网,可以看看 Shadowsocks

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../_images/wechat-mp-qrcode.png

小菜学编程

参考文献

微信打赏