负载均衡的种类

负载均衡在web服务领域下主要是说将请求分发到不同的节点进行处理,目的是为了均衡服务器的负载,避免单点不可响应的情况。一次请求到服务器之间,有那么多环节,因此可以实现的方法有很多种,实际应用中不外乎以下几种方式。

HTTP 重定向负载均衡

HTTP 重定向负载均衡有一台重定向服务器,它也是一台普通的服务器,其唯一的功能就是根据用户的 HTTP 请求计算一台应用集群中服务器的地址,并将此地址写入 HTTP 重定向响应中返回给用户。

这种方案实现起来非常简单,但是需要浏览器请求两次服务器才能完成。并且重定向服务器很容易编程瓶颈,因为一次重定向返回的过程,也是一次标准 HTTP 请求,如果集群内有10台机器,那 HTTP 重定向服务器的流量将是应用服务器的10倍,如果有100台估计就要宕机了,所以伸缩性能受到了很大的限制。还有使用302响应码重定向,不利于网站的SEO。

DNS域名解析负载均衡

这是利用 DNS 处理域名解析请求的同时进行负载均衡处理的一种方案。在 DNS 中配置多个 A 记录,每次域名解析请求都会根据负载均衡算法计算一个不同的 IP 地址返回。

DNS 域名解析负载均衡的优点是将负载均衡的工作转交给 DNS,省掉了网站管理维护负载均衡服务器的麻烦,同时还可以使用智能 DNS 可以基于地理位置或者 ISP 来做域名解析,用户将会得到距离最近或者速度最快的一个服务器地址,这样可以加快用户的访问速度,改善性能。

但是这种方法也有很大的缺点,DNS 是多级解析,每一级都会缓存 DNS 记录,如果某个服务器变动了,DNS 记录更新的时间将会很长,这个速度取决于域名服务商。

一般大型网站都会使用 DNS 域名解析,利用域名解析作为一级负载均衡手段。你可以使用 dig <域名> 的方法查看某个域名的A记录,你会发现很多网站会有多条 A 记录。

反向代理负载均衡

这种方法就是使用反向代理服务器,它一般在 web 服务器前面,这个位置也正好是负载均衡服务器的位置,所以大多数反向代理服务器同时也提供负载均衡的功能。

由于 web 服务器不直接对外提供访问,因此 web 服务器不需要使用外部 IP,而反向代理服务器则需要配置双网卡和内部外部两套 IP 地址。

反向代理服务器转发请求是在 HTTP 协议层面,因此也叫应用层负载均衡,由于应用层在七层网络模型中的第七层,所以一般也称为七层负载均衡。优点就是和反向代理服务器功能集成在一起,部署简单。缺点是反向代理服务器是所有请求和响应的中转站,其性能可能会成为瓶颈。

网络层负载均衡

这种方法是在网络层通过修改请求目标地址进行负载均衡,网络层在七层网络层模型的第四层,所以也叫做四层负载均衡,也叫做 IP 层负载均衡。

请求达到负载均衡服务器后,由负载均衡服务器在操作系统内核进程获取网络数据包,根据负载均衡算法得到一台真实 web 服务器的地址,然后修改请求的目的地址到这台真实的web服务器地址,等到 web 服务器处理完成后,响应数据包回到负载均衡服务器,再将数据包源地址修改为自身的 IP(负载均衡服务器的 IP)地址发送给用户浏览器。

这里关键在于真实 web 服务器响应数据包如何返回给负载均衡服务器。一种是源地址转换(SNAT),第二种是负载均衡服务器作为网关服务器。

网络层的负载均衡在内核进程完成数据转发,有更好的性能。但是由于响应请求的流量要经过负载均衡服务器,容易成为瓶颈。

数据链路层负载均衡

数据链路层主要处理 mac 地址,所以使用修改 mac 地址进行转发请求。

负载均衡数据分发过程中不修改 IP 地址,只修改 mac 地址,通过配置真实物理服务器集群所有机器虚拟IP和负载均衡服务器IP地址一致,从而达到不修改数据包的源地址和目的地址就可以进行数据分发的目的。

由于 web 服务器的服务器地址 IP 和数据请求目的 IP 地址一致,不需要通过负载均衡服务器进行地址转换,可将相应数据包直接返回用户。

如果有足够的公有 IP,其实 web 服务器也可以直接使用自己的IP响应请求,不过这样 web 服务器必须绑定负载均衡的虚拟 IP 地址(VIP),才能保证 web 服务器收到来自负载均衡发送的数据包。

这种方式称作三角传输模式,单臂模式,也叫做直接路由方式(DR)。使用 DR 方式的链路层负载均衡是目前大型网站使用最广的一种负载均衡手段。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

负载均衡的目的就是让请求到达不同的服务器上,这句话描述有点模糊。

负载均衡其实是说的两件事情,负载是手段,均衡是目的。

就好比现在八台机器一瞬间来了8千多次请求,每台机器分配一千的请求就是合理的负载,每台机器的压力也均衡。

(想起了几年前的安卓手机,一核有难,八核围观就是不合理的负载。)

我自己知道的就dns和反向代理两种,使用过的也就反向代理而已。没想到有这么多种,长见识了。

5年前 评论
allencao (楼主) 5年前
L学习不停 (作者) 5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!