首页 > 代码库 > HAPorxy详解及动静分离实例

HAPorxy详解及动静分离实例

   

一、HAProxy简介

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

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

2、、Session持久机制:  
             1、session绑定:始终将来自同一个源IP的请求定向至同一个RS;没有容错能力;有损均衡效果;(sh)    
             2、session复制:在RS之间同步session,每个RS拥有集群中的所有的session;对规模集群不适用;必须RS支持(lblcr)    
             3、session服务器:利用单独部署的服务器来统一管理集群中的session;(单有单点故障)

3、HAProxy目前主要有两个版本:

    1.4——提供较好的弹性:衍生于1.2版本,并提供了额外的新特性,其中大多数是期待已久的。  
      客户端侧的长连接(client-side keep-alive) -----------维持响应和请求    
      TCP加速(TCP speedups)    
      响应池(response buffering)    
      RDP协议            ------------------------------------远程桌面协议    
      基于源的粘性(source-based stickiness)-------------------同一个IP发往同一个上游server    
      更好的统计数据接口(a much better stats interfaces)    
      更详细的健康状态检测机制(more verbose health checks)    
      基于流量的健康评估机制(traffic-based health)    
      支持HTTP认证    
      服务器管理命令行接口(server management from the CLI)    
      基于ACL的持久性(ACL-based persistence) -------------用户的请求作分类发往不同的服务器组    
      日志分析器    
4、若要获得最高性能:    
    若要获得最高性能,需要在Linux 2.6或打了epoll补丁的Linux 2.4上运行haproxy 1.2.5以上的版本。    
    haproxy 1.1l默认使用的polling系统为select(),其处理的文件数达数千个时性能便会急剧下降。    
    1.2和1.3版本默认的为poll(),在有些操作系统上可会也会有性能方面的问题,但在Solaris上表现相当不错。    
    HAProxy 1.3在Linux 2.6及打了epoll补丁的Linux 2.4上默认使用epoll,在FreeBSD上使用kqueue,这两种机制在任何负载上都能提供恒定的性能表现。

5、在较新版本的Linux 2.6(>=2.6.27.19)上,HAProxy还能够使用splice()系统调用在接口间无复制地转发任何数据,这甚至可以达到10Gbps的性能。     

6、性能

    HAProxy借助于OS上几种常见的技术来实现性能的最大化

      1、 单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。  
      2、O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。    
      3、在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;    
      4、借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);    
      5、内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;    
      6、树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;    
      7、优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;    
      8、精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;    
总结:    
    所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。    
    因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。

    在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。


实例:配置haproxy-nginxWEB服务的负载均衡:    
    haproxy-vm1: eth0 172.16.3.2/16    
                 eth1 192.168.1.2/24    
       web1-vm2: eth0 192.168.1.1/24    
       web2-vm3: eth0 192.168.1.10/24    
      本机当作测试机:172.16.3.100/16    
一、haproxy-vm1    
    环境:    
        # ifconfig eth0 172.16.3.2/16 up    
        # ifconfig eth1 192.168.1.2/24 up    
        # yum install haproxy    
1、配置日志文件    
        # cat /etc/haproxy/haproxy.cfg 中定义日志文件的描述信息   
            #   /etc/sysconfig/syslog    
            #    
            #    local2.*                       /var/log/haproxy.log    
            #    
            log         127.0.0.1 local2  这段定义 ,是把日志发往那里;要想使用这个定义就需要在/etc/sysconfig/syslog 配置文件中,添加(#    local2.*                       /var/log/haproxy.log)这项

        # vim /etc/rsyslog.conf    
            $ModLoad imtcp           把注释去掉即可  (这已经是去掉注释的)    
            $InputTCPServerRun 514    
            local2.*                       /var/log/haproxy.log(这项需要添加,为什么添加上面有说明)    
        # service rsyslog restart     配置完成重启下    
        # ss -tnl             查看下514端口是否监听    
2、配置主配置功能    
    # vim /etc/haproxy/haproxy.cfg    
#---------------------------------------------------------------------    
# Example configuration for a possible web application.  See the    
# full configuration options online.    
#    
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt    
#    
#---------------------------------------------------------------------

#---------------------------------------------------------------------  
# Global settings    
#---------------------------------------------------------------------    
global    
    # to have these messages end up in /var/log/haproxy.log you will    
    # need to:    
    #    
    # 1) configure syslog to accept network log events.  This is done    
    #    by adding the ‘-r‘ option to the SYSLOGD_OPTIONS in    
    #    /etc/sysconfig/syslog    
    #    
    # 2) configure local2 events to go to the /var/log/haproxy.log    
    #   file. A line like the following can be added to    
    #   /etc/sysconfig/syslog    
    #    
    #    local2.*                       /var/log/haproxy.log    
    #    
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy  
    pidfile     /var/run/haproxy.pid    
    maxconn     4000    
    user        haproxy    
    group       haproxy    
    daemon

    # turn on stats unix socket  
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------  
# common defaults that all the ‘listen‘ and ‘backend‘ sections will    
# use if not designated in their block    
#---------------------------------------------------------------------    
defaults    
    mode                    http    
    log                     global    
    option                  httplog    
    option                  dontlognull    
    option http-server-close    
    option forwardfor       except 127.0.0.0/8    
    option                  redispatch    
    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 *:80                   设置监听IP和端口为 监听所有IP和端口为80  
    default_backend webservers           定义后端服务器组名称为 webservers

backend webservers                       定义后端服务器组内容  
    balance roundrobin                  指定为轮训方式为roundrobin    
    server s1 192.168.1.1:80            指定backend-server:名称为s1 IP为192.168.1.1 端口为80    
    server s2 192.168.1.10:80            指定backend-server:名称为s1 IP为192.168.1.10 端口为80

或者把上面的frontend和backend合写为:  
    listen main *:80    
        balance roundrobin    
        server s1 192.168.1.1:80    
        server s2 192.168.1.10:80    
二、web-vm2 192.168.1.1    
     # ifconfig eth0 192.168.1.1/24 up    
     # yum install nginx    
     # echo "192.168.1.1" > /usr/share/nginx/html/index.html    
三、web-vm2 192.168.1.10    
     # ifconfig eth0 192.168.1.10/24 up    
     # yum install nginx    
     # echo "192.168.1.10" > /usr/share/nginx/html/index.html    
四、检测:    
http://172.16.3.2 (有图有真相)

haproxy测试结果图1 haproxy测试结果图2          

HAproxy动静分离所有机制

 

基于上面的基础负载均衡环境做的web-server动静分裂:

web1-vm2

# yum install php

其他不需要添加任何配置(提供个php测试页面即可!)

haproxy的主配置文件详解:      
#---------------------------------------------------------------------    
# Example configuration for a possible web application.  See the    
# full configuration options online.    
#    
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt    
#    
#---------------------------------------------------------------------

#---------------------------------------------------------------------  
# Global settings    
#---------------------------------------------------------------------    
global    
    # to have these messages end up in /var/log/haproxy.log you will    
    # need to:    
    #    
    # 1) configure syslog to accept network log events.  This is done    
    #    by adding the ‘-r‘ option to the SYSLOGD_OPTIONS in    
    #    /etc/sysconfig/syslog    
    #    
    # 2) configure local2 events to go to the /var/log/haproxy.log    
    #   file. A line like the following can be added to    
    #   /etc/sysconfig/syslog    
    #    
    #    local2.*                       /var/log/haproxy.log    
    #    
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy  
    pidfile     /var/run/haproxy.pid    
    maxconn     4000    
    user        haproxy    
    group       haproxy    
    daemon

    # turn on stats unix socket  
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------  
# common defaults that all the ‘listen‘ and ‘backend‘ sections will    
# use if not designated in their block    
#---------------------------------------------------------------------    
defaults    
    mode                    http    
    log                     global    
    option                  httplog    
    option                  dontlognull    
    option http-server-close    
    option forwardfor       except 127.0.0.0/8    除了127.0.0.0/8网络,所有的主机需要记录客户端主机    
    option                  redispatch            开启再次绑定功能    
    retries                 3            
    timeout http-request    10s                 请求backend-server时长    
    timeout queue           1m                     排队等待时长    
    timeout connect         10s                     超出连接时长    
    timeout client          1m                    frontend-server时长    
    timeout server          1m                    backend-server时长    
    timeout http-keep-alive 10s                    会话保持时长    
    timeout check           10s                    检查超时时长    
    maxconn                 3000                最大并发连接    
frontend main                                    定义客户端请求定义设置    
    bind :80                                    监听端口    
    bind :8088                                    
    acl clear dst_port 8088                    定义访问8088端口定义           
    #acl login path_beg /login                 定义直接转发的条件    
    #redirect location http://www.baidu.com if login   符合条件的转发位置    
    #redirect prefix / if clear                    符合访问端口的转发位置也可以写成“http://172.16.3.2”    
    reqadd X-Proto:\ SSL if clear                符合访问端口的请求首部的尾部添加的内容“SSL”    
    rspadd X-Via:\ haproxy if clear                符合访问端口的响应首部的尾部的添加内容“haproxy”    
    option forwardfor except 127.0.0.0/8        记录除了127.0.0.0/8网段的,源客户端IP地址得记录   
    acl url_static path_beg -i /images /stylesheets /vedios /javascript   指定静态分离的条件    
    acl url_static path_end -i .jpg .html .css .js .png .gif          指定静态分离的条件    
    use_backend static if url_static                            定义符合定义条件分配的backend-server    
    default_backend webservers                                    默认 backend-server

backend static  
    balance roundrobin    
    server s1 192.168.1.10:80  check port 80                        指定 backend-server信息,和检测机制    
    server b1 127.0.0.1:8080 backup check port 8080                指定备用backend-server地址信息    
backend webservers    
    balance roundrobin                               
    server s2 192.168.1.1:80 check port 80                      指定默认backend-server信息    
    server b1 127.0.0.1:8080 backup check port 8080               指定备用backend-server地址信息    
    stats enable                                                开启状态管理接口       
    stats hide-version                                            隐藏版本信息           
    stats uri /haha?stats                                        URL路径的信息    
    stats scope .                                                所在区域位置    
    stats realm  HAPorx\ boy                                    验证提示信息    
    stats auth   admin1:admin                                    验证用户和密码    
    stats admin if TRUE                                            验证通过运行状态管理


测试图片

动态访问图

1动态图

静态访问图

3静态图

本文出自 “奋斗的人” 博客,请务必保留此出处http://wodemeng.blog.51cto.com/1384120/1555233

HAPorxy详解及动静分离实例