为什么我们身处不同的城市打开新浪、搜狐的主页速度几乎相同?为什么一两台服务器的瘫痪并不会影响某家电子商务公司业务的正常运转?这些问题的答案只有一个――他们都采用了服务器的负载均衡技术,能够动态调整服务器的资源,跨越地域的限制,抵御因为一两台服务器故障所造成的全面或局部业务瘫痪风险。
虽然叫做负载均衡,但这项技术并非传统意义上的“平摊”,它只是把有可能拥塞于一个地方的负载交给多个地方的服务器共同分担。
避免网路拥堵需要“交通警”
负载均衡在网络中的作用就像道路中的“交通警”,将不同往来的车辆进行分流,以免造成某一路段的全面拥堵,而另一条路却空无一人。
负载均衡从结构上分为本地负载均衡和地域负载均衡(全局负载均衡),前一种是指对本地的服务器集群做负载均衡,后一种是指对分别放置在不同的地理位置、在不同的网络及服务器群集之间作负载均衡。
例如某些网站服务器来说,程序的拷贝运行在群集内所有的主机上,网络负载均衡将用户段请求所产生的负载在这些主机间进行分配。当这些主机位于同一个机房当中时,就成为了本地负载均衡,而当这些服务器通过网络分散在全国各地时,就可以称作全局负载均衡。
因为一台普通服务器的处理能力只能达到每秒几万个到几十万个请求,如果瞬间的请求达到百万个甚至更多,必然会导致它的效率极度下降甚至出现宕机。
北京移动最近开展短信开通新99套餐和来电畅听业务的时候就遇到了这样的问题,发送完短信后,系统只是回复了一个“系统繁忙”。
服务器群中负载均衡示意图
负载均衡就是希望能解决这样的问题,假设每个服务器能响应的请求为每秒10万个。如果不采用负载均衡,那么该系统就只能达到每秒 10万个的响应,即使采用三台服务器,也有可能在不到每秒30万个响应的时候,就会出现某台服务器由于访问量过大而宕机。进而则可能导致数万个请求不能得到正确的响应。
但如果采用负载均衡,不仅当服务器出现故障时可以自动将指向该服务器上的响应分担到其他服务器,还可以在数据量不太大时也将任务分配到各个服务器中,避免出现有些服务器数据量很小,而有的已因数据量接近极限导致性能急剧下降的现象。
如果数据量超出了服务器的响应能力,只需增加服务器数目就可以平滑升级。也就是说,负载均衡技术不仅可以维持网络系统中负载的均衡分配,还能够维护网络系统的高可用性运行,因而是保证网络系统高性能的重要技术。
三种不同技术的比较
最初,负载均衡是通过DNS来实现的。例如在DNS列表中为多个地址配置同一个名字,当客户机请求DNS服务器时就会得到其中一个地址。这样就可以让不同的客户端随机地访问不同的服务器,达到负载均衡的目的。
但是,这种做法只是把任务随机进行分担,并不是定义上的均衡。因为这种方法无法获知服务器的性能差异,同时在分派任务的时候也不能了解服务器的当前状态。甚至可能会出现忙人更忙的情况。从而使得不同的客户访问不同的服务器,达到负载均衡的目的。DNS负载均衡是一种简单而有效的方法,但是它不能区分服务器的差异,也不能反映服务器的当前运行状态。
真正智能的负载均衡应该是根据实时响应时间进行判断,将任务交由负载最轻的服务器来处理,以实现真正的智能通信管理和最佳的服务器群性能。
DNS负载均衡的另一个问题是,一旦某个服务器出现故障,即使及时修改了DNS设置,还是要等待足够的时间(刷新时间)才能发挥作用。在此期间,保存了故障服务器地址的客户计算机将不能正常访问服务器。
代理服务器也是可以实现负载均衡的一种方法,它将请求均匀转发给多台服务器,从而达到负载均衡的目的。这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部服务器,而这种代理方式是代理多个客户访问内部服务器,因此也被称为反向代理模式。
使用反向代理的好处是,可以将负载均衡和代理服务器的高速缓存技术结合在一起,提供有益的性能。然而它本身也存在一些问题,首先就是必须为每一种服务都专门开发一个反向代理服务器,这就不是一个轻松的任务。
特别是针对每一次代理,代理服务器就必须维护两个连接:一个对外的连接,一个对内的连接,因此对于特别高的连接请求,代理服务器的负载也就非常之大。随着并发连接数量的增加,代理服务器本身的负载也变得非常大,最后反向代理服务器本身会成为服务的瓶颈。
还有一种方式是支持负载均衡的地址转换网关,它是将一个外部IP地址映射为多个内部IP地址,对每次TCP连接请求动态使用其中一个内部地址,达到负载均衡的目的。
这一技术被集中在很多品牌的交换机中,它采用的策略包括随机选择、根据服务器的连接数量或者响应时间进行选择的负载均衡策略来分配负载。但是因为这些方法大多基于硬件实现,仅仅能够处理几种最标准的应用协议的负载均衡。
“交通警”是如何维持秩序的
网络负载均衡通过在主机发生故障或脱机的情况下,将网络通讯量重新指定给其它工作群集主机来提供高度的可用性。与脱机主机现存的连接虽然丢失,但因特网服务仍然处于可用状态。
网络负载均衡通过在群集的一个或一个以上虚拟IP地址当中分配引入的网络通讯量来提供伸缩能力。群集中的主机于是对不同客户请求做出响应,即使是来自同一客户的多重请求也如是。例如,Web浏览器可能在单一Web网页内获得群集内不同主机处的多重映射。这就加速了处理过程并缩短了对客户的响应时间。
网络负载均衡使在一个子网上的全部群集主机能够为群集的主IP地址同时检测引入的网络通讯量。在每个群集主机上,网络负载均衡驱动程序充当了一个介于群集适配器驱动程序和TCP/IP栈之间的过滤器,以这种方式使主机能够收到一部分引入的网络通讯量。
网络负载均衡使用全面分布式的算法来从统计意义上将引入的客户映射到基于IP地址、端口和其它信息的群集主机上。在检查收到的数据包时,所有主机均同步执行这种映射以迅速决定哪个主机应处理该数据包。除非群集主机数量发生变化,该映射会保持不变。
网络负载均衡过滤算法在数据包处理程序方面要比在集中负载均衡程序方面高效得多,而这必须修改并重发数据包。这就使网络负载均衡能够提供高得多的聚集带宽。通过直接在群集主机上运行,网络负载均衡的性能并不受某一代处理器或网络技术的局限。