负载均衡之HAProxy详解

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。————百度百科

安装:
[root@sherry ~]# yum install haproxy  -y

配置文件说明:
[root@sherry ~]# vim /etc/haproxy/haproxy.cfg 
global
    log        127.0.0.1 local2  # <address> <facility> [max level [min level]]:定义全局的syslog服务器,最多可以定义两个;
    chroot      /var/lib/haproxy #修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
    pidfile    /var/run/haproxy.pid
    maxconn    4000  #设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;
    user        haproxy
    group      haproxy
    daemon  #让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http   
    工作模式:
                        http  对应用层数据做深入分析,因此支持7层的过滤、处理、转换等机制;
                        tcp  haproxy在客户端和upstream server之间建立一个全双工的连接;
                  不会对应用层协议做任何检查;
                    SSL、MySQL、SSL等都应该使用此模式;
    log                        global  使用全局配置的日志
    #log <address> <facility> [<level> [<minlevel>]]  重新指定  可以定在frontend
    option                  httplog
    option                  dontlognull
    option httpclose  #短连接
    option logasap  #先记录日志
    option dontlognull  #不记录空
    option http-server-close  #长链接时候 客户端超时  服务器自动断开连接
    option                  Redispatch  #基于cookie时候 后端服务器故障时候 自动迁移
    option forwardfor      except 127.0.0.0/8
    #{httpd.conf  LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common  }
 
    capture request  header Host len 20  #记录host 
    capture request  header Referer len 60 #记录referer
 
    retries                3
    timeout http-request    10s  #三次握手等待时长
    timeout queue          1m      #后端在队列中等待时长
    timeout connect        10s    # 发送给后端时 超时时长
    timeout client          1m  #客户端非活动连接最大时长
    timeout server          1m  #等待后端服务器的发送数据的时长
    timeout http-keep-alive 10s    #保持连接的时长
    timeout check          10s    #健康检测超时时长
    maxconn                3000
frontend  main *:5000  #定义前端
    捕获信息
    capture request header Host len 15
    capture request header X-Forwarded-For len 15
    capture requset Referrer  len 15
    capture request header <HEADER> len <LENGTH>
    capture response header <HEADER> len <LENGTH>
    errorfile 404 /demo.php
    log 127.0.0.1 local3
    bind :80,:443    #绑定端口  只能定义在frontend  listen
    acl index path -i /index.html
    acl url_static      path_beg      -i /static /images /Javascript /stylesheets      #地址的开始部分
    acl url_static      path_end      -i .jpg .gif .png .css .js    #地址的结尾
    use_backend static          if url_static  #如果条件符合上面的定义的  则引用的后端   
     
    use_backend          app  if  <condition>
    use_backend          app  unless  <condition>
    default_backend            app                  #默认的后端
backend static      #定义一个后端
检查方法:
    option httpchk
    option httpchk <uri>
    option httpchk <method> <uri>
    option httpchk <method> <uri> <version>:不能用于frontend段,例如:
     
      cookie <name>  [rewrite 重写|insert 拆入|prefix 前缀 多cookie 放在应用程序之前] [indirect] [nocache] [postonly] [preserve] [httponly] [secure] [domain<domian>]* [maxidle<idle>] [maxlife<life>]
还要在每台real-server 后加cookie 标志
 
    cookie web insert  nocache  缓存服务器不保存cookie   
    cookie SESSION_COOKIE insert indirect nocache    应用服务器
    hash-type:  map-based 权重取莫 默认
                        consistent          hash一致性  后端服务器用这个
    balance    roundrobin    #调用方法 轮询  只能定义在defaults  listen backend   
                      roundrobin:加权轮询  可以增加后来服务器  支持慢启动  图片服务器
                      static-rr 加权静态轮询    后面增加的服务器不生效,除非重启服务  服务器重新上线后理解分配高连接
                      leastconn  最少连接 支持权重改变 支持慢启动  mysql从服务器
                      source  源地址ip hash  并保存在hash表  支持加权  在ip层调用   
                      uri  基于用户请求的uri  提高命中缓存命中率
                      url_param 
                      hdr(<name>)    #基于某个指定首部  use_domain_only  仅计算a.com
                      rdp-cookie  在应用调用
                      rdp-cookie(name)
    server      static 127.0.0.1:4331 check  #后端服务器  定义名称  服务器地址  健康状态检测
backend app  #定义后端
    balance    roundrobin  #调度方法轮训
    server  app1 127.0.0.1:5001 check 
#backup设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server; 
#check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,如:
check inter 3000 rise 2 fall 5
          inter <delay>:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;
          rise <count>:一般2次 设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;
          fall <count>: 一般5次  确认server从正常状态转换为不可用状态需要检查的次数;
#cookie <value>:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能;
#maxconn <maxconn>:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放;  前端连接个数小于等于后端 (maxconn+maxqueue)*server-number
#maxqueue <maxqueue>:设定请求队列的最大长度;
#observe <mode>:通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;
#redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;例如:
server srv1 172.16.100.6:80 redir check
#weight <weight>:权重,默认为1,最大值为256,0表示不参与负载均衡;
    server  app2 127.0.0.1:5002 check   
    server  app3 127.0.0.1:5003 check
    server  app4 127.0.0.1:5004 check
listen stats
    bind *:8009
    stats enable
    stats uri /haproxy?stats
    stats auth admin:admin 
    stats hide-version
    stats admin if TRUE 认证通过允许管理  一般用 stats admin if LOCALHOST 本机 比较危险
    acl allow src 192.168.1.0/24  #定义允许访问段
    acl deny src 192.168.1.111  #定义拒绝访问的网络
    tcp-request content reject if deny      #tcp层拒绝  也可以是http-requset  七层控制
    tcp-request content accept if allow    #tep层绝收
    tcp-request content reject

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/dc617481c7ea12124bf06d13cc5389dd.html