负载均衡详细介绍 — 算法与转发实现

什么是负载均衡?

当一台应用服务器的性能达到极限时,我们可以使用集群这种技术手段来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台应用服务器去处理。

这个调度者就是负载均衡服务器。

负载均衡服务器可以用来实现网站架构的高可用以及伸缩性

  • 高可用:当某个节点故障时,负载均衡器会将用户请求转发到另外的节点上,从而保证所有服务持续可用;
  • 伸缩性:根据系统整体负载情况,可以很容易地添加或移除节点。

负载均衡服务器的实现可以分成两个部分:

  • 根据负载均衡算法和Web服务器列表计算得到集群中一台Web服务器的地址
  • 将请求数据发送到该地址对应的Web服务器

下面分别介绍负载均衡的算法与转发实现这两个部分。

一、负载均衡算法

1. 轮询(Round Robin)

轮询算法把每个请求轮流发送到每个服务器上。

适合于所有服务器硬件都相同的场景。

如下图所示,一共有四个请求(1,2,3,4)按序到达负载均衡调度器,它们会被轮流发给服务器 A 和服务器 B.

在这里插入图片描述
但是如果服务器性能差异过大,那么性能较差的服务器可能无法承担过大的负载,如下图的Server B,它只能承受一个请求。

在这里插入图片描述
2. 加权轮询(Weighted Round Robbin)

加权轮询是在轮询的基础上,根据服务器的性能差异,为服务器赋予一定的权值,性能高的服务器分配更高的权值。

如下图所示,服务器 A 被赋予的权值为 3,服务器 B 被赋予的权值为 1,那么 (1, 2, 3) 请求会被发送到服务器 A,(4) 请求会被发送到服务器 B。

在这里插入图片描述

3. 随机(Random)

把请求随机发送到服务器上。和轮询算法类似,该算法比较适合服务器性能差不多的场景。同样,对于服务器性能有差异的场景,也可以使用加权随机算法。

在这里插入图片描述

4. 最少连接(least Connections)

记录每个应用服务器正在处理的连接数(请求数),将新到的请求分发到最少连接的服务器上,应该说,这是最符合负载均衡定义的算法。同样,最少连接算法也可以实现加权最少连接。

如下所示,此时服务器 B 的连接数较少,那么新到达的请求,将会被转发到服务器 B上。
在这里插入图片描述

5. 源地址散列(Source Hashing)

根据请求来源的IP地址进行Hash计算,再对应用服务器数量进行取模,得到应用服务器,这样来自同一个IP地址的请求总在同一个服务器上处理,该请求的上下文信息可以存储在这台服务器上,在一个会话周期内重复使用,从而实现会话粘滞(Session 复制)

在这里插入图片描述

二、转发实现

1. HTTP 重定向负载均衡

HTTP 重定向负载均衡服务器使用某种负载均衡算法计算得到服务器的 IP 地址之后,将该地址写入 HTTP 重定向报文中,状态码为 302。客户端收到重定向报文之后,需要重新向服务器发起请求。

在这里插入图片描述
优点:实现简单。

缺点:

  • 两次请求,访问延迟较高
  • HTTP 负载均衡器处理能力有限,会限制集群的规模。

实践中使用这种方案进行负载均衡的案例并不多见。

2. DNS 域名解析负载均衡

在 DNS 服务器中配置多个 A 记录,如 : www.mysite.com IN A 114.100.80.1、www.mysite.com IN A 114.100.80.2、www.mysite.com IN A 114.100.80.3。

每次域名解析请求都会根据负载均衡算法计算一个不同的IP地址返回,这样 A 记录中配置的多个服务器就构成一个集群,并可以实现负载均衡。

在这里插入图片描述
优点:DNS 能够根据地理位置进行域名解析,返回离用户最近的服务器 IP 地址。

缺点:由于 DNS 具有多级结构,每一级的域名记录都可能被缓存,当下线一台服务器需要修改 DNS 记录时,需要过很长一段时间才能生效。

大型网站总是部分使用 DNS 域名解析, 利用 DNS 做为第一级负载均衡手段,然后在内部使用其它方式做第二级负载均衡。也就是说,域名解析的结果为内部的负载均衡服务器 IP 地址,而不是实际提供Web服务的物理服务器。之后再有这些内部的负载均衡服务器进行负载均衡,将请求发到真实的Web服务器上。

3. 反向代理负载均衡

利用反向代理可以缓存资源,以改善网站性能。

在部署位置上,反向代理服务器处于Web服务器前面(所以可以缓存Web响应,加速访问),这个位置正好也是负载均衡服务器的位置,所以大多数反向代理服务器同时提供负载均衡的功能。

在这种负载均衡转发方式下,客户端不直接请求源服务器,因此源服务器不需要外部 IP 地址,而反向代理需要配置内部和外部两套 IP 地址。

在这里插入图片描述
由于反向代理服务器转发请求在HTTP协议层面,因此也叫应用层负载均衡。

优点:与其它功能集成在一起,部署简单。

缺点:所有请求和响应都需要经过反向代理服务器,它可能会成为性能瓶颈。

4. IP负载均衡

在网络层通过修改请求目标地址进行负载均衡。

用户请求数据包到达负载均衡服务器后,负载均衡服务器在操作系统内核进程获取网络数据包,根据负载均衡算法计算源服务器的 IP 地址,并修改请求数据包的目的 IP 地址,最后进行转发。

源服务器返回的响应也需要经过负载均衡服务器,通常是让负载均衡服务器同时作为集群的网关服务器来实现。

在这里插入图片描述
优点:在内核进程中进行处理,性能比较高。

缺点:和反向代理一样,所有的请求和响应都经过负载均衡服务器,会成为性能瓶颈。

5. 数据链路层负载均衡

在链路层根据负载均衡算法计算源服务器的 MAC 地址,并修改请求数据包的目的 MAC 地址,并进行转发。

通过配置源服务器的虚拟 IP 地址和负载均衡服务器的 IP 地址一致,从而不需要修改 IP 地址就可以进行转发也正因为 IP 地址一样,所以源服务器的响应不需要转发回负载均衡服务器,可以直接转发给客户端,避免了负载均衡服务器的成为瓶颈。

这是一种三角传输模式,被称为直接路由。对于提供下载和视频服务的网站来说,直接路由避免了大量的网络传输数据经过负载均衡服务器。

在这里插入图片描述

参考内容:《大型网站技术架构》- 李智慧著
文章第二部分,负载均衡转发实现部分的插图均来自此书。

猜你喜欢

转载自blog.csdn.net/u013568373/article/details/91403446