利用HAProxy实现零停机更新维护
HAProxy是linux平台上的负载均衡软件,有完善的服务器健康检测和会话(session)保持功能,性能高,支持tcp和http网络连接分发。
问题起因
入公司一年,我发现在ASP.NET网站上部署更新时,经常会遇到下面这样的烦恼:
- 假如更新到bin文件夹下的dll文件,会引起iis的应用程序池重启,从而导致更新这段时间内,用户访问网站会非常缓慢,甚至出现页面超时。
- 部署更新时要小心翼翼,祈祷上帝没少拷了什么文件,假如更新后网站出错,就只能心跳加速地快速还原系统
- 编辑经常提一些需求只是简单更改下页面文字,而为了不使这种简单的更改引起应用程序池重启,一般部署网站时都是采用copy方式发布,而网站也工作在debug模式下,而不是更优化速度更快的release模式
上面几种情况都很影响用户体验,也让每次更新时肾上激素上升。 要解决上面的烦恼,需要满足下面几个条件:
- 有至少两个以上的相同功能站点,当一个站点下线维护时,后续的请求能自动交给另一个站点处理
- 有站点健康检测功能,可以一个个轮流地下线站点和上线站点,这过程中对用户的访问完全不受影响 应用HAProxy的负载均衡和服务器检测特性可以很好地解决上面的问题,最简单的负载均衡框架如下:
192.168.1.2:8001 IP=192.168.1.1 192.168.1.2:8002 192.168.1.3 -------+-------------+-------+-----------+---- | | | _|_db +--+--+ +-+-+ +-+-+ (___) | LB | | A | | B | (___) +-----+ +---+ +---+ (___) haproxy 2 cheap web sites keepalived
192.168.1.1是一台linux服务器,运行着HAProxy。 192.168.1.2是一台windows服务器,iis上运行着两个相同的站点,端口分别设为8001/8002 192.168.1.3是数据库服务器
HAProxy部署测试
安装HAProxy
在ubuntu中安装HAProxy很简单,执行下面的命令就能自动下载安装:
sudo apt-get install haproxy
假如ubuntu服务器上的不是最新版,你想安装最新版,可以到官网下载最新的tar压缩包,解压后进入该目录,执行下面的命令:
make install
配置HAProxy
创建配置文件haproxy.cfg
mkdir /etc/haproxy vim /etc/haproxy/haproxy.cfg
HAProxy提供了两种零停机维护方案,一种是定时检测指定文件的请求是否成功,不成功超过指定次数后,可认为服务器已停机,新进入的连接会自动分发到其他机器,另一种是使用备份服务器,下面只介绍最简单的第一种。 HAProxy实现服务器检测和负载均衡的简单配置如下:
# this config needs haproxy-1.1.28 or haproxy-1.2.1 global maxconn 4096 uid 99 gid 99 daemon defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms option redispatch listen http-in bind *:80 balance roundrobin option httpchk HEAD /deploy.txt HTTP/1.0 server server1 192.168.1.2:8001 check inter 2000 rise 2 fall 2 server server2 192.168.1.2:8002 check inter 2000 rise 2 fall 2
下面说下主要的几个配置项: option redispatch:当之前连接的服务器宕机后,自动把连接分发到其他服务器 bind:监听指定的端口 balance roundrobin:以轮询的方式分发连接 option httpchk HEAD /deploy.txt HTTP/1.0:通过请求/deploy.txt文件来确定服务器健康情况 server server1 192.168.1.2:8001:指定分发的站点,server1可以是任意名称,在写log时使用 check inter 2000:表示服务器检测的间隔时间,2000指2秒,单位是毫秒 rise 2:表示服务器检测请求成功2次后,可认为站点已恢复,连接可以重新分发给它 fall 2:表示服务检测请求失败2次后,可认为站点已宕机,之后不会再分发连接给它 详细的配置说明可以看HAProxy配置文档
运行HAProxy
执行下面的命令检查配置是否正确:
haproxy -f /etc/haproxy/haproxy.cfg -c
运行haproxy:
haproxy -f /etc/haproxy/haproxy.cfg
创建测试站点
在服务器192.168.1.2中,创建站点server1,server2,端口分别是8001,8002。 server1中创建default.htm网页,并输出内容: server2中创建default.htm网页,并输出内容: 在server1和server2根目录都创建一个空白的deploy.txt文本文件,以便haproxy用来检测服务器健康情况.
测试
在浏览器中访问linux服务器的http://192.168.1.1地址,就能看到server1和server2的站点内容,每次刷新网页会轮流显示server1和server2的default.htm内容,因为现在是以轮询方式分发请求连接的。 尝试把server1中的deploy.txt文件重命名为deploy1.txt,重命名后因为haproxy检测deploy.txt时返回404,haproxy会认为是服务器有问题,当经过4秒后,重新刷新网页,可以看到网页只显示server2的网页内容。 重新把server1的deploy1.txt改回deploy.txt,静待4秒后再刷新网页,可以看到又能显示server1的网页内容了。 参考资料: Zero-Downtime Restarts with HAProxy HAProxy Architecture Guide