负载均衡的演变史

随着互联网技术的飞速发展,软件系统的规模和复杂度不断增加,系统架构也经历了从简单到复杂、从集中式到分布式的演变。下面我们来回滚一下系统架构中负载均衡的演变历程。
HTTP重定向负载均衡
HTTP重定向负载均衡是一种通过HTTP重定向的方式来实现负载均衡的简单方法。当用户访问一个网站时,首先会请求一个重定向服务器,这个服务器根据一定的负载均衡算法,选择一个后端服务器,然后将用户重定向到该服务器。
工作原理
- 用户发起请求: 用户在浏览器中输入网站的域名
- 重定向服务器处理: 用户的请求到达重定向服务器,重定向服务器根据负载均衡算法选择一个后端服务器。
- 重定向响应: 重定向服务器返回一个 HTTP 302 重定向响应,告诉浏览器重新向选定的后端服务器发起请求。
- 后端服务器处理: 浏览器收到重定向响应后,再次发起请求,这次请求会直接到达后端服务器。
HTTP重定向负载均衡的优点:
- 实现简单: 不需要额外的硬件设备或复杂的配置。
- 易于部署: 可以快速部署在现有的Web服务器上。
HTTP重定向负载均衡的缺点:
- 性能开销: 一次用户请求,实际上需要两次HTTP请求,增加了响应时间。
- 暴露的服务器地址: 重定向会暴露真实的服务器地址,不安全
- 单点故障: 如果重定向服务器发生故障,整个系统将不可用。
- 搜索引擎优化问题: 搜索引擎可能会将重定向视为 SEO 作弊。
- 扩展性有限: 随着流量的增加,重定向服务器可能成为瓶颈。
综上所述,HTTP重定向负载均衡是一种简单易行的负载均衡方式,但存在一些性能和可靠性方面的限制。对于流量较小的网站,HTTP重定向负载均衡可以作为一个简单的解决方案。或者在进行网站维护或升级期间,可以临时使用HTTP重定向来分流流量。
DNS负载均衡
DNS负载均衡是一种通过DNS服务器来分发网络流量,实现负载均衡的技术。简单来说,就是将同一个域名解析到多个不同的IP地址上,从而将用户请求分发到不同的服务器上,达到负载均衡的目的。
工作原理
- 用户发起请求: 用户在浏览器输入域名,向 DNS 服务器发送查询请求。
- DNS服务器响应: DNS服务器根据负载均衡算法,返回一个或多个IP地址给用户。
- 浏览器访问: 浏览器根据得到的IP地址,向对应的服务器发送HTTP请求。
和 HTTP 重定向不同,用户不需要每次请求都进行 DNS 域名解析,只有在第一次解析后,域名信息缓存到浏览器本地,后续很长时间都不需要进行域名解析了。同时 DNS 还支持基于地理位置的域名解析,即会将域名解析到距离用户最近的服务器地址。
DNS负载均衡的优点
-
实现简单,成本低廉: 只需配置 DNS 服务器即可实现,无需额外的硬件或软件,成本更低。
-
灵活配置: 可以根据需要灵活配置负载均衡算法和权重。比如轮询,最小链接策略。
DNS负载均衡的缺点
-
延迟较高: 每次请求都需要进行DNS解析,增加了响应时间。
-
不适合动态变化: 如果后端服务器状态变化频繁,由于 DNS 缓存的存在,可能导致更新不及时。
-
无法感知服务器状态: DNS负载均衡无法感知后端服务器的实时状态,无法进行智能路由。如CPU负载、内存使用率等。
DNS 负载均衡是一种简单易行的负载均衡方式,适用于一些简单的场景。比如静态内容分发, 分发静态文件(如图片、CSS、JS)到不同的 CDN 节点。但是,对于要求高性能、高可用性的系统,DNS 负载均衡可能无法满足需求。
反向代理负载均衡(Nginx)
反向代理是一种服务器,它作为客户端和服务器之间的中间层。客户端发送请求时,会先到达反向代理服务器。反向代理服务器根据一定的规则,将请求转发给后端的多个服务器中的一台,从而实现负载均衡。反向代理服务器有很多种,我们常用的是 Nginx,它是高性能、轻量级、开源的HTTP和反向代理服务器,支持多种负载均衡算法。
工作原理
- 客户端发起请求: 客户端向反向代理服务器发送请求。
- 反向代理接收请求: 反向代理服务器接收到请求后,根据配置的负载均衡算法,选择一个合适的后端服务器。
- 请求转发: 反向代理服务器将请求转发给选定的后端服务器。
- 后端服务器处理请求: 后端服务器处理请求并返回响应。
- 反向代理返回响应: 反向代理服务器将后端服务器的响应返回给客户端。
nginx 反向代理服务器是基于 http 协议之上的,它处理的是 http 的请求和响应。外部 Ip 是暴露给用户的,用户根据外部 ip 请求到达 nginx 后,nginx 通过负载均衡算法,将请求直接转发给对应的服务器,服务器返回响应给 nginx 服务器,nginx 服务器再将响应数据给用户。
反向代理负载均衡的优点
- 提高系统性能: 将请求分发到多个服务器,提高系统的并发处理能力。
- 提高系统可用性: 当某个后端服务器出现故障时,可以自动将请求转发到其他正常的服务器上,保证系统的可用性。
- 隐藏后端服务器: 将后端服务器的IP地址隐藏起来,提高系统的安全性。
- 提供缓存和压缩功能: Nginx 可以缓存静态资源,减少后端服务器压力。压缩数据减少带宽消耗。
- 提供SSL卸载功能: 可以对HTTPS请求进行SSL卸载,减轻后端服务器的负担。
反向代理负载均衡的缺点
- 性能瓶颈: 全部请求都经过反向代理,对于大型项目容器成为性能瓶颈。
- 单点故障: 一旦反向代理服务器出现问题,整个系统都将无法对外提供服务。
通过反向代理服务器将客户端请求分发到多个后端服务器上,提高系统的性能和可用性。
网关负载均衡服
网关负载均衡服务器,简单来说就是专门为微服务架构设计的负载均衡器。它是一种通过在网络层对 IP 数据包进行分发,实现将网络流量分布到多台服务器上的技术。它不仅能像传统负载均衡器一样分发请求,而且还提供了一系列额外的功能,以更好地适应现代微服务架构的需求。
工作原理
请求到达网关服务器后,会修改目标的 ip 地址为应用服务器的 ip ,服务器返回响应给网关后,网关再将响应返回给用户。
和 nginx 的区别是,网关负载均衡是建立在 ip 协议之上的。相比较 nginx 的 http 协议更加轻。只需修改 ip 即可,而不是整个 http 协议。
网关负载均衡服务器,实际上是为微服务提供了一些列功能,根据配置的算法(如轮询、随机、最小连接等)将请求分发到不同的后端服务实例,仅仅是一个功能,还有其他的比如:
- 流量入口统一: 所有客户端请求都先经过网关,统一管理。
- 服务发现: 自动发现后端服务,无需手动配置。
- API网关功能: 提供统一的API接口,对后端服务进行聚合、转换和保护。
- 流量控制: 可以限制流量,防止服务过载。
- 安全防护: 提供身份认证、授权、防 DDOS 等安全功能。
-
监控和告警: 实时监控系统运行状态,及时发现并告警异常。
网关负载均衡服务器与传统负载均衡器的区别
特征 | 传统负载均衡器 | 网关负载均衡服务器 |
---|---|---|
功能 | 主要负责流量分发 | 除了流量分发,还提供API网关、服务发现、安全防护等功能 |
设计目标 | 主要针对传统应用 | 为微服务架构设计,关注服务治理 |
复杂度 | 相对简单 | 功能更复杂,配置更灵活 |
尽管网关服务器提供了很多功能,但是它仍然存在性能瓶颈。全部的请求和响应都要经过网关,特别是对于一些视频输出的网站,响应流量大,无疑会对网关的带宽产生极大负担。那么有没有什么办法能解决性能瓶颈呢?即负载均衡服务器只进行请求的分发,后端服务器响应的数据直接返回给用户。且看后文。
LVS数据链路层的负载均衡
LVS (Linux Virtual Server),它是一种在数据链路层进行负载均衡的机制。LVS 通过修改数据包的MAC 地址,将客户端的请求直接转发到后端真实服务器(Real Server),实现了高性能、高可用的负载均衡。
LVS的工作原理
- 客户端请求: 客户端发送一个数据帧到LVS的VIP(虚拟IP)。
- LVS处理: LVS接收到这个数据帧后,根据负载均衡算法,选择一个后端Real Server。
- 修改目标MAC: LVS将数据帧的目标MAC地址修改为所选Real Server的MAC地址。
- 转发数据帧: LVS将修改后的数据帧直接发送到局域网中。
- Real Server接收: Real Server的网卡会根据MAC地址匹配,识别出这个数据帧是发给自己的,从而接收并处理。
- Real Server响应: Real Server的响应直接返回给客户端,不需要经过LVS。
使用 LVS 修改 MAC 地址是有一个前提的,要求所有的服务器在同一个网段内。从下图可看到负载均衡服务器的 ip 和 真实服务器的 IP 是一样的。因为仅仅修改请求目标的Mac地址,所以响应会直接到浏览器。
LVS的优势
- 性能高: 由于LVS只修改MAC地址,不涉及IP地址的修改,不需要二次路由,直接到达真实服务器。因此性能开销较小。
- 高可用性: 当LVS故障时,Real Server之间可以相互通信,保证服务的可用性。
- 可扩展性强: 可以灵活地添加或删除Real Server。
- 没有带宽压力 响应数据直接返回给浏览器,不经过负载均衡服务器。
准确来说,前面的 LVS 实际上是 LVS-DR 。总结来说,LVS 是一种高效的负载均衡方式,通过修改目标MAC地址,LVS实现了数据帧在数据链路层的直接转发,从而提高了系统的性能和可靠性。尤其适用于对性能和高可用性要求较高的场景。但是,LVS的配置比较复杂,需要对网络有深入的了解。在选择LVS工作模式时,需要根据具体的应用场景和需求进行综合考虑。
常见的负载均衡策略
轮询(Round Robin):
按顺序依次将请求分发给后端服务器。适用于后端服务器性能相近且处理时间差不多的场景。简单易实现,但无法根据服务器的负载情况进行动态调整。
随机(Random):
随机选择一个后端服务器来处理请求。简单高效,但无法保证负载的均衡。
最小连接(Least Connections):
将请求分发给当前已建立连接数最少的服务器。适用于连接建立时间较长或者处理时间变化较大的场景。
最少响应时间(Least Response Time):
将请求分发给响应时间最短的服务器。 需要实时监控后端服务器的响应时间,实现起来相对复杂。
加权轮询(Weighted Round Robin):
根据预设的权重值,为不同的后端服务器分配不同的请求比例。适用于性能不一致的后端服务器,可以根据服务器的处理能力进行加权。
IP哈希(IP Hash):
根据客户端IP的哈希值来选择后端服务器。 保证来自同一个客户端的请求始终被分发到同一台服务器上,适用于需要保持会话状态的应用。
一致性哈希(Consistent Hashing):
一种特殊的哈希算法,用于在动态变化的集群中保持数据分布的一致性。 适用于分布式缓存和分布式数据库等场景。
总结
负载均衡的演变发展和系统架构的设计发展是密不可分的,可以说是其中一部分,这通常是架构师的工作,虽然目前我还不是架构师,但是理解这些基础,无论是对以后还是现在都是由莫大帮助的。你公司使用的是哪种负载均衡模型呢?欢迎分享。
把这些演变过程连贯起来,就会发现,负载均衡其实就是围绕着如何将请求分发这个问题,给出了不同的答案。从最初的重定向,到 DNS 解析,到反向代理,到 IP 协议,到数据链路层。方向始终是把请求的数据包,一层层的向下剥开,这更加使我体会到计算机网络的重要性。