HAProxy博客
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个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协议
基于源的粘性(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):适用于托管环境;
支持的平台及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;
性能
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);
内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;
精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。
在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。
可以从三个因素来评估负载均衡器的性能:
会话率
会话并发能力
数据率
HAProxy的配置处理3类来主要参数来源:
——最优先处理的命令行参数,
——“global”配置段,用于设定全局配置参数;
——proxy相关配置段,如“defaults”、“listen”、“frontend”和“backend”;
web代理:
正向代理
反向代理:reverse proxy
私有代理,公共代理
代理的作用:
访问控制
web缓存(代理加速)
反向代理
内容路由
根据流量及内容的类型等将请求转发至特定的服务器
转码器
Via: http/1.0 proxy.magedu.com (nginx/1.6.2), http/1.0 proxy.baidu.com (haproxy/1.5.2)
缓存(代理式)的作用:
减少冗余内容的传输
节省带宽,缓解网络瓶颈
降低了对原始服务器的压力
降低了传输时延
PV, UV
PV:page view (page)
UV: user view (IP)
index.html:
href=
100W*60
HAProxy:
http: web
tcp:
mysql
ldap
C10k: connections 10000
C1000k
Cookie, Session
http stateless
cookie: 客户端保存信息
session: 服务器端保存信息
cookie
url
nginx:
upstream us1 {
}
server {
location ~ \.php$ {
proxy_pass us1
}
}
server {
}
haproxy:
frontend: server
acl
backend: upstream
listen:
frontend
backend
配置的组成部分:
全局配置
global
代理配置
defaults, frontend, backend, listen
优先级:命令行参数、global、proxies
调度算法:balance
roundrobin:加权轮询
static-rr:
leastconn
first:按id号大小进行调度
uri
source
url_params <param>
hdr(<header>)
default_backend
use_backend
nginx :
http {
server {
location ~* \.(jpg|jpeg|gif|png) {
proxy_pass
}
location / {
proxy_pass
}
}
}
server <name> <address>[:[port]] [param*]
仅能用于listen, backend
backend websrvs
balance roundrobin
cookie SRV insert indirect nocache
server node2 172.16.100.7:80 cookie node2 check rise 1 fall 2
server node3 172.16.100.8:80 cookie node3 check
reqadd: 向服务器发送请求报文时自定义请求首部;
rspadd: 向客户端发送响应报文时自定义响应首部;
acl中的几个常用检查标准:
dst
dst_port
src
src_port
path
path_beg
path_end
path_reg
url_beg
url_end
url_reg
hdr(HEADER)
hdr_beg(HEADER)
hdr_end(HEADER)
http://www.magedu.com/p_w_picpaths/logo.jpg
haproxy: 1.1.1.1
www.magedu.com 1.1.1.1
www.test.com 1.1.1.1
acl magedu hdr_end(host) -i magedu.com
acl test hdr_end(host) -i test.com
use_backend magedusrvs if magedu
use_backend testsrvs if test
default_backend magedusrvs