haproxy (1)

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


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


————百度百科


Big O: 评判数据结构复杂度

O(1): 

O(logN): 红黑树

O(n)

O(n^2)

O(2^n)



haproxy: 弹性二叉树

数据结构:


Remote Desktop Protocol

Windows: 3389



HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。


HAProxy目前主要有两个版本:


1.4——提供较好的弹性(负载):衍生于1.2版本,并提供了额外的新特性,其中大多数是期待已久的。

  客户端侧的长连接(client-side keep-alive)----

  TCP加速(TCP speedups)

  响应池(response buffering)----响应缓冲

  RDP协议----Remote Desktop Protocol  Windows: 3389;以windows的远程桌面做负载

  基于源的粘性(source-based stickiness)----同一IP只会到同一上级服务器

  更好的统计数据接口(a much better stats interfaces)----作访问控制

  更详细的健康状态检测机制(more verbose health checks)

  基于流量的健康评估机制(traffic-based health)

  支持HTTP认证

  服务器管理命令行接口(server management from the CLI)

  基于ACL的持久性(ACL-based persistence)

  日志分析器


1.3——内容交换和超强负载:衍生于1.2版本,并提供了额外的新特性。

  内容交换(content switching):基于任何请求标准挑选服务器池;

  ACL:编写内容交换规则;

  负载均衡算法(load-balancing algorithms):更多的算法支持;

  内容探测(content inspection):阻止非授权协议;

  透明代理(transparent proxy):在Linux系统上允许使用客户端IP直接连入服务器;

  内核TCP拼接(kernel TCP splicing):无copy方式在客户端和服务端之间转发数据以实现数G级别的数据速率;

  分层设计(layered design):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制及便捷的演进能力;

  快速、公平调度器(fast and fair scheduler):为某些任务指定优先级可实现理好的QoS;

  会话速率限制(session rate limiting):适用于托管环境;



支持的平台及OS:

  x86、x86_64、Alpha、SPARC、MIPS及PARISC平台上的Linux 2.4;

  x86、x86_64、ARM (ixp425)及PPC64平台上的Linux2.6

  UltraSPARC 2和3上的Sloaris 8/9;

  Opteron和UltraSPARC平台上的Solaris 10;

  x86平台上的FreeBSD 4.1-8;

  i386, amd64, macppc, alpha, sparc64和VAX平台上的OpenBSD 3.1-current;


若要获得最高性能,需要在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,这两种机制在任何负载上都能提供恒定的性能表现。


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


基于以上事实,在x86或x86_64平台上,要获取最好性能的负载均衡器,建议按顺序考虑以下方案。

  Linux 2.6.32及之后版本上运行HAProxy 1.4;

  打了epoll补丁的Linux 2.4上运行HAProxy 1.4;

  FreeBSD上运行HAProxy 1.4;

  Solaris 10上运行HAProxy 1.4;



性能


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

  单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。

  O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。

  在任何可用的情况下,单缓冲(从磁盘空间到内核空间额内存,直接调用,不要复制到用户进程空间)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;

  借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);

   内存分配器(每建立会话,会做内存空间保存会话的数据,内核申请内存,当内核申请较大,内存需要到(内存分配器),否则会产生内存碎片,影响性能)在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;

  树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;

  优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;

  精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;


所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。


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


可以从三个因素来评估负载均衡器的性能:

  会话率:会话创建能力,单位时间创建多少会话

  会话并发能力:负载均衡器上承受多少会话同时就行

  数据率:会话并发时数据交换能力


LB解决方案

    硬件:

        F5:BIG IP

        Citrix: NetScaler

        A10: A10

        RedWare

    软件:

        4 layer:lvs;haproxy

7 layer(http):httpd (tomcat);nginx;haproxy (http);ats(apache traffic server);apache

        mysql: mysql-porxy

缓存:varnish, squid

ats


lvs: 400W

haproxy: 3W


http代理:

正向代理:为客户端代为上网请求,内容缓存本地服务器,起到代理的作用。(代为客户端在互联网取数据)

                        问题:(1)无法对上网加速

                              (2)对于内容无法访问控制

                反向代理:Haproxy;nginx。代表某个服务器响应客户端请求,接受请求;一手托两家爱丽接受请求,从服务器封装给客户端。

            wKioL1ZScVKDPJ4uAACRdPOzYUo282.jpg


私有代理:为部分人代理

                公共代理:为所有人代理


代理的作用:

访问控制、web缓存(加速)、反向代理、内容路由(根据流量及内容类型等条件将请求转发至特定的服务器)、转码器


在代理服务器上添加Via首部

wKioL1ZScsnxg6P0AACnLKTauOU559.jpg    



缓存的作用:

减少冗余内容的传输;

节省带宽、缓解网络瓶颈

降低了对原始服务器的请求吃力

降低了传输延迟


HAProxy:只是http协议的反向代理,但支持tcp层对基于tcp的应用层做LB;


HAPorxy:

安装:

CentOS 6.4+: 

yum install haproxy


配置文件:/etc/haproxy/haproxy.cfg

服务脚本:/etc/rc.d/init.d/haproxy

主程序:/usr/sbin/haproxy


nginx:

upstream s1 {

ip_hash

server

server

}


upstream s2 {


}


server {

listen

server_name

proxy_pass 


}


server {


}


haproxy:

frontend

backend

listen(固定frontend;backend)

default(公共配置)


配置的组成部分:

全局配置:

global

代理配置:

defaults, frontend, backend, listen


优先级:

命令行参数、global、proxies


wKiom1ZRv1jAYLVpAAAGf6kjFnA699.jpg

[root@node200 ~]# yum info haproxy

已加载插件:fastestmirror, refresh-packagekit, security

Loading mirror speeds from cached hostfile

 * base: mirrors.aliyun.com

 * epel: mirror01.idc.hinet.net

 * extras: mirrors.163.com

 * updates: mirrors.aliyun.com

可安装的软件包

Name        : haproxy

Arch        : x86_64

Version     : 1.5.4

Release     : 2.el6_7.1

Size        : 792 k

Repo        : updates

Summary     : HAProxy is a TCP/HTTP reverse proxy for high availability

            : environments

URL         : http://www.haproxy.org/

License     : GPLv2+

Description : HAProxy is a TCP/HTTP reverse proxy which is particularly suited

            : for high availability environments. Indeed, it can:

            :  - route HTTP requests depending on statically assigned cookies

            :  - spread load among several servers while assuring server

            :    persistence through the use of HTTP cookies

            :  - switch to backup servers in the event a main one fails

            :  - accept connections to special ports dedicated to service

            :    monitoring

            :  - stop accepting connections without breaking existing ones

            :  - add, modify, and delete HTTP headers in both directions

            :  - block requests matching particular patterns

            :  - persists clients to the correct application server depending

            :    on application cookies

            :  - report detailed status as HTML pages to authenticated users

            :    from a URI intercepted from the application

[root@node200 ~]# yum install haproxy -y

[root@node200 haproxy]# cp haproxy.cfg{,.bak}

[root@node200 haproxy]# ls

haproxy.cfg  haproxy.cfg.bak

[root@node200 ~]# vim /etc/rsyslog.conf 

# Provides UDP syslog reception

 12 # Provides UDP syslog reception

 13 $ModLoad imudp

 14 $UDPServerRun 514

 61 local7.*                                                /var/log/boot.log

 63 local2.*                                                /var/log/haproxy.log

[root@node200 ~]# service rsyslog restart

关闭系统日志记录器:                                       [确定]

启动系统日志记录器:                                       [确定]

[root@node200 ~]# ss -uan

State      Recv-Q Send-Q       Local Address:Port         Peer Address:Port 

UNCONN     0      0                        *:514                     *:*     

UNCONN     0      0                        *:631                     *:*     

UNCONN     0      0                       :::514                    :::*   


wKioL1ZSAL6BzG_yAAAGv5hkn1o631.jpg

[root@node2 ~]# getenforce 

Enforcing

[root@node2 ~]# setenforce 0

[root@node2 ~]# iptables -F

[root@node2 ~]# echo "<h1>node 2</h1>" > /var/www/html/index.html

[root@node2 ~]# service httpd reload

[root@node2 ~]# getenforce 

Enforcing

[root@node2 ~]# setenforce 0

[root@node2 ~]# iptables -F

[root@node2 ~]# curl http://127.0.0.1

<h1>node 2</h1>


wKiom1ZSAIHQBLvNAAAWdJiY7gQ542.jpg

[root@node3 ~]# echo "<h1>node 3</h1>" > /var/www/html/index.html

[root@node3 ~]# setenforce 0

[root@node3 ~]# iptables -F

[root@node3 ~]# service httpd reload

重新载入 httpd:

[root@node3 ~]# curl http://127.0.0.1

<h1>node 3</h1>


wKiom1ZRv1jAYLVpAAAGf6kjFnA699.jpg

[root@node200 ~]# curl http://192.168.112.130

<h1>node 2</h1>

[root@node200 ~]# curl http://192.168.112.140

<h1>node 3</h1>

[root@node200 haproxy]# vim haproxy.cfg

 63 frontend  main *:80

 64   #  acl url_static       path_beg       -i /static /p_w_picpaths /javascript /s    tylesheets

 65    # acl url_static       path_end       -i .jpg .gif .png .css .js

 66 

 67     #use_backend static          if url_static

 68     default_backend             appsrvs

 69 

 70 #---------------------------------------------------------------------

 71 # static backend for serving up p_w_picpaths, stylesheets and such

 72 #---------------------------------------------------------------------

 73 #backend static

 74  #   balance     roundrobin

 75   #  server      static 127.0.0.1:4331 check

 76 

 77 #---------------------------------------------------------------------

 78 # round robin balancing between the various backends

 79 #---------------------------------------------------------------------

 80 backend appsrvs

 81     balance     roundrobin

 82     server  node2 192.168.112.130:80 check

 83     server  node3 192.168.112.140:80 check

 84 #    server  app3 127.0.0.1:5003 check

 85  #   server  app4 127.0.0.1:5004 check

[root@node200 haproxy]# ss -tuanlp | grep 80 

udp    UNCONN     0      0                      *:514                   *:*      users:(("rsyslogd",30080,3))

udp    UNCONN     0      0                     :::514                  :::*      users:(("rsyslogd",30080,4))

tcp    LISTEN     0      128                    *:80                    *:*      users:(("haproxy",30120,5))

[root@node200 haproxy]# firefox http://192.168.112.200

wKioL1ZSBaeAtj7IAACAPnlfwqg525.jpg

wKioL1ZSBb-wkG_kAAB7r0YArRs835.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章