【Distributed System】负载均衡(Load Balancing)

Posted by 西维蜀黍 on 2019-07-26, Last Modified on 2023-09-28

负载均衡(Load balancing)

**负载平衡(Load balancing)**是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。 主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题。

A load balancer acts as the “traffic cop” sitting in front of your servers and routing client requests across all servers capable of fulfilling those requests in a manner that maximizes speed and capacity utilization and ensures that no one server is overworked, which could degrade performance. If a single server goes down, the load balancer redirects traffic to the remaining online servers. When a new server is added to the server group, the load balancer automatically starts to send requests to it.

In this manner, a load balancer performs the following functions:

  • Distributes client requests or network load efficiently across multiple servers
  • Ensures high availability and reliability by sending requests only to servers that are online
  • Provides the flexibility to add or subtract servers as demand dictates

DNS 负载均衡

DNS负责将用户请求的域名映射为实际的IP地址,这种映射可以是一对多的( DNS的A记录,用来指定域名对应的IP地址),这样DNS服务器便充当负载均衡调度器。

使用多条 A 记录

使用多条 A 记录来实现服务器流量的负载均衡,可以算是 DNS 负载均衡的变式方法。

例如:有 3 台服务器,对应 3 个 IP 地址,分别是 1.1.1.12.2.2.23.3.3.3,设置的 3 个 A 记录如下:

记录 类型 主机 线路 权重
1 A www default 1.1.1.1 600
2 A www default 2.2.2.2 600
3 A www default 3.3.3.3 600

当 Local DNS 访问权威 DNS,权威 DNS 会将这 3 个解析记录全部返回给 Local DNS, Local DNS 会将所有的 IP 地址返回给网站访问者,网站访问者的浏览器会随机访问其中一个 IP。

这种方法用在无 DNS 负载均衡的权威 DNS 中,能够在一定程度上减轻单台服务器的压力,但它不能区分服务器的差异,不能反映服务器的当前运行状态。

DNS负载算法

轮循负载算法

DNS 负载均衡采用简单的轮循负载算法。

在有 DNS 负载均衡的权威 DNS 服务器中,网站访问者的请求到来时,权威 DNS 服务器会根据解析记录的权重轮询 3 个 A 记录(默认权重 1:1:1),依次返回 3 个 IP 地址。

User1 访问,返回 1.1.1.1 User2 访问,返回 2.2.2.2 User3 访问,返回 3.3.3.3 User4 访问,返回 1.1.1.1 ……

带权重的轮询负载算法

对于权重不同的 DNS 负载均衡,如 2:1:1,则返回如下:

User1 访问,返回1.1.1.1 User2 访问,返回 2.2.2.2 User3 访问,返回 3.3.3.3 User4 访问,返回1.1.1.1 User5 访问,返回1.1.1.1 User6 访问,返回 2.2.2.2 ……

总结

DNS域名解析也存在如下缺点:

  1. 目前的DNS是多级解析的,每一级DNS都可能缓存A记录,当某台服务器下线之后,即使修改了A记录,要使其生效也需要较长的时间,这段时间,DNS任然会将域名解析到已下线的服务器上,最终导致用户访问失败。
  2. 不能够按服务器的处理能力来分配负载。DNS负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异,不能反映服务器当前运行状态,所以其的负载均衡效果并不是太好。
  3. 可能会造成额外的网络问题。为了使本DNS服务器和其他DNS服务器及时交互,保证DNS数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题。
  4. this simple implementation of DNS load balancing has inherent problems that limit its reliability and efficiency. Most significantly, DNS does not check for server or network outages or errors, and so always returns the same set of IP addresses for a domain even if servers are down or inaccessible.

事实上,大型网站总是部分使用DNS域名解析,利用域名解析作为第一级负载均衡手段,即域名解析得到的一组服务器并不是实际提供服务的物理服务器,而是同样提供负载均衡服务器的内部服务器,这组内部负载均衡服务器再进行负载均衡,请请求发到真实的服务器上,最终完成请求。

反向代理负载均衡

Layer 7 Load Balancing

反向代理服务器的核心工作是转发HTTP,它工作在HTTP层面,因此,基于反向代理的负载均衡也称为七层负载均衡。

任何对于实际服务器的HTTP请求都必须经过调度器;调度器必须等待实际服务器的HTTP响应,并将它反馈给用户。

Network load balancing(Layer 4 Load Balancing)

网络地址转换(NAT)负载均衡工作在传输层,对数据包中的IP地址和端口进行修改,从而达到转发的目的,称为四层负载均衡。

NAT服务器(前端服务器)必须作为实际服务器(后端服务器)的网关,否则数据包被转发后将一去不返。

Global Server Load Balancing

Global server load balancing occurs across several geographically distributed servers. For example, companies can have servers in multiple data centers, in different countries, and in third-party cloud providers around the globe. In this case, local load balancers manage the application load within a region or zone. They attempt to redirect traffic to a server destination that is geographically closer to the client. They might redirect traffic to servers outside the client’s geographic zone only in case of server failure.

直接路由

这种方式工作在数据链路层。它修改数据包的目标MAC地址,并没有修改目标IP(因为这种转发工作在数据链路层,它对上层端口无能为力),然后发给实际的服务器,实际服务器的响应数据直接发回给用户,而不用经过调度器。但实际服务器必须接入外网,而且不能将调度器作为默认网关,要给实际服务器添加和调度器IP地址相同的IP别名。

负载均衡算法(Load Balancing Algorithms)

1 轮询(Round Robin

这是最常用也最简单策略,平均分配,人人都有、一人一次。

加权轮询(Weighted round robin

在轮询的基础上,增加了一个权重的概念。权重是一个泛化后的概念,可以用任意方式来体现,本质上是一个能者多劳思想。比如,可以根据宿主的性能差异配置不同的权重。

A weight is assigned to each server based on criteria chosen by the site administrator; the most commonly used criterion is the server’s traffic‑handling capacity. The higher the weight, the larger the proportion of client requests the server receives. If, for example, server A is assigned a weight of 3 and server B a weight of 1, the load balancer forwards 3 requests to server A for each 1 it sends to server B.

Dynamic round robin

A weight is assigned to each server dynamically, based on real‑time data about the server’s current load and idle capacity.

2 最少连接数(Least Connections)

这是一种根据实时的负载情况,进行动态负载均衡的方式。维护好活动中的连接数量,然后取最小的返回即可

3 Hash法

hash法的负载均衡与之前的几种不同在于,它的结果是由客户端决定的。通过客户端带来的某个标识经过一个标准化的散列函数进行打散分摊

上图中的散列函数运用的是最简单粗暴的「取余法」。

另外,被求余的参数其实可以是任意的(such as the client IP address or the request URL),只要最终转化成一个整数参与运算即可。最常用的应该是用来源 IP地址作为参数,这样可以确保相同的客户端请求尽可能落在同一台服务器上。

这可能与某些特殊的最终一致性联系起来,比如 读己所写一致性(Read-your-writes Consistency)、会话一致性(Session Consistency)。

Refer to https://swsmile.info/post/distributed-system-consistency-model/

5 Least Time

Sends requests to the server selected by a formula that combines the fastest response time and fewest active connections.

对比

Reference