HAProxy高可用负载均衡服务器配置

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

负载均衡

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

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

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

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

这显然不是最佳的方案,客户端需要支持连接多台服务器,需要自带服务状态探测功能, 还需要具备切换能力。更科学的架构是提供一台服务器作为接入代理,为客户端访问实际服务器:

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

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

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

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

安装部署

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

1
$ apt install haproxy

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

1
$ service haproxy restart

四层负载均衡

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

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

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

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

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

广州节点 HAProxy 的配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 之后,就不用动不动切换服务器了——爽!

权重调整

1
2
3
4
5
6
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

健康检查

1
2
3
4
5
6
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

小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: