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。代表某个服务器响应客户端请求,接受请求;一手托两家爱丽接受请求,从服务器封装给客户端。
私有代理:为部分人代理
公共代理:为所有人代理
代理的作用:
访问控制、web缓存(加速)、反向代理、内容路由(根据流量及内容类型等条件将请求转发至特定的服务器)、转码器
在代理服务器上添加Via首部
缓存的作用:
减少冗余内容的传输;
节省带宽、缓解网络瓶颈
降低了对原始服务器的请求吃力
降低了传输延迟
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
[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 :::*
[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>
[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>
[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 /images /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 images, 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