load balancing

Load balancing

DNS Load Balancing

最老的办法了,略。

Layer-2 Load Balancing

即链路层的负载均衡,又称作link aggregation。Link aggregation是将多个物理链路汇聚成一个虚拟的更高带宽的链路,这样一方面可以通过组合多个物理链路来得到所需的带宽(以太网链路只有10、100、1G、10G,如果要得到4G的,则可以将四根1G的组合起来,形成一个虚拟的4G链路),一方面也提供了failover。

相关的标准是802.3ad(802.3就是以太网,802.3下面有许多以太网相关的标准)。定义的协议是Link Aggregation Control Protocol (LACP),LACP协议使得设备可以动态地协商与链路汇聚,以及failover。

NIC bonding,即将多个网卡抽象为一个虚拟网卡,来提供更大的带宽和负载在多个网卡之间的均衡。Windows本身不支持,但有许多第三方的实现,如Intel的ANS(Advanced Networking Services),Linux以及*BSD和其他Unix-like都实现了该功能。Linux下,由Linux Ethernet bonding driver提供这种功能,更多参见内核源码树中的Documentation/networking/bonding.txt

Layer-4 Load Balancing

即运输层(TCP、UDP那一层)的load balancing。这种模型下,load balancer以某个ip对外提供服务,用户通过该ip连接load balancer时,load balancer将请求分散到多个backend server上。

Layer-4 Load Balancing的典型例子是LVS Project实现的IPVS,目前是Linux Kernel的一部分(依赖于netfilter框架,源码在net/netfilter/ipvs下面),也已移植到FreeBSD。IPVS提供了三种负载均衡方法和多种调度算法,更多参见另一篇博文,http://www.cnblogs.com/qsort/archive/2011/06/08/2075530.html

Layer-7 Load Balancing

也即在应用层做负载均衡。典型的例子是网站都会用的reverse proxy(譬如nginx)。LVS的KTCPVS项目目的也是做应用层负载均衡,不过并不成熟。现在比较成熟的是HAProxy,本质也是一个反向代理。

应用层做负载均衡,批评也很多,主要是应用层要做均衡,就要对内容进行解析,而这通常是代价比较高的。例如为了解析内容或者做cookie insertion,需要去做SSL termination,这对load balancer来说是一个很大的负载(可能会成为新的瓶颈),所以也有很多SSL Offload & Acceleration的东西,譬如PCI-E的SSL加速卡等,参见http://en.wikipedia.org/wiki/SSL_Acceleration

对layer-7 load balancing的批评,参见一篇博文:http://blog.loadbalancer.org/why-layer-7-sucks/

Persistence / Sticky / Affinity

很多情况下,load balancer所虚拟的服务是有状态的,这意味着来自同一客户的请求应发送给同一个backend server,否则会话信息就乱掉了。

对于layer-4的来说,通常根据源ip地址来实现affinity。

对于layer-7的来说,如果traffic是http的,通常的做法是基于cookie的,即将状态信息放入cookie中,不过这当然也有一些限制。

还有做法就是将会话信息放到数据库里面,这样任何一个节点都会将会话信息放到db,而当会话转到其他节点时,那个节点也可以从db里面拿到会话的状态信息。采用这种技术的有ASP.net State Server。

Server Health Check

Backend服务器的状态也要经常来检查,否则如果某个后端服务器挂了,而load balancer不知道,仍然继续将请求发送给该服务器,那些用户就要无法得到服务了。

通常的做法有ping(layer-3)、TCP connect(layer-4)、HTTP GET(layer-7)等。很多情况下,也要做自定义的处理,譬如reverse proxy访问一个php动态页面,而这个页面会检查数据库是否正常等。

HAProxy自带了这个功能,IPVS则通常与同属LVS项目的keepalived搭配使用。

 

Load Balancer可以完成的其他工作

由于load balancer位于网络入口处,除了职责所在的负载调度、服务器状态检查等,还可以做许多其他的功能,如:

1, HTTP压缩,http output compression现在基本上都会用,放到load balancer处也是个选择,不过同样有SSL Termination类似的问题(新的瓶颈)。

2, Caching,load balancer自己可以充当一个cache proxy。

3, Traffic Priority(QoS),根据traffic的不同来进行优先级调度等,譬如VoIP的优先级最高,http最低等。

4, 充当IPS/Firewall等

5, DDoS攻击防范,譬如SYN cookie以及防范SYN flood等。

6, 用户认证,入口处嘛。

 

一些网络资源

http://www.loadbalancing.org/

http://en.wikipedia.org/wiki/Load_balancing_(computing)

http://kb.linuxvirtualserver.org/wiki/Main_Page

http://www.keepalived.org/

posted @ 2011-06-08 17:28  qsort  阅读(1503)  评论(0编辑  收藏  举报