预计阅读本页时间:-
7.3.3 HAProxy负载均衡器的source算法
HAProxy也有和Nginx的ip_hash算法类似的机制,即source算法,它也可以实现会话保持功能;我们可以通过配置一个简单的1+2 Web架构来验证一下,此处的IP跟前面LVS中的一样,只不过这里没有了VIP的概念,详细过程如下。
(1)安装HAProxy
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
在此之前,要提前配置好epel外部yum源,步骤略过。
下面查看当前yum源是否提供了HAProxy的rpm包,命令如下:
yum list | grep haproxy
结果如下:
haproxy.x86_64 1.5.4-2.el6_7.1 updates
现在,通过yum命令安装HAProxy,命令如下:
yum install haproxy -y
(2)修改HAProxy默认配置文件
记得不要采用它默认的轮询方式(roundrobin),而是要采用source。配置文件/etc/haproxy/haproxy.cfg的内容如下:
global
log 127.0.0.1 local3
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/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.1.205:80 check maxconn 2000
server web2 192.168.1.206:80 check maxconn 2000
新版的HAProxy支持以服务reload的模式启动,这样更改配置文件以后,就可以用如下命令来重载HAProxy服务了:
service haproxy reload
HAProxy的配置中包含如下5个组件,当然这些组件不是必选的,可以根据需要选择配置。
·Global:参数是进程级的,通常和操作系统相关。这些参数一般只设置一次,如果配置无误,则不需要再次配置了。
·Defaults:配置默认参数,这些参数可以配置到Frontend、Backend、Listen组件中。
·Frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用的后端Backend(可动态选择)。
·Backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或多个实体服务器。
·Listen:Frontend和Backend的组合体。
关于HAProxy的详细配置文件说明参数请大家参考附录A,请注意版本之间的差异性变化。
(3)启动HAProxy
新版HAProxy支持reload命令,启动之前先检查下配置文件有无语法方面的问题,命令如下:
haproxy -f /etc/haproxy/haproxy.conf -c
结果显示如下:
Configuration file is valid
然后启动HAProxy,命令如下:
service haproxy start
HAProxy自带了强大的监控功能,在网址http://192.168.1.207:1080/web_status/ 中输入相应的账号和密码就可以看到监控页面,监控页面如图7-5所示。
图7-5 HAProxy的监控页面
(4)设置HAProxy的日志配置策略
在默认情况下,为了节省读写I/O所消耗的性能,HAProxy没有自动配置日志输出功能,但线上的生产环境有时为了维护和调试方便,是需要有日志输出的,所以我们可以根据需求来配置HAProxy的日志配置策略。
首先,设置HAProxy的默认配置文件跟日志相关的选项,命令如下所示:
global
log 127.0.0.1 local3 #local3相当于
info级别的日志
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
然后,编辑系统日志配置/etc/rsyslog.conf,此文件默认会读取/etc/rsyslog.d/*.conf目录下的配置文件,所以我们可以将HAProxy的相关配置放在其下,这里取名为haproxy.conf,文件内容如下:
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
其中,imudp是模块名,支持UDP协议。$UDPServerRun 514表示允许514端口接收使用UDP和TCP协议转发过来的日志,而rsyslog在默认情况下,正是在514端口监听UDP的。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时,表示禁用该功能。
现在,来看看HAProxy的日志内容:
Jan 11 06:50:00 localhost haproxy[13637]: 192.168.1.222:49629 [11/Jan/2016:06:49:58.136] http web/web1 1922/0/0/0/+1922 403 +177 - - ---- 3/3/1/1/0 0/0 {192.168.1.207|} "GET / HTTP/1.1"
Jan 11 06:50:00 localhost haproxy[13637]: 192.168.1.222:49629 [11/Jan/2016:06:49:58.136] http web/web1 1922/0/0/0/+1922 403 +177 - - ---- 3/3/1/1/0 0/0 {192.168.1.207|} "GET / HTTP/1.1"
Jan 11 06:50:00 localhost haproxy[13637]: 192.168.1.222:49629 [11/Jan/2016:06:50:00.057] http web/web1 31/0/0/0/+31 304 +130 - - ---- 3/3/1/1/0 0/0 {192.168.1.207|http://192.168.1.207} "GET /icons/apache_pb.gif HTTP/1.1"
Jan 11 06:50:00 localhost haproxy[13637]: 192.168.1.222:49629 [11/Jan/2016:06:50:00.057] http web/web1 31/0/0/0/+31 304 +130 - - ---- 3/3/1/1/0 0/0 {192.168.1.207|http://192.168.1.207} "GET /icons/apache_pb.gif HTTP/1.1"
Jan 11 06:50:00 localhost haproxy[13637]: 192.168.1.222:49629 [11/Jan/2016:06:50:00.057] http web/web1 31/0/0/0/+31 304 +130 - - ---- 3/3/1/1/0 0/0 {192.168.1.207|http://192.168.1.207} "GET /icons/apache_pb.gif HTTP/1.1"
Jan 11 06:50:00 localhost haproxy[13637]: 192.168.1.222:49629 [11/Jan/2016:06:50:00.057] http web/web1 31/0/0/0/+31 304 +130 - - ---- 3/3/1/1/0 0/0 {192.168.1.207|http://192.168.1.207} "GET /icons/apache_pb.gif HTTP/1.1"
Jan 11 06:50:00 localhost haproxy[13637]: 192.168.1.222:49640 [11/Jan/2016:06:49:57.738] http web/web1 2355/0/0/0/+2355 304 +130 - - ---- 3/3/1/1/0 0/0 {192.168.1.207|http://192.168.1.207} "GET /icons/poweredby.png HTTP/1.1"
Jan 11 06:50:00 localhost haproxy[13637]: 192.168.1.222:49640 [11/Jan/2016:06:49:57.738] http web/web1 2355/0/0/0/+2355 304 +130 - - ---- 3/3/1/1/0 0/0 {192.168.1.207|http://192.168.1.207} "GET /icons/poweredby.png HTTP/1.1"
Jan 11 06:50:00 localhost haproxy[13637]: 192.168.1.222:49640 [11/Jan/2016:06:49:57.738] http web/web1 2355/0/0/0/+2355 304 +130 - - ---- 3/3/1/1/0 0/0 {192.168.1.207|http://192.168.1.207} "GET /icons/poweredby.png HTTP/1.1"
Jan 11 06:50:00 localhost haproxy[13637]: 192.168.1.222:49640 [11/Jan/2016:06:49:57.738] http web/web1 2355/0/0/0/+2355 304 +130 - - ---- 3/3/1/1/0 0/0 {192.168.1.207|http://192.168.1.207} "GET /icons/poweredby.png HTTP/1.1"
Jan 11 06:50:10 localhost haproxy[13637]: 192.168.1.222:49640 [11/Jan/2016:06:50:00.092] http web/web1 9959/0/0/0/+9959 403 +177 - - ---- 2/2/1/1/0 0/0 {192.168.1.207|} "GET / HTTP/1.1"
Jan 11 06:50:10 localhost haproxy[13637]: 192.168.1.222:49640 [11/Jan/2016:06:50:00.092] http web/web1 9959/0/0/0/+9959 403 +177 - - ---- 2/2/1/1/0 0/0 {192.168.1.207|} "GET / HTTP/1.1"
Jan 11 06:50:10 localhost haproxy[13637]: 192.168.1.222:49640 [11/Jan/2016:06:50:00.092] http web/web1 9959/0/0/0/+9959 403 +177 - - ---- 2/2/1/1/0 0/0 {192.168.1.207|} "GET / HTTP/1.1"
Jan 11 06:50:10 localhost haproxy[13637]: 192.168.1.222:49640 [11/Jan/2016:06:50:00.092] http web/web1 9959/0/0/0/+9959 403 +177 - - ---- 2/2/1/1/0 0/0 {192.168.1.207|} "GET / HTTP/1.1"
从日志内容可发现,HAProxy采用了source算法以后,无论怎么刷新,通过前面的HAProxy LB机器始终只能访问到后端的Web1机器上面。在没有Session的Memcached或redis机器的场景里,可以通过采用此source算法,让客户始终只访问固定的后端Web机器,以此来解决Session共享的问题。
在项目实施中,我会根据客户的需求,将HAProxy用于一些时效性强的小型网站上(比如金融证券类的新闻资讯网站),做成基于单机HAProxy(后面接两台Web机器)的网站,因为这些网站只是在早上9:00到下午5:00之间会有用户访问,鉴于HAProxy的稳定性、接近硬件设备的网络吞吐量,以及其所拥有的强大监控功能,其完全可以胜任这项工作。如果大家也有这种需求,不妨考虑一下这种1+2型的做法。