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动静分离所有机制

基于上面的基础负载均衡环境做的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                                            验证通过运行状态管理

测试图片

动态访问图

静态访问图

时间: 2024-10-19 19:59:05

HAPorxy详解及动静分离实例的相关文章

haproxy 基础详解 及 动静分离的实现

haproxy 介绍 1 工作在ISO 七层 根据http协议(或者工作在ISO四层 根据tcp协议) 提供web服务的负载均衡调度器 负载均衡调度器分类 工作在四层: # lvs 工作在七层: # nginx (web,http reverse proxy,cache) # haproxy (http reverse proxy,tcp proxy) # tcp: 实现MySQL的读写中读的负载均衡 # ats (apache traffic server) # perlbal # pound

开启 J2EE(六)— Servlet之Filter详解及乱码处理实例

定义和功能 Filter:过滤器,它能够在request到达Servlet之前预处理request,也可以在离开Servlet时处理response,通过对request或response的处理已达到过滤功能.但是Filter只是对request和response请求进行了拦截处理,通常不产生请求或者响应. 实现的接口 我们写Servlet需要继承一个类,Filter也一样,要实现一个接口(扩展性的体现啊):javax.servlet.Filter,并实现该接口的三个方法: <span styl

【框架】[Hibernate]构架知识点详解入门与测试实例

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] Hibernate介绍: Hibernate是一个开放源码的.非常优秀.成熟的O/R Mapping框架.它提供了强大.高性能的Java对象和关系数据的持久化和查询功能. O/R Mapping 对象关系映射(Object Relational Mapping,简称ORM)技术,是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中. 对象和关系

集合类 Contains 方法 深入详解 与接口的实例

.Net 相等性:集合类 Contains 方法 深入详解 http://www.cnblogs.com/ldp615/archive/2009/09/05/1560791.html 1.接口的概念及声明接口是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为.接口可有方法.属性.事件和索引器或这四种成员的任何组合类型,但不能包含字段.那么接口具有哪些特点呢?·接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员(说明:如类A继承接口B,那么A中必须实现B中定义的属性

jQuery选择器代码详解(五)——实例说明tokenize的解析过程

原创文章,转载请写明出处,多谢! 以下分析基于jQuery-1.10.2.js版本. 下面将以$("div:not(.class:contain('span')):eq(3)")为例,说明tokenize和preFilter各段代码是如何协调完成解析的.若想了解tokenize方法和preFilter类的每行代码的详细解释,请参看如下两篇文章: jQuery选择器代码详解(三)--tokenize方法 jQuery选择器代码详解(四)--Expr.preFilter 下面是tokeni

java正则表达式语法详解及其使用代码实例

原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. 正则表达式应用于程序设计语言中,首次是出现在 Perl 语言,这也让 Perl 奠定了正则表达式旗手的地位.现在,它已经深入到了所有的程序设计语言中,在程序设计语言中,正则表达式可以说是标准配置了. Java 中从 JDK 1.4 开始增加了对正则表达式的支持,至此正则表达式成为了 Java 中的基

详解MySQL读写分离

主从复制的原理MySQL的主从复制和读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了才能在此基础上进行数据的读写分离. 读写分离的原理简单来说,读写分离就是只在主服务器上写,只在从服务器上读.基本原理是让主数据库处理事务性查询,而从服务器处理select查询.数据库复制被用来把事务性查询导致的变更同步到从数据库中. 基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户段的请求通过判断后转发到后端数据库. 实验环境1 一台centos7作为客户端测试IP为192

机器学习中的EM算法详解及R语言实例(1)

最大期望算法(EM) K均值算法非常简单(可参见之前发布的博文),详细读者都可以轻松地理解它.但下面将要介绍的EM算法就要困难许多了,它与极大似然估计密切相关. 1 算法原理 不妨从一个例子开始我们的讨论,假设现在有100个人的身高数据,而且这100条数据是随机抽取的.一个常识性的看法是,男性身高满足一定的分布(例如正态分布),女性身高也满足一定的分布,但这两个分布的参数不同.我们现在不仅不知道男女身高分布的参数,甚至不知道这100条数据哪些是来自男性,哪些是来自女性.这正符合聚类问题的假设,除

LoaderManager使用详解(四)---实例:AppListLoader

实例:AppListLoader 这篇文章将是我的第四篇,也就是最后一篇该系列的文章.请在评论里面告诉我他们是否有用.前面几篇文章的链接如下: 一:Loaders之前世界 二:了解LoaderManager 三:实现Loaders 四:实例:AppListLoader 应大众的要求,我已经写了一个示例应用演示如何正确的实现一个自定义Loader.应用名称为:AppListLoader,它是一个演示应用,可以查询并列出你的Android设备上所有已安装的应用程序.应用已经修改,重新构建(没有bug