HAProxy简介

HAProxy简介

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,它是免费、开源、快速而且可靠的一种解决方案。javascript

1 haproxy特色——引自散尽浮华的博客

1)HAProxy 也是支持虚拟主机的。css

2)HAProxy 的优势可以补充 Nginx 的一些缺点,好比支持 Session 的保持,Cookie的引导;同时支持经过获取指定的 url 来检测后端服务器的状态。html

3)HAProxy 跟 LVS 相似,自己就只是一款负载均衡软件;单纯从效率上来说HAProxy 会比 Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx 的。java

4)HAProxy 支持 TCP 协议的负载均衡转发,能够对 MySQL 读进行负载均衡,对后端的 MySQL 节点进行检测和负载均衡,你们能够用 LVS+Keepalived 对 MySQL主从作负载均衡。mysql

5)HAProxy 负载均衡策略很是多, HAProxy 的负载均衡算法如今具体有以下8种:nginx

1> roundrobin,表示简单的轮询,这个很少说,这个是负载均衡基本都具有的;git

2> static-rr,表示根据权重,建议关注;github

3> leastconn,表示最少链接者先处理,建议关注;web

4> source,表示根据请求源 IP,这个跟 Nginx 的 IP_hash 机制相似,咱们用其做为解决 session 问题的一种方法,建议关注;算法

5> ri,表示根据请求的 URI;

6> rl_param,表示根据请求的 URl 参数’balance url_param’ requires an URLparameter name;

7> hdr(name),表示根据 HTTP 请求头来锁定每一次 HTTP 请求;

8> rdp-cookie(name),表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求。

2 配置文件参数简介

haproxy程序环境:          

  • 主程序:/usr/sbin/haproxy          
  • 主配置文件:/etc/haproxy/haproxy.cfg          
  • Unit file:/usr/lib/systemd/system/haproxy.service
  • 官方文档:http://cbonte.github.io/haproxy-dconv/
2.1 global全局配置部分参数
  1. 进程及安全管理:

    • chroot:限定工做目录提高安全性,注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
    • deamon:让haproxy以守护进程的方式工做于后台;
    • user, group, uid, gid: 设定haproxy运行的用户及组等;
  2. log:定义全局的syslog服务器;最多能够定义两个;                      

    ​ log

    [len ] [max level [min level]]

    ​ 在代理配置段使用log global,则表示从全局继承日志设置。若是全局已经定义过两个log了,此处除引用global外还自定义了一个log,则此自定义的log失效,由于只支持两个日志设置。

  3. nbproc :要启动的haproxy的进程数量,官方建议单进程模式即1 ;

  4. ulimit-n :每一个haproxy进程可打开的最大文件数;不推荐手动指定,haproxy会自动调整 ;

  5. 链接数相关:

    • maxconn :设定每一个haproxy进程所能接受的最大并发链接数;          
    • maxconnrate :每一个进程每秒种所能建立的最大tcp链接数量;                
    • maxsessrate :每秒能建立的最大会话数;                
    • maxsslconn :设置每一个进程最大并发ssl链接数;              
  6. spread-checks <0..50, in percent>  单位百分比,有时, 须要避免以固定的时间间隔,发送代理和健康检查,不然会健康检测会过多的占用带宽。例如, 当许多逻辑服务器位于同一物理服务器上或者后端服务器数量不少的状况下。在这个参数的帮助下, 能够在检查间隔增长一些随机性时间介于0和 +/-50之间。默认值保持为0。

2.2 代理配置段
  1. “defaults”段用于为全部其它配置段提供默认参数;
  2. “frontend”段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之创建链接;
  3. “backend”段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器;
  4. “listen”段经过同时指定监听参数与后端服务器简要的定义了一个完整的代理;

全部代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。

  1. 部分经常使用参数,本段引自博客园——骏马金龙博客

    http事务模型相关设置
    (no) option http-keep-alive
    启用或禁用客户端和服务端到haproxy之间的长链接。haproxy将处理全部请求和响应报文,请求完后haproxy两端的链接都处于空闲状态。因为和后端保持了链接,能够以最快的方式重用会话。

    (no) option http-server-close
    启用或禁用在haproxy处理完第一次响应以后关闭haproxy到服务端之间长链接的功能,但客户端的长链接还保持,后续的每次请求都从新创建和后端的链接,每次响应后都关闭和后端的链接。启用该选项时,haproxy将会在转发给后端server的request数据包中添加一个"Connection:Close"标记,后端Server看到此标记就会在响应后关闭tcp链接。

    (no) option forceclose
    启用或禁用传输完响应报文后关闭两端的链接。

    通常来讲,对于高速局域网络来讲,若是后端响应的速度很是快(好比后端是静态服务器响应小文件、后端是静态缓存服务器),这时创建tcp链接的代价就比较大,维持空闲链接的优点会很是明显。若是后端是动态应用程序,响应给haproxy的速度相对较慢,维持空闲链接的代价很是大,彻底能够先释放长链接以腾出资源,在须要链接的时候再创建新tcp链接。 所以:
    (1).后端是静态内容缓存服务器时,或者就是静态服务器时,首选使用http-keep-alive模式;
    (2).后端是动态应用程序服务器时,首选使用http-server-close模式。

    balance负载均衡调度算法
    balance
    可用于default、listen、backend配置段。
    指定代理时负载均衡算法,支持的算法有:
    roundrobin(默认):根据权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,表示权重能够在haproxy运行时调整后端服务器的权重并生效;
    static-rr:基于权重进行轮询,与roundrobin相似,可是为静态方法,在haproxy运行时调整其服务器权重不会生效;
    leastconn:新的链接请求被派发至具备最少链接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,能够在运行时调整其权重;
    source:将请求的源地址进行hash运算,使得同一个客户端IP的请求始终被派发至某特定的服务器; 但当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不一样的服务器;相似于nginx的ip_hash,可用于负载均衡无cookie功能的基于TCP的协议。默认为静态;
    uri:对URI的左半部分 (域名后"?"标记以前的文件路径部分)进行hash运算,并除以服务器的总权重来计算派发至某匹配服务器;这可使得对同一个URI的请求老是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法经常使用于代理缓存以提升缓存的命中率;但此算法仅应用于提供http服务的后端服务器;默认为静态算法;缺点是后端server宕机会形成严重抖动,能够经过hash-type设置hash算法为consistent一致性哈希解决。
    url_param:通常用于将同一用户ID转发至同一服务器的状况。在使用了basic认证时,url中的param通常都会使用user=XXX。使用该算法会对该参数进行hash运算,而后除以总权重以决定分配到哪台后端server。
    hdr(name):基于指定的请求首部名称进行调度。首部中指定名称相同的调度至同一服务器。通常使用"hdr(host)"根据请求首部中的host即目标主机来进行hash运算。使用use_domain_only选项能够基于域名来哈希,使得访问www.longshuai.com和web.longshuai.com的请求都调度至同一服务器。
    rdp-cookie 微软的调度方式
    rdp-cookie(name)
    roundrobin和static-rr是有区别的,roundrobin是动态慢轮询,不用重启服务便可调整其权重,而static-rr必须重启服务修改的权重才生效。例如原有2台后端server,新添加一台后,roundrobin会今后时开始慢慢的将请求轮询至此新服务器 (即慢启动),而static-rr因为须要重启,因此重启前新server不会被调度到,重启后新server和旧server平均调度。通常来讲,考虑加权轮询的时候,roundrobin要比static-rr好。
    通常可归入考虑的算法有roundrobin/static-rr/leastconn/uri,其中leastconn算法用于代理ldap、mysql等长时间会话链接的状况,uri算法用于代理后端为缓存服务器的状况。
    (1). 用于调度MySQL服务器,使用何种算法?答:leastconn
    (2). 用于调度静态服务器组,使用何种算法?答:roundrobin
    (3). 调度动态应用程序服务器组,使用何种算法?答:一般客户端须要和后端应用程序服务器保持联系,通常会使用cookie或者session来实现,但若是特殊状况下没法经过它们实现,则可使用source做为最后"亲和性"手段。注意,使用source算法时,后端服务器数量一改变,就会致使大量的会话断开。
    (4). 调度缓存服务器,使用何种算法?答:uri,且设置hash-type为一致性哈希算法。

  2. server配置相关

    • server

      [:[port]][param*]

      定义后端主机的各服务器及其选项不可用于defaults与frontend配置段;             

    • default-server [settings ...]  

      指定server的默认值,不能用于frontend配置段;

    • :服务器在haproxy上的内部名称;出如今日志及警告信息;

    • :服务器地址,支持使用主机名;

    • [:[port]]:端口映射;省略时,表示同bind中绑定的端口;   

    • [param*]:为此服务器设定的一系列参数

      • maxconn :当前server的最大并发链接数;

      • backlog :当前server的链接数达到上限后的后援队列长度;

      • backup:设定当前server为备用服务器;

      • check:对当前server作健康状态检测;

      • addr :检测时使用的IP地址;

      • port :针对此端口进行检测;

      • inter :连续两次检测之间的时间间隔,默认为2000ms;        

      • rise :连续多少次检测结果为“成功”才标记服务器为可用;默认为2;

      • fall :连续多少次检测结果为“失败”才标记服务器为不可用;默认为3;

        注意:httpchk,"smtpchk", "mysql-check", "pgsql-check" and "ssl-hello-chk" 用于定义应用层检测方法;

      • cookie :为当前server指定其cookie值,用于实现基于cookie的会话黏性; 

      • disabled:标记为不可用;

      • redir :将发往此server的全部GET和HEAD类的请求重定向至指定的URL;

      • weight :权重,默认为1;

  3. 统计接口启用相关的参数:                      

  • stats enable : 启用统计页;基于默认的参数启用stats page;

    • stats uri   : /haproxy?stats  定义状态页路径;

    • stats realm : "HAProxy Statistics" 认证领域名,即输入用户口令时的标题信息;

    • stats auth  : no authentication   是否开启验证;

    • stats scope : no restriction    

    • stats auth :    认证时的帐号和密码,可以使用屡次;       

    • stats realm       认证时的realm;  

    • stats uri      自定义stats page uri ;   

    • stats refresh    设定自动刷新时间间隔;

    • stats admin { if | unless }    启用stats page中的管理功能 ;    

      配置示例:                          

      listen stats                                
      
      bind :9099                                
      
      stats enable                                
      
      stats realm HAPorxy\ Stats\ Page                                
      
      stats auth admin:admin                                
      
      stats admin if TRUE
  1. 基于cookie的session sticky的实现:

    cookie [ rewrite | insert | prefix ][ indirect ] [ nocache ]

​ 经常使用组合:insert nocache indirect

  • :设定cookie名称

  • rewrite:重写cookie,不推荐使用;

  • insert: haproxy将报文发给客户端前,先插入一个cookie,cookie值由server项中cookie指定;

  • indirect: 如下3段均引用自骏马金龙博客https://www.cnblogs.com/f-ck-need-u/p/8553190.html#2-2-cookie-prefix

    若是不配合"indirect"选项,服务端能够看到客户端请求时的全部cookie信息。若是配合"indirect"选项,则haproxy在将请求转发给后端时,将删除本身设置的cookie,使得后端只能看到它本身的cookie,这样对后端来讲,整个过程是彻底透明的,它不知道前面有负载均衡软件。

  • nocache

    当客户端和HAProxy之间存在缓存时(如CDN),建议将insert配合nocache一块儿使用 ,由于nocache确保若是须要插入cookie,则可缓存页面将被标记为不可缓存。这一点很重要,由于若是全部cookie都添加到可缓存的页面上,则全部客户都将从中间的缓存层获取页面,而且将共享同一个Cookie,从而致使某台后端服务器接收的流量远远超过其余后端服务器。

  • prefix:

    haproxy将在已存在的cookie(例如后端应用服务器设置的)上添加前缀cookie值,这个前缀部分是server指令中的cookie设置的,表明的是服务端标识符。在客户端再次访问时,haproxy将会自动移除这部分前缀,使得服务端只能看到它本身发出的cookie。在一些特殊环境下,客户端不支持多个"Set-Cookie"字段,这时可使用prefix。

    使用prefix的时候,cookie指令设置的cookie名必须和后端设置的cookie同样(在本文的环境中是PHPSESSID),不然prefix模式下的haproxy不会对响应报文作任何改变。

2.3 ACL

使用访问控制列表 (ACL) 提供了一种灵活的解决方案来进行访问流量控制, 一般是根据从请求、响应或任何环境状态提取的内容来作出决策。

2.3.1 ACL语法

 acl [flags][operator] [ ] ...

  • aclname : 指定ACL名称,区分大小写,可多条ACL同名,之间是或关系,value知足其一便是匹配。

  • criterion:指定检查标准:

    • 如4层:src、src_port、dst、dst_port,

    • 7层:

      • path     : 精确匹配字符串,例如:path -i /1.txt

        path_beg : 匹配 path的前缀部分              

        path_dir :  路径子集匹配         

        path_dom : 域名子集匹配                

        path_end : 后缀匹配                  

        path_len : 长度匹配                  

        path_reg : 模式匹配                  

        path_sub : 字符串子集匹配

      • url     : exact string match                  

        url_beg : prefix match                  

        url_dir : subdir match                  

        url_dom : domain match                  

        url_end : suffix match                  

        url_len : length match                  

        url_reg : regex match                  

        url_sub : substring match

      • hdr([ [, ]])     : 精确匹配某首部最后一次出现的值                  

        hdr_beg([ [, ]]) : prefix match                  

        hdr_dir([ [, ]]) : subdir match                  

        hdr_dom([ [, ]]) : domain match                  

        hdr_end([ [, ]]) : suffix match                  

        hdr_len([ [, ]]) : length match                  

        hdr_reg([ [, ]]) : regex match                  

        hdr_sub([ [, ]]) : substring match

      • status : integer

        Returns an integer containing the HTTP status code in the HTTP response.

  • flag:标志位,经常使用如-i 不区分大小写、-n禁止DNS解析。

3 动静分离配置示例

frontend  web *:80
     acl url_static   path_beg       -i  /static /images /javascript /stylesheets
     acl url_static   path_end       -i  .jpg .gif .png .css .js .html .txt .htm

     use_backend staticsrvs          if url_static
     default_backend             appsrvs

backend staticsrvs
     balance     roundrobin
     server      stcsrv1 172.16.100.6:80 check

backend appsrvs
     balance     roundrobin
     server  app1 172.16.100.7:80 check
     server  app1 172.16.100.7:8080 check

listen stats
     bind :9091
     stats enable
     stats auth admin:admin
     stats admin if TRUE
相关文章
相关标签/搜索