7.4.7 案例分享七:HAProxy双机高可用方案之HAProxy+Keepalived

由于笔者公司的注册用户已经超过500万了,而且每天都有持续增长的趋势,因此PV/日已经有向千万/日靠近的趋势了,原有的Web架构越来越满足不了公司的需求了,所以我们也考虑用能抗高并发的HAProxy来作为网站最前端的负载均衡器。因为之前笔者已经在东莞的两个金融项目上面成功地实施了HAProxy+Keepalived双机方案,所以这里也想尝试在公司的CPA电子广告平台上采用这种负载均衡高可用架构,即HAProxy+Keepalived。

1.做好整个环境的准备工作

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

两台服务器DELL 2950均要做好准备工作,比如设置好hosts文件及进行NTP对时。

网络拓朴很简单,如下所示:

ha1.offer99.com eth0:203.93.236.145

ha2.offer99.com eth0:203.93.236.142

网卡用其自带的千兆网卡即可。

硬盘模式没有要求,RAID0或RAID1均可,单硬盘其实也是可以的。

网站对外的VIP地址是:203.93.236.149,这是通过Keepalived来实现的,原理请参考前面的章节;同时这也是网站的外网DNS对应的IP。

在这里,HAProxy采用7层模式,Frontend(前台)根据任意HTTP请求头内容进行规则匹配,然后把请求定向到相关的Bankend(后台)。

2.HAProxy和Keepalived的安装过程

安装过程前面已经介绍过,这里不再复述,网站上线的时候用的是当前HAProxy的最新版本1.4.18。

首先在两台负载均衡机器上启动HAProxy,命令如下:

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

如果启动了HAProxy程序后,我们又修改了haproxy.cfg文件,则可以用如下命令平滑重启HAProxy让新配置文件生效,命令如下所示:

/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf -st `cat /usr/local/haproxy/haproxy.pid`

新版的HAProxy支持reload命令,即大家可以用“service haproxy reload”命令来重载HAProxy。

这里将以网站的生产环境下的配置文件/usr/local/haproxy/conf/haproxy.cfg为例进行说明,其具体内容如下所示(两台HAProxy机器的配置内容是一样的):

global

maxconn 65535

chroot /usr/local/haproxy

uid 99

gid 99

#maxconn 4096

spread-checks 3

daemon

nbproc 1

pidfile /usr/local/haproxy/haproxy.pid

defaults

log 127.0.0.1 local3

mode http

option httplog

option httpclose

option dontlognull

option forwardfor

option redispatch

retries 10

maxconn 2000

stats uri /haproxy-stats

stats auth admin:admin

contimeout 5000

clitimeout 50000

srvtimeout 50000

frontend HAProxy

bind *:80

mode http

option httplog

acl cache_domain path_end .css .js .gif .png .swf .jpg .jpeg

acl cache_dir path_reg /apping

acl cache_jpg path_reg /theme

acl bugfree_domain path_reg /bugfree

use_backend varnish.offer99.com if cache_domain

use_backend varnish.offer99.com if cache_dir

use_backend varnish.offer99.com if cache_jpg

use_backend bugfree.offer99.com if bugfree_domain

default_backend www.offer99.com

backend bugfree.offer99.com

server bugfree 222.35.135.151:80 weight 5 check inter 2000 rise 2 fall 3

backend varnish.offer99.com

server varnish 222.35.135.152:81 weight 5 check inter 2000 rise 2 fall 3

backend www.offer99.com

balance source

option httpchk HEAD /index.php HTTP/1.0

server web1 222.35.135.154:80 weight 5 check inter 2000 rise 2 fall 3

server web2 222.35.135.155:80 weight 5 check inter 2000 rise 2 fall 3

下面将针对HAProxy配置文件的正则情况稍做说明:

acl cache_domain path_end .css .js .gif .png .swf .jpg .jpeg

以上语句的作用是将.css和.js及图片类型文件定义成cache_domain。

acl cache_dir path_reg /apping

acl cache_jpg path_reg /theme

以上两句话的作用是定义静态页面路径,cache_dir和cache_jpg是自己随便取的名字。

use_backend varnish.offer99.com if cache_domain

use_backend varnish.offer99.com if cache_dir

use_backend varnish.offer99.com if cache_jpg

如果满足以上文件后缀名或目录名,则HAProxy将客户端请求定向到后端的Varnish缓存服务器varnish.offer99.com 上。

acl bugfree_domain path_reg /bugfree

use_backend bugfree.offer99.com if bugfree_domain

以上两句话的配置文件是将bugfree专门定义成一个静态域,如果客户端有bugfree的请求,则专门定向到后端的222.35.135.151机器上。

default_backend www.offer99.com

如果客户端的请求都不满足以上条件,则分发到后端的两台Apache服务器上。

建议将配置文件写成Frontend(前台)和Backend(后台)的形式,方便我们根据需求利用HAProxy的正则做成动静分离或根据特定的文件名后缀(比如.php或.jsp)访问指定的phppool池或javapool池(其实就是php或java服务器集群);我们还可以指定静态服务器池,让客户端访问静态文件(比如bmp、css或js)时可以访问Varnish缓存服务器集群,这就是大家常说的动静分离功能了(Nginx也能实现此项功能),所以前后台的模型也是非常有用的。

Keepalived的配置过程比较简单,这里略过,大家可以参考前面的配置,配置成功后可以分别在两台机器上启动HAProxy及Keepalived服务,主机上Keepalived.conf的配置文件内容如下:

! Configuration File for keepalived

global_defs {

notification_email {

yuhongchun027@163.com

}

notification_email_from sns-lvs@gmail.com

smtp_server 127.0.0.1

router_id LVS_DEVEL

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

203.93.236.149

}

}

3.替HAProxy添加日志支持

编辑/etc/syslog.conf文件,添加如下内容:

local3.* /var/log/haproxy.log

local0.* /var/log/haproxy.log

编辑/etc/sysconfig/syslog文件,修改内容如下:

SYSLOGD_OPTIONS="-r -m 0"

然后重启syslog服务,命令如下:

service syslog restart

在这里有一点需要说明一下,在实际的生产环境下,开启HAProxy日志功能是需要硬件成本的,它会消耗大量的CPU资源,这会导致系统速度变慢(这点在硬件配置较弱的机器上表现尤其突出),如果不需要开启HAProxy日志功能可以选择将其关闭,大家可以根据实际需求来选择是否需要开启HAProxy日志。当时线上采用的机器类型为DELL 2950,机器的CPU性能有些偏弱,上线以后我们关闭了HAProxy日志。

4.验证此架构及注意事项

我们可以通过关闭或重新启动主HAProxy机器来测试VIP地址有没有被正确地转移到从HAProxy机器上,以及是否影响到对网站的访问了。上面的步骤笔者测试过多次,而且在线上环境里也已稳定运行,证明HAProxy+Keepalived双机方案确实是有效的。

可能有读者会有疑问,在此HAProxy+Keepalived负载均衡高可用的架构中,我们是如何解决Session共享的问题呢?答案是采用它自身的balance source机制,它跟Nginx的ip_hash机制的原理类似,是让客户机访问时始终访问后端的某一台真实的Web服务器,这样就可让Session固定下来了,这里没有为了节约机器成本,而采用Memcached或redis来作为Session共享机器。

option httpchk HEAD /index.php HTTP/1.0

这行代码的作用是进行网页监控,如果HAProxy检测到Web的根目录下不存在index.jsp,就会产生503报错。

5.HAProxy的监控页面

可以在地址栏输入http://www.offer99.com/haproxy-stats/ ,输入用户名和密码后,显示界面如图7-10所示(HAProxy自带监控页面,这也是笔者非常喜欢的功能之一)。

阅读 ‧ 电子书库

图7-10 HAProxy自带的监控页面

阅读 ‧ 电子书库

说明

“Session rate”的“Cur”选项可以反映网站的即时并发数,这是大家最关心的选项之一了,还可以利用此监控页面关注Web服务器的存活信息等,HAProxy的这项功能相当实用。

此套集群方案上线以来,HAProxy负载均衡机器运行得相当稳定,在新广告上线(高流量高并发)的情况下基本没出现过宕机现象,所以笔者也没有像Nginx+Keepalived那样做HAProxy服务级别的监控,仅仅做了双机的Keepalived,以避免单机服务器硬件故障。如果大家想在生产环境下实施HAProxy+Keepalived,可以参考此文档来进行部署实施。