负载均衡的层次
◆基于客户端的负载均衡
这种模式指的是在网络的客户端运行特定的程序,该程序通过定期或不定期的收集服务器群的运行参数:CPU占用情况、磁盘IO、内存等动态信息,再根据某种选择策略,找到可以提供服务的非常好的服务器,将本地的应用请求发向它。如果负载信息采集程序发现服务器失效,则找到其他可替代的服务器作为服务选择。整个过程对于应用程序来说是完全透明的,所有的工作都在运行时处理。因此这也是一种动态的负载均衡技术。
但这种技术存在通用性的问题。因为每一个客户端都要安装这个特殊的采集程序;并且,为了保证应用层的透明运行,需要针对每一个应用程序加以修改,通过动态链接库或者嵌入的方法,将客户端的访问请求能够先经过采集程序再发往服务器,以重定向的过程进行。对于每一个应用几乎要对代码进行重新开发,工作量比较大。
所以,这种技术仅在特殊的应用场合才使用到,比如在执行某些专有任务的时候,比较需要分布式的计算能力,对应用的开发没有太多要求。另外,在采用 JAVA构架模型中,常常使用这种模式实现分布式的负载均衡,因为java应用都基于虚拟机进行,可以在应用层和虚拟机之间设计一个中间层,处理负载均衡的工作。
◆应用服务器的负载均衡技术
如果将客户端的负载均衡层移植到某一个中间平台,形成三层结构,则客户端应用可以不需要做特殊的修改,透明的通过中间层应用服务器将请求均衡到相应的服务结点。比较常见的实现手段就是反向代理技术。使用反向代理服务器,可以将请求均匀转发给多台服务器,或者直接将缓存的数据返回客户端,这样的加速模式在一定程度上可以提升静态网页的访问速度,从而达到负载均衡的目的。
使用反向代理的好处是,可以将负载均衡和代理服务器的高速缓存技术结合在一起,提供有益的性能。然而它本身也存在一些问题,首先就是必须为每一种服务都专门开发一个反向代理服务器,这就不是一个轻松的任务。
反向代理服务器本身虽然可以达到很高效率,但是针对每一次代理,代理服务器就必须维护两个连接,一个对外的连接,一个对内的连接,因此对于特别高的连接请求,代理服务器的负载也就非常之大。反向代理能够执行针对应用协议而优化的负载均衡策略,每次仅访问最空闲的内部服务器来提供服务。但是随着并发连接数量的增加,代理服务器本身的负载也变得非常大,最后反向代理服务器本身会成为服务的瓶颈。
◆基于域名系统的负载均衡
NCSA的可扩展Web是最早使用动态DNS轮询技术的web系统。在DNS中为多个地址配置同一个名字,因而查询这个名字的客户机将得到其中一个地址,从而使得不同的客户访问不同的服务器,达到负载均衡的目的。在很多知名的web站点都使用了这个技术:包括早期的yahoo站点、163等。动态 DNS轮询实现起来简单,无需复杂的配置和管理,一般支持bind8.2以上的类unix系统都能够运行,因此广为使用。
DNS负载均衡是一种简单而有效的方法,但是存在不少问题。
首先域名服务器无法知道服务结点是否有效,如果服务结点失效,余名系统依然会将域名解析到该节点上,造成用户访问失效。
其次,由于DNS的数据刷新时间TTL(Time to LIVE)标志,一旦超过这个TTL,其他DNS服务器就需要和这个服务器交互,以重新获得地址数据,就有可能获得不同IP地址。因此为了使地址能随机分配,就应使TTL尽量短,不同地方的DNS服务器能更新对应的地址,达到随机获得地址。然而将TTL设置得过短,将使DNS流量大增,而造成额外的网络问题。
最后,它不能区分服务器的差异,也不能反映服务器的当前运行状态。当使用DNS负载均衡的时候,必须尽量保证不同的客户计算机能均匀获得不同的地址。例如,用户A可能只是浏览几个网页,而用户B可能进行着大量的下载,由于域名系统没有合适的负载策略,仅仅是简单的轮流均衡,很容易将用户A的请求发往负载轻的站点,而将B的请求发往负载已经很重的站点。因此,在动态平衡特性上,动态DNS轮询的效果并不理想。