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的稳定性、接近硬件设备的网络吞吐量,以及其所拥有的强大监控功能,完全可以胜任这项工作。