zoukankan      html  css  js  c++  java
  • 利用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。 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

  • 相关阅读:
    Apache commons-net用法的一个示例
    Apache commons(Java常用工具包)简介
    MyBatis动态sql之${}和#{}区别
    Spring事务管理
    Spring:源码解读Spring IOC原理
    Spring常用注解总结
    maven常用命令
    Spring事务回滚和异常类
    CSS3--难以想象的滤镜效果
    Composer安装
  • 原文地址:https://www.cnblogs.com/vento/p/2858148.html
Copyright © 2011-2022 走看看