负载均衡
将请求或者数据分摊到多个操作单元上
进行执行,共同完成
工作任务。
目的就通过调度集群,达到最佳化资源使用
,最大化吞吐率,最小化响应时间,避免单点过载
的问题。
如果HTTP请求分发装置
可以感知
或者可以配置集群的服务器数量
,可以及时发现集群中新上线或下线的服务器
,并能向新上线的服务器分发请求,停止向已下线的服务器分发请求
,那么就实现了负载均衡。
负载均衡的几种实现方式
负载均衡是网站必不可少的基础技术手段,不但可以实现网站的伸缩性,同时还改善网站的可用性,可谓网站的杀手铜之一。
Http重定向负载均衡
HTTP重定向服务器
是一台普通的应用服务器,其唯一的功能就是根据用户的HTTP请求计算一台真实的Web服务器地址
,并将该Web服务器地址写入HTTP重定向响应中(响应状态码302)返回给用户浏览器
。
在上图中,浏览器请求访问
域名www.mysite.com,DNS服务器解析得到IP地址是114.100.80.10,即HTTP重定向服务器的IP地址
。然后浏览器通过IP地址114.100.80.10访问HTTP重定向负载均衡服务器后,服务器根据某种负载均衡算法计算获得一台实际物理服务器的地址
(114.100.80.3),构造一个包含该实际物理服务器地址的重定向响应返回给浏览器
,浏览器自动重新请求实际物理服务器的IP地址114.100.80.3,完成访问。
这种负载均衡方案的优点是比较简单。
缺点是浏览器需要两次请求服务器才能完成一次访问,性能较差
;
重定向服务器自身的处理能力有可能成为瓶颈
,整个集群的伸缩性规模有限;使用HTTP302响应码重定向,有可能使搜索引擎判断为SEO作弊,降低搜索排名。因此实践中使用这种方案进行负载均衡的案例并不多见。
DNS域名解析负载均衡
是利用DNS处理域名解析请求的同时进行负载均衡处理的一种方案。
每次域名解析请求
都会根据负载均衡算法
计算一个不同的IP地址返回
,这样A记录中配置的多个服务器就构成一个集群,并可以实现负载均衡。图中的浏览器请求解析域名www.mysite.com,DNS根据A记录和负载均衡算法计算得到一个IP地址114.100.80.3,并返回给浏览器;浏览器根据该IP地址,访问真实物理服务器114.100.80.3。
DNS域名解析负载均衡的优点是将负载均衡的工作转交给DNS,省掉了网站管理维护负载均衡服务器的麻烦
,同时许多DNS还支持基于地理位置的域名解析,即会将域名解析成距离用户地理最近的一个服务器地址,这样可加快用户访问速度,改善性能。
缺点就是目前的DNS是多级解析,每一级DNS都可能缓存A记录,当下线某台服务器后,即使修改了DNS的A记录,要使其生效也需要较长时间,这段时间,DNS依然会将域名解析到已经下线的服务器,导致用户访问失败;而且DNS负载均衡的控制权在域名服务商那里,网站无法对其做更多改善和更强大的管理。
事实上,大型网站总是部分使用DNS域名解析,利用域名解析作为第一级负载均衡手段,即域名解析得到的一组服务器并不是实际提供Web服务的物理服务器,而是同样提供负载均衡服务的内部服务器,这组内部负载均衡服务器再进行负载均衡,将请求分发到真实的Web服务器上
。
反向代理负载均衡(请求转发)
反向代理服务器处于Web服务器前面(这样才可能缓存Web响应,加速访问),这个位置也正好是负载均衡服务器的位置,所以大多数反向代理服务器同时提供负载均衡的功能,管理一组Web服务器,将请求根据负载均衡算法转发到不同Web服务器上
。Web服务器处理完成的响应也需要通过反向代理服务器返回给用户。
浏览器访问请求的地址是反向代理服务器的地址
114.100.80.10,反向代理服务器收到请求后,根据负载均衡算法
计算得到一台真实物理服务器的地址
10.0.0.3,并将请求转发给服务器
。10.0.0.3处理完请求后将响应返回给反向代理服务器,反向代理服务器再将该响应返回给用户
。
优点是和反向代理服务器功能集成在一起,部署简单
。
缺点是反向代理服务器是所有请求和响应的中转站,其性能可能会成为瓶颈。
IP负载均衡
在网络层通过修改请求目标地址进行负载均衡。
用户请求数据包到达负载均衡服务器114.100.80.10后,负载均衡服务器
在操作系统内核进程获取网络数据包
,根据负载均衡算法计算得到一台真实Web服务器
10.0.0.1,然后将数据目的IP地址修改
为10.0.0.1,不需要通过用户进程处理。真实Web应用服务器处理完成后,响应数据包回到负载均衡服务器,负载均衡服务器再将数据包源地址修改为自身的IP地址
(114.100.80.10)发送给用户浏览器。
IP负载均衡在内核进程完成数据分发,较反向代理负载均衡(在应用程序中分发数据)有更好的处理性能。但是由于所有请求响应都需要经过负载均衡服务器
,集群的最大响应数据吞吐量不得不受制于负载均衡服务器网卡带宽
。对于提供下载服务或者视频服务等需要传输大量数据的网站而言,难以满足需求。能不能让负载均衡服务器只分发请求,而使响应数据从真实物理服务器直接返回给用户呢?
数据链路层负载均衡
这种数据传输方式又称作三角传输模式,负载均衡数据分发过程中不修改IP地址,只修改目的mac地址
,通过配置真实物理服务器集群所有机器虚拟IP和负载均衡服务器
IP地址一致,从而达到不修改数据包的源地址和目的地址就可以进行数据分发的目的,由于实际处理请求的真实物理服务器IP和数据请求目的IP一致,不需要通过负载均衡服务器进行地址转换
,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈
。这种负载均衡方式又称作直接路由方式(DR)。
在图中,用户请求到达负载均衡服务器114.100.80.10后,负载均衡服务器将请求数据的目的mac地址修改为00:0c:29:d2,并不修改数目包目标IP地址
,由于Web服务器集群所有服务器的虚拟IP地址都和负载均服务器的IP地址相同,因此数据可以正常传输到达mac地址00:0c:29:d2对应的服务器
,该服务器处理完成后发送响应数据到网站的网关服务器,网关服务器直接将该数据包发送到用户浏览器(通过互联网),响应数据不需要通过负载均衡服务器。
使用三角传输模式的链路层负载均衡是目前大型网站使用最广的一种负载均衡手段。
负载均衡算法
- 根据
负载均衡算法
和Web服务器列表
计算得到集群中一台Web服务器的地址
。 - 将
请求数据发送到该地址对应的Web服务器
上。
轮询(Round Robin,RR)
请求按顺序轮流分配到后台服务器上,均衡的对待每一台服务器,每台服务器需要处理的请求数目都相同
,而不关心服务器实际的连接数和当前的系统负载
。使用轮询策略的目的是,希望做到请求转移的绝对均衡
轮询法适用于机器性能相同的服务
,一旦某台机器性能不好,极有可能产生木桶效应,性能差的机器扛不住更多的流量。
加权轮询(Weighted Round Robin,WRR)
不同的后台服务器
可能机器的配置
和当前系统的负载并不相同
,因此它们的抗压能力也不一样
。给配置高、负载低的机器分配更高的权重,使其能处理更多的请求,而配置低、负载高的机器,则给其分配较低的权重,降低其系统负载
随机(Random)
请求被随机分配到各个应用服务器
,在许多场合下,这种方案都很简单实用,因为好的随机数本身就很均衡。
随着调用量的增大
,其实际效果越来越接近于平均分配
流量到后台的每一台服务器,也就是轮询法
的效果。
同样地,它也不适用于机器性能有差异
的分布式系统。
加权随机
加权随机法跟加权轮询法类似,根据后台服务器不同的配置和负载情况,配置不同的权重
。不同的是,它是按照权重来随机选取服务器的
,而非顺序。
最少连接(Least Connections)
记录每个应用服务器正在处理的连接数
(请求数),将新到的请求分发到最少连接的服务器上
,应该说,这是最符合负载均衡定义的算法。同样,最少连接算法也可以实现加权最少连接
。
源地址哈希法
根据请求来源的IP地址进行Hash计算
,得到应用服务器,这样来自同一个IP地址的请求总在同一个服务器上处理
,该请求的上下文信息可以存储在这台服务器上
,在一个会话周期内重复使用,从而实现会话黏滞。