负载均衡

-{zh-hant:;zh-hans:}-
负载平衡（load balancing）是一种电子计算机技术，用来在多个计算机（计算机集群）、网络连接、CPU、磁碟驱动器或其他资源中分配负载，以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
使用带有负载平衡的多个伺服器组件，取代单一的组件，可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。
主要作用是将大量作业合理地分摊到多个操作单元上进行执行，用于解决互联网架构中的高并发和高可用的问题。
基于互联网的服务.
负载均衡最重要的一个应用是利用多台伺服器提供单一服务，这种方案有时也被称为伺服器农场。通常，负载平衡主要应用于Web网站，大型的Internet Relay Chat网络，高流量的文件下载网站，NNTP（Network News Transfer Protocol）服务和DNS服务。现在负载平衡器也开始支持数据库服务，称之为数据库负载平衡器。
对于互联网服务，负载平衡器通常是一个软件程序，这个程序侦听一个外部端口，互联网用户可以通过这个端口来访问服务，而作为负载平衡器的软件会将用户的请求转发给后台内网伺服器，内网伺服器将请求的响应返回给负载平衡器，负载平衡器再将响应发送到用户，这样就向互联网用户隐藏了内网结构，阻止了用户直接访问后台（内网）伺服器，使得服务器更加安全，可以阻止对核心网络栈和运行在其它端口服务的攻击。
当所有后台伺服器出现故障时，有些负载平衡器会提供一些特殊的功能来处理这种情况。例如转发请求到一个备用的负载平衡器、显示一条关于服务中断的消息等。负载平衡器使得IT团队可以显著提高容错能力。它可以自动提供大量的容量以处理任何应用程序流量的增加或减少。
DNS轮循.
DNS轮循（或DNS的循环机制），是指一种负载分发，负载均衡或者容错性地提供多个冗余的IP服务主机的技术。
Scheduling算法.
当前，负载均衡器有各种各样的工作排程演算法（用于决定将前端用户请求发送到哪一个后台服务器），最简单的是随机选择和轮询。更为高级的负载均衡器会考虑其它更多的相关因素，如后台服务器的负载，响应时间，运行状态，活动连接数，地理位置，处理能力，或最近分配的流量。
架构.
高性能系统通常会使用多层负载均衡。另外专用的硬件负载均衡器以及纯软件负载均衡器，包括开源的，例如Apache Web服务器的mod proxy balancer扩展，nginx，Varnish和Pound反向代理和负载均衡器。使用Gearman将合适的计算任务分发给多台计算机，如此大量的任务就可以更快的完成了。
对于一个多层次架构体系，在负载均衡器或网络分发器后面有两种设计，术语称之为Bowties和Stovepipes。Stovepipe设计中，事务是从顶部分发的，然后从一个固定通道通过一系列硬件和软件设备，到达最终目的地。如果使用Bowties设计，在每一层中事务处理有多条路径可供选择。在事务处理的网络结构中可能会是Stovepipes，也可以是Bowties，或者根据每一层的实际需求采用杂货构架。
持续性.
负载均衡器需要处理的一个重要问题是：如何保存用户会话？如果会话信息保存在后台服务器，用户接下来的请求可能会被分配到不同的后台服务器，此时用户会话就无法继续。负载均衡器可以缓存用户会话，然后将用户请求分发到不同的后台服务器。但是这将带来负载均衡器的负载问题。
理想下，在负载均衡后面的服务器集群（Server cluster）不应该保存会话（session-aware），如此一来，一个用户不管什么时候连接任何一个后端服务器都不会收到影响。常用的方案是通过一个磁盘数据库（传统数据库）或者一个内存数据库（如： Memcached），实例可参考：Django 缓存框架。 将会话信息存到磁盘数据库的这个方案由于会增加数据库的负载，所以这个方案对性能的提高并不好。磁盘数据库最好是用来存储会话时间比较长的会话数据。
为了避免数据库出现单点故障，并且提高其扩展性，数据库通常会复制到多台服务器上，通过负载均衡器来分发请求到数据库服务器上。微软ASP.NET中的状态服务器技术就是一个典型的会话数据库的例子。集群中的所有服务器都将它们的会话信息保存到状态服务器上，同时它们可以向状态服务器查询会话数据。
另一个简单的解决方案是，将一个指定的用户的的今后的所有请求都会发送到同一个后台服务器——这种方案也被称为“粘性（sticky）会话”或者“持续化（persistence）”。但该方案的不足之处在于：无法容错(故障转移)，假如后台服务器故障，该用户的所有的会话的访问，自然地会话本身也将丢失。即便是数据库服务器也发生该情况。虽然Web服务（Web Service）不存在状态和粘性（sticky），但是用户和数据库存是绑定的（存在粘性）。
第二个方案是依据用户名，客户端IP来分配提供服务的服务器，也可以随机分配。因为客户可能是通过DHCP，NAT或者Web代理来连接Internet的，其IP地址可能经常变换，这使得这个方案的服务质量无法保障。随机分配由负载均衡器将会话信息存储保存。如果负载均衡器被替换或故障，这些信息可能会丢失；另外（负载均衡器）负载较高的时候，为保证分配表空间不会被耗尽，超时的分配信息必须被删除。随机分配方法也要求客户会维持会话状态，如果客户浏览器禁用了cookies的功能，就会引起问题。优秀的负载均衡器会使用多种持续（会话保持）技术，以避免其中某些不可以用时引起故障。
幸运的是有一种更有效的方法，通常客户浏览器可以保存用户的每个会话信息。例如使用浏览器cookie，对数据加密并加上一个时间戳就可以保证安全了；URL重写。将会话信息存储在客户端通常是首选方案，因为这样负载均衡器就可以灵活的选择后台服务器来处理用户请求。然而这种方法不适应于一些较复杂的电子商务，因为电子商务中会话数据较大，而且需要服务器需要经常重新处理会话信息；与此同时，URL重写由于用户可以改变会话流数据而存在安全问题；加密客户端cookies也一直存在着安全方面的争议，因为HTTP很容易遭到中间人攻击，除非所有的会话都通过HTTPS，否则无法保证安全性。
负载均衡器的特性.
不论是软件负载均衡器，还是硬件负载均衡器都有一系列的特性：
在电信行业的应用.
负载均衡对通讯链路的冗余是非常有用的。例如，一家公司可能有多条互联网接入线路以保证某一条故障时仍可以正常接入互联网。
故障转移的架构意味着一条连接正常使用，另外一条连接作为备用，当第一条出现故障时才会被启用。
使用负载均衡器，两条（多条）连接可以都投入使用。有一个设备或者程序实时监控着所有连接的连通性，并且对正在发送的包进行选路。同时使用多条连接可以增加带宽。
许多电信公司在其内部网络或连接到外部网络（其它电信网络）都有多条线路可以使用。为避免某条链路出现网络堵塞，最小化连接其它网络的费用或者提高网络的可靠性，它们使用负载均衡将流量从一条链路转移到另一条链路。IEEE 802.1aq - Shortest Path Bridging
负载均衡的另一个用途是监控网络活动。负载均衡器能用于将巨大的网络流量分割为几个子流并使用网络分析器，每个都读取原始数据的一部分。这对于监视10GbE, STM64高速网络非常有用，在这些网络上由于数据量太大进行复杂的数据处理几乎是不可能的。
在电子邮件伺服器的应用
Anti-spam Gateway或Anti-spam伺服器端软体
与备援关系
系统纪录档案的扫描(log scan)
与故障转移的关系.
负载均衡经常被用于实现故障转移-当一个或多个组件出现故障时能持续提供服务这些组件都在持续监控（例如：Web服务器通过请求一个已知页面来监控是否正常工作）中，当一个组件没有响应，负载均衡器就会发现并不再向其发送数据。同样当一个组件重新上线，负载均衡器会重新开始向其发送数据。为了能够如前所述正常工作，负载均衡体系中至少要有一个冗余服务。采用一用一备方案（一个组件提供服务，一个备用，当主组件故障时备用组件将接管继续提供服务）比故障转移方案更加经济，灵活。有些类型的RAID系统使用的热备份功能跟这是类似的作用。