HAProxy

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

负载均衡

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

  • 提高可靠性;
  • 提高处理能力;

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

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

../_images/bb73a4fcd260578b645659c6dfd968f1.png 客户端重试

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

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

../_images/6a1276e4ac55c2597729ae0551084ffd.gif 负载均衡

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

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

  • 代理服务器检查后端服务器状态,及时剔除故障服务器;
  • 代理服务器控制转发流量,处理能力强的服务器可以多分配一些流量; 这种架构就是 负载均衡 架构,这里的代理服务器就是 负载均衡服务器 。而 HAProxy 就是运行在负载均衡服务器之上,提供负载均衡能力的那个软件服务。

安装部署

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

  1. $ apt install haproxy

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

  1. $ service haproxy restart

4层负载均衡

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

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

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

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

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

../_images/bb0878dce5b5e85224e64c2f6208d69a.png 科学上网架构

广州节点 HAProxy 的配置如下:

  1. global
  2. log /dev/log local0
  3. log /dev/log local1 notice
  4. chroot /var/lib/haproxy
  5. user haproxy
  6. group haproxy
  7. daemon
  8. defaults
  9. log global
  10. mode tcp
  11. option dontlognull
  12. contimeout 5000
  13. clitimeout 50000
  14. srvtimeout 50000
  15. listen ss-proxy 0.0.0.0:443
  16. mode tcp
  17. maxconn 1024
  18. balance roundrobin
  19. server hk xxx.xxx.xxx.xxx:443 check
  20. server ca xxx.xxx.xxx.xxx:443 check

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

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

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

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

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

../_images/fa48a31d52eaa2d04a30e8ddf1dcafe3.png 无须切换服务器

权重调整

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

健康检查

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

下一步

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

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

../_images/wechat-mp-qrcode.png 小菜学编程

参考文献

微信打赏