预计阅读本页时间:-
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,可以参考此文档来进行部署实施。