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型的做法。