Back

利用HAProxy实现零停机更新维护

HAProxy是linux平台上的负载均衡软件,有完善的服务器健康检测和会话(session)保持功能,性能高,支持tcp和http网络连接分发。

问题起因

入公司一年,我发现在ASP.NET网站上部署更新时,经常会遇到下面这样的烦恼:

  1. 假如更新到bin文件夹下的dll文件,会引起iis的应用程序池重启,从而导致更新这段时间内,用户访问网站会非常缓慢,甚至出现页面超时。

  2. 部署更新时要小心翼翼,祈祷上帝没少拷了什么文件,假如更新后网站出错,就只能心跳加速地快速还原系统

  3. 编辑经常提一些需求只是简单更改下页面文字,而为了不使这种简单的更改引起应用程序池重启,一般部署网站时都是采用copy方式发布,而网站也工作在debug模式下,而不是更优化速度更快的release模式

上面几种情况都很影响用户体验,也让每次更新时肾上激素上升。 要解决上面的烦恼,需要满足下面几个条件:

  1. 有至少两个以上的相同功能站点,当一个站点下线维护时,后续的请求能自动交给另一个站点处理

  2. 有站点健康检测功能,可以一个个轮流地下线站点和上线站点,这过程中对用户的访问完全不受影响 应用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。 HAProxy server1中创建default.htm网页,并输出内容: HAProxy server2中创建default.htm网页,并输出内容: HAProxy 在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