Linux集群之美
上QQ阅读APP看书,第一时间看更新

1.3.4 HAProxy负载均衡器的source算法

HAProxy负载均衡器也有与Nginx负载均衡器的ip_hash算法类似的算法机制,即source算法,它也可以实现会话保持功能。我们可以通过配置前端是一个HAProxy,后端是两台Web服务器的简单Web架构来验证一下。

·系统版本:CentOS 7.6 x86_64

·HAProxy版本:1.7.9

·HAProxy机器IP:192.168.100.22

1)安装HAProxy,提前配置好epel外部yum源(这步略过)。

查看当前yum源是否提供了HAProxy的rpm包,命令如下:


yum list | grep haproxy

结果如下:


haproxy.x86_64                             1.5.18-1.el6_7.1              updates

系统自带的版本低,所以这里采用源码编译的方式进行安装:


cd /usr/local/src
wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.9.tar.gz
tar xvf haproxy-1.7.9.tar.gz
cd haproxy-1.7.9
make TARGET=linux2628 PREFIX=/usr/local/haproxy
# TARGET指定编译OS对应的内核版本,这里写Linux2628即可
make install PREFIX=/usr/local/haproxy

2)修改HAProxy默认的配置文件,不要用它默认的轮询方式,请采用source。配置文件/etc/haproxy/haproxy.cfg的内容如下:


global
    log 127.0.0.1 local3
    daemon    #以daemon方式在后台运行,推荐
    nbproc 1  #HAProxy启动时作为守护运行可创建的进程数,配合daemon参数使用,默认只启动一个进程,该值应小于CPU核数
    maxconn 102400  #最大同时连接
    pidfile /usr/local/haproxy/conf/haproxy.pid  #指定保存HAProxy进程号的文件
    stats socket /usr/local/haproxy/stats  #定义统计信息保存位置

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 stats                 #这里定义的是HAProxy监控
    mode http                 #模式http
    bind 0.0.0.0:1080         #绑定的监控IP与端口
    stats enable              #启用监控
    stats hide-version        #隐藏HAProxy版本 
    stats uri     /web_status #定义的URI
    stats realm   Haproxy\ Statistics #定义显示文字
    stats auth    admin:admin #认证

frontend http
    bind *:80
    mode http
    log global
    option logasap
    option dontlognull
    capture request header Host len 20
    capture request header Referer len 20
    default_backend web

backend web
    balance source
    server web1 192.168.100.23:80 check maxconn 2000
    server web2 192.168.100.24:80 check maxconn 2000

3)新版HAProxy支持reload命令,启动之前我们先检查配置文件有无语法方面的问题,命令如下:


/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -c

结果显示如下:


Configuration file is valid

然后重载HAProxy,命令如下:


/usr/local/haproxy/bin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -st 'cat /usr/local/haproxy/logs/haproxy.pid'

HAProxy自带有强大的监控功能,我们输入以下网址可以看到:

http://192.168.100.22:1080/web_status/

输入相对应的账号和密码就可以看到监控页面,如图1-4所示。

图1-4 HAProxy的监控页面

4)在默认情况下,为了节省读写I/O所消耗的性能,HAProxy没有自动配置日志输出功能,但线上的生产环境有时为了维护和调试方便,是需要有日志输出的,所以我们可以根据需求来配置HAProxy的日志配置策略。

下面设置HAProxy的默认配置文件与日志相关的选项:


global
    log    127.0.0.1 local3 #local3相当于info级别的日志

然后编辑系统日志配置/etc/rsyslog.conf,此文件默认会读取/etc/rsyslog.d/*.conf目录下的配置文件,所以我们可以将HAProxy的相关配置放在其下,这里取名为haproxy.conf,文件内容如下:


$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log

对于上面的配置内容文件,这里也说明一下:


$ModLoad imudp

其中的imudp是模块名,支持UDP。


$UDPServerRun 514

表示允许514端口接收使用UDP和TCP转发过来的日志,而rsyslog在默认情况下,正是在514端口监听UDP。


local3.* /var/log/haproxy.log

local3相当于info级别的日志,/var/log/haproxy.log后面跟的是详细路径名。

现在修改/etc/sysconfig/rsyslog文件:


# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-c 2 -r -m 0"

各参数的作用如下。

·-c:指定运行兼容模式。

·-r:接收远程日志。

·-x:在接收客户端消息时,禁用DNS查找。须与-r参数配合使用。

·-m:标记时间戳。单位是分钟,为0时,表示禁用该功能。

重新启动rsyslog服务和HAProxy进程:


systemctl restart rsyslog
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -st 'cat /usr/local/haproxy/conf/haproxy.pid'

HAProxy的日志内容如下:


Jul 29 03:16:59 server haproxy[4316]: Proxy http started.
Jul 29 03:16:59 server haproxy[4316]: Proxy web started.
Jul 29 03:18:10 server haproxy[4317]: 192.168.100.187:59736 [29/Jul/2019:03:18:10.271] http web/web1 0/0/0/4/+4 200 +345 - - --NI 2/2/1/0/0 0/0 {192.168.100.22|} "GET /test.php HTTP/1.1"
Jul 29 03:18:10 server haproxy[4317]: 192.168.100.187:59736 [29/Jul/2019:03:18:10.271] http web/web1 0/0/0/4/+4 200 +345 - - --NI 2/2/1/0/0 0/0 {192.168.100.22|} "GET /test.php HTTP/1.1"
Jul 29 13:16:10 server haproxy[3727]: Proxy stats started.
Jul 29 13:16:10 server haproxy[3727]: Proxy http started.
Jul 29 13:16:10 server haproxy[3727]: Proxy http started.
Jul 29 13:16:10 server haproxy[3727]: Proxy web started.
Jul 29 13:16:36 server haproxy[3728]: 192.168.100.80:51387 [29/Jul/2019:13:16:36.004] http web/web1 0/0/0/4/+4 404 +152 - - ---- 2/2/1/0/0 0/0 {192.168.100.22|http://192.168.100.2} "GET /favicon.ico HTTP/1.1"
Jul 29 13:16:36 server haproxy[3728]: 192.168.100.80:51387 [29/Jul/2019:13:16:36.004] http web/web1 0/0/0/4/+4 404 +152 - - ---- 2/2/1/0/0 0/0 {192.168.100.22|http://192.168.100.2} "GET /favicon.ico HTTP/1.1"

HAProxy采用了source算法以后,我们发现无论怎么刷新,通过前面的HAProxy LB机器,始终只能访问到后端提前定义好的Web1机器。在没有用Session共享的工作场景中(也不允许代码大量改动),我们可以通过采用此source算法,让客户始终只访问固定的后端Web机器,以解决Session共享的问题。

在项目实际实施中,笔者会根据客户的需求,将HAProxy用于一些时效性强的小中型网站(比如金融证券类的新闻资讯网站),比如,做成基于单机HAProxy(后面接2~3台Web机器)的网站,因为这些网站只是在早上9:00以后到下午6:00之间会有用户访问,鉴于HAProxy的稳定性、接近硬件设备的网络吞吐量,以及其所拥有的强大监控功能,完全可以胜任这项工作。