一、HAProxy简介

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

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

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


二、HAProxy版本介绍

HAProxy目前主要有两个版本:


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

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

 TCP加速(TCP speedups)

 响应池(response buffering)

 RDP协议

 基于源的粘性(source-based stickiness)

 更好的统计数据接口(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):适用于托管环境;


三、HAProxy支持的平台及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性能优势

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

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

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

 在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;

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

 MRU内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;

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

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

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

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

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


五、HAProxy与Nginx比较

Nginx的优点:
1、工作在OSI第7层,可以针对http应用做一些分流的策略。比如针对域名、目录结构。它的正则比HAProxy更为强大和灵活;
2、Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势所在;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点;
6、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web环境,大有和LAMP环境分庭抗礼之势,Nginx在处理静态页面、特别是抗高并发方面相对apache有优势;
7、Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,有需求的朋友可以考虑用其作为反向代理加速器;
Nginx的缺点:
1、Nginx不支持url来检测。
2、Nginx仅能支持http和Email,这个它的弱势。
3、Nginx的Session的保持,Cookie的引导能力相对欠缺。

HAProxy的优点:
1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3、支持url检测后端的服务器;
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
6、HAProxy的算法较多,达到8种;


六、HAProxy的安装

    HAProxy的安装可以进行源码编译,也可以使用base源中的rpm包,因为yum源中的软件包版本已经很新,我这边建议如果没有特殊需求,还是使用yum源中的软件包进行安装,简单方便。

# yum install haproxy -y

    安装好之后可以通过rpm -ql haproxy查看安装了哪些文件,我们主要操作的也就是他的配置文件,如果需要特殊可以下载源码包,解压查看README进行编译安装,这里不再介绍。


七、HAProxy的配置详解


请查看

◆ 配置参数详解指南   


    我的实验环境是一台服务器安装了三个tomcat容器,前端用haproxy对三个tomcat负载均衡,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#---------------------------------------------------------------------
# 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 warning    #设定日志级别为警告
     chroot       / var /lib/haproxy
     pidfile     / var /run/haproxy.pid
     maxconn     400000                      #设定每个进程最大连接数
     # nbproc      3                         #启动haproxy进程数,需要绑定stats
     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           #启用http模式
     log                      global
     option                  httplog
     option                  dontlognull
     option                  http-server-close
     option forwardfor       except 127.0.0.0/8  
     option                  redispatch
     option                  httpclose
     option                  http-pretend-keepalive
     option                  forceclose
     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
listen stats
     mode http
     bind 0.0.0.0:1080
     stats enable
     stats hide-version
     stats uri     /haproxy?status
     stats realm   Haproxy\ Statistics
     stats auth    admin:admin
#    stats admin  if  TRUE
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
#frontend  main *:5000
#   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
#   default_backend             app
frontend  adscans *:80
       default_backend     adscan
#---------------------------------------------------------------------
static  backend  for  serving up images, stylesheets  and  such
#---------------------------------------------------------------------
#backend  static
#   balance     roundrobin
#   server       static  127.0.0.1:4331 check
backend web
     balance     roundrobin
     server      web01  127.0.0.1:8080 check inter 15000 rise 2 fall 4
     server      web02  127.0.0.1:8081 check inter 15000 rise 2 fall 4
     server      web03  127.0.0.1:8082 check inter 15000 rise 2 fall 4

inter 15000 每隔15秒检测一次  rise 监测2次OK添加到负载均衡队列  监测4次失败移除队列。



八、启动

1
2
3
4
5
6
# service haproxy start
# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:1080                0.0.0.0:*                   LISTEN      5038/haproxy        
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5038/haproxy


九、状态介绍

wKioL1Ykt-Lzi3avAAZ7xDJLMGA752.jpg

Queue

Cur: current queued requests //当前的队列请求数量
Max:max queued requests     //最大的队列请求数量
Limit:           //队列限制数量
Session rate(每秒的连接回话)列表:
scur: current sessions        //每秒的当前回话的限制数量
smax: max sessions           //每秒的新的最大的回话量
slim: sessions limit           //每秒的新回话的限制数量

Sessions 

Total:            //总共回话量

Cur:             //当前的回话
Max: //最大回话 
Limit: //回话限制
Lbtot: total number of times a server was selected //选中一台服务器所用的总时间

Bytes

In: //网络的字节数输入总量  
Out: //网络的字节数输出总量

Denied

Req: denied requests//拒绝请求量

Resp:denied responses //拒绝回应

Errors

Req:request errors             //错误请求
Conn:connection errors          //错误的连接
Resp: response errors (among which srv_abrt)  ///错误的回应

Warnings

Retr: retries (warning)                      //重新尝试
Redis:redispatches (warning)               //再次发送
Server列表:
Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
LastChk:    持续检查后端服务器的时间
Wght: (weight) : 权重
Act: server is active (server), number of active servers (backend) //活动链接数量
Bck: server is backup (server), number of backup servers (backend) //backup:备份的服务器数量
Down:          //后端服务器连接后都是down的数量
Downtime: downtime: total downtime (in seconds)    //总的downtime 时间
Throttle: warm up status                          //设备变热状态




十、总结

    添加日志功能需要开启rsyslog的监听端口,修改/etc/rsyslog.conf。


        

           欢迎关注http://www.wzlinux.com:45 和http://www.wzlinux.com 。