0%
HAProxy分析#001#编译安装指南

上节 我们主要讲解了HAProxy的基本知识,以及事关HAProxy的重要资源。我们知道HAProxy是众多负载均衡器中非常重要的一个,而本系列文章就是围绕其使用、管理以及原理来展开。在深度学习之前,我们先安装HAProxy,运行起来,直观感受下它的魅力。

源代码下载

使用上文提供的下载链接,下载到本地服务器上:

1
$ wget http://www.haproxy.org/download/2.8/src/haproxy-2.8.3.tar.gz

编译

HAProxy的编译相当简单,不用configure、不用cmake,系统给我们提供了Makefile文件,按照指引设置make参数即可编译成功。

我们先忽略掉所有编译选项,按照下面的方法编译一个版本出来测试。至于具体选项的特定含义,以及其他高级选项,后续再慢慢道来。


先安装依赖包:

1
2
3
4
$ sudo apt-get install libpcre3-dev -y
$ sudo apt-get install libssl-dev -y
$ sudo apt-get install liblua5.3-dev -y
$ sudo apt-get install libsystemd-dev

然后编译代码:

1
2
3
$ tar -zxvf haproxy-2.8.3.tar.gz
$ cd haproxy-2.8.3
$ make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_PCRE=1 USE_SYSTEMD=1

无报错即成功,在当前目录下会生成我们需要的可执行程序haproxy。

七层负载均衡测试方案

HAProxy支持四层和七层负载均衡,我们先做个简单的七层负载测试。测试方案如下:

  • 我们在同一台服务器上部署两个WebServer和一个HAProxy
  • WebServerA监听192.168.0.45:8081端口,其index.html页面内容为“WebServerA”
  • WebServerB监听192.168.0.45:8082端口,其index.html页面内容为“WebServerB”
  • HAProxy作为前端机,监听192.168.0.45:8080端口,HAProxy负载均衡算法采用轮询算法
  • 多次使用命令“curl http://192.168.0.45:8080/index.html ” 向HAProxy发起调用请求
  • 成功标准:我们多次调用curl,控制台依次轮流打印WebServerA,WebServerB,WebServerA,WebServerB……

七层负载均衡测试

首先,我们定制七层负载均衡测试用的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
global
log /tmp/log local0
log /tmp/log local1 notice
stats timeout 30s

defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000

frontend frontend_www_example_com
bind 192.168.0.45:8080
mode http
option httplog
log global
default_backend backend_www_example_com

backend backend_www_example_com
balance roundrobin
server web-node1 192.168.0.45:8081 check inter 2000 rise 30 fall 15
server web-node2 192.168.0.45:8082 check inter 2000 rise 30 fall 15


将上述内容保存为 haproxy-7.cfg 文件(右键另存为)。然后使用如下命令启动HAProxy(启动haproxy之前,先启动webserver)。

1
$ ./haproxy -f ./haproxy-7.cfg

启动之后如下图:


我们在另外一个控制台,使用curl向haproxy发起请求,控制台输出如下:

可见输出与我们的预期一致,说明haproxy完美的对两台WebServer进行了轮询负载均衡调用。

四层负载均衡测试方案

四层负载均衡测试方案如下:

  • 使用Echo服务做测试,EchoServer返回时带上本机的信息用作区分
  • 测试工具下载:EchoServerEchoClient
  • 编译EchoServer:g++ -g -o echoserver echoserver.cpp
  • 编译EchoClient:g++ -g -o echoclient echoclient.cpp
  • 我们在同一台服务器上部署两个EchoServer和一个HAProxy
  • EchoServerA监听192.168.0.45:5001端口,启动命令:./echoserver -p 5001 -s “EchoServerA@5001 “
  • EchoServerB监听192.168.0.45:5002端口,启动命令:./echoserver -p 5002 -s “EchoServerB@5002 “
  • HAProxy作为前端机,监听192.168.0.45:5000端口,HAProxy负载均衡算法采用轮询算法
  • 多次使用命令“./echoclient -h 192.168.0.45 -p 5000 -m hello” 向HAProxy发起调用请求
  • 成功标准:控制台依次轮流打印 EchoServerA@5001 hello,EchoServerB@5002 hello,EchoServerA@5001 hello,EchoServerB@5002 hello……

四层负载均衡测试

首先,我们定制四层负载均衡测试用的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
global
stats timeout 30s

defaults
mode tcp
timeout connect 5000
timeout client 50000
timeout server 50000

frontend frontend_echoserver
bind 192.168.0.45:5000
mode tcp #必须指定tcp模式
default_backend backend_echoserver

backend backend_echoserver
mode tcp #必须指定tcp模式
balance roundrobin
server echoservera 192.168.0.45:5001 check
server echoserverb 192.168.0.45:5002 check


将上述内容保存为 haproxy-4.cfg 文件(右键另存为)。然后使用如下命令启动HAProxy(启动haproxy之前,先启动EchoServer)。

1
$ ./haproxy -f ./haproxy-4.cfg

启动之后如下图:


我们在另外一个控制台,使用echoclient向haproxy发起请求,控制台输出如下:

可见输出与我们的预期一致,说明haproxy完美的对基于TCP协议的两台EchoServer进行了四层负载均衡轮询调用。

HAProxy自带监控统计页面

HAProxy自带一套系统统计和监控页面,详细记录了所管理的frontend、backend等信息,打开监控页面我们可以直观查看backend中各后台真实服务器的运行状态,HAProxy以不同的颜色来标识状态,运维人员可以直观快速发现问题。
该项功能对开发和运维人员来讲极为友善,我们看下如何开启该项功能。修改上述的配置文件,加入如下配置项:

1
2
3
4
5
6
7
8
9
10
11
12
13
listen admin_stats
stats enable
bind *:8090
mode http
option httplog
log global
maxconn 10
stats refresh 30s
stats uri /monitor
stats realm haproxy
stats auth admin:apassword
stats hide-version
stats admin if TRUE

将上述统计监控功能的配置项加入上文 haproxy.cfg 文件,保存为新文件 haproxy-stats.cfg。或者下载本测试配置文件(右键另存为 )。


使用新的配置文件,重新启动HAProxy

1
$ ./haproxy -f ./haproxy-stats.cfg

我们打开浏览器,输入监控网页地址:http://192.168.0.45:8090/monitor 。

该页面需要认证,账号和密码是配置项”stats auth admin:apassword”指定的,即账号为admin,密码为apassword。

输入账号和密码之后,打开的监控页面如下。

至于监控项及其含义,后续博文我们再做详细讲解。