负载均衡 Load Balance
说人话的通俗描述:
对比下面2张图,双轮胎的货车,每个位置都有备胎,一个爆胎后,另外一个轮胎还可以扛着跑到维修站。这双轮胎的架构就叫负载均衡。
哈哈,上面这个比喻形象,但不完全准确。请看下面的行话。
行业介绍:
负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】。常见互联网分布式架构,分为客户端层、反向代理nginx层、站点层、服务层、数据层。
产生背景:
1、解决大并发的业务性能和可靠性。
当用户在浏览器上输入一个网址按下回车键后,就会产生一个请求,在远方的服务器会处理这个请求,根据这个请求来生成用户想要的页面,然后将这个页面响应给浏览器,这样用户就能看到他想要看到的东西。我们知道,一台服务器处理数据(请求也是一种数据)的能力是有限的,当有大量的用户同时在浏览器上输入网址并按下回车键后,就会有大量的请求产生,远方的服务器就不得不处理这些请求,由于请求数量过多,服务器处理的效率就会变慢,响应时间就会变长,这样用户就不能在可以忍受的时间内看到自己想看到的东西,严重影响体验效果。更严重一点,如果请求数量超过了这台服务器所能处理的最大请求,服务器就会崩溃,直接导致网站瘫痪。那么,有什么方法能够解决这个问题呢?答案就是建立一个集群(就是一群服务器),通过集群的力量来提高服务端的数据处理能力,因为一台服务器的处理能力肯定比不上多台服务器的处理能力。
2、解决业务升级时,服务器重启导致业务中断的问题。
有一个已经发布的项目,要定期的实现更新,更新的时候我们需要停掉服务器,恰恰就在这个时候有用户还在访问你的网站,你突然给停了,用户会认为你的网站被攻击了,可能存在安全隐患,那么你的网站信任度就会降低,可能还会失去一些潜在的客户。因此升级第一台服务器升级的时候,集群中的其他服务器把原本属于这台服务器的任务接过来。等这台服务器升级成后,再轮换升级其他服务器。
负载均衡分类:
1、HTTP重定向实现负载均衡:集群调度器给http消息头location字段中返回302,浏览失败该状态码,选择调度器分配的主机进行访问。
2、DNS负载均衡:在域名解析的时候,由DNS服务器进行选择分发到哪些服务器上。
3、反向代理负载均衡:在负载均衡器内隐藏调度器,负载均衡器本身也是一个集群。各大公有云厂商使用了这个架构。
详细介绍:
1、HTTP重定向实现负载均衡
请求过程:
当用户向服务器发起请求时,请求首先被集群调度者(集群老大)截获;调度者根据某种分配策略,选择一台服务器(小弟),并将选中的服务器的IP地址封装在HTTP响应消息头部的Location字段中,并将响应消息的状态码设为302,最后将这个响应消息返回给浏览器。当浏览器收到响应消息后,解析Location字段,并向该URL发起请求,然后指定的服务器处理该用户的请求,最后将结果返回给用户。
在使用HTTP重定向来实现服务器集群负载均衡的过程中,需要一台服务器作为请求调度者。用户的一项操作需要发起两次HTTP请求,一次向调度服务器发送请求,获取后端服务器的IP,第二次向后端服务器发送请求,获取处理结果。
优点:采用HTTP重定向来实现服务器集群的负载均衡实现起来较为容易,逻辑比较简单。
缺点:在HTTP重定向方法中,为了保证访问性能,调度服务器只在客户端第一次向网站发起请求的时候起作用。当调度服务器向浏览器返回响应信息后,客户端此后的操作都基于新的URL进行的(也就是后端服务器),此后浏览器就不会与调度服务器产生关系,进而会产生如下几个问题:
<1> 由于不同用户的访问时间、访问页面深度有所不同,从而每个用户对各自的后端服务器所造成的压力也不同。而调度服务器在调度时,无法知道当前用户将会对服务器造成多大的压力,因此这种方式无法实现真正意义上的负载均衡,只不过是把请求次数平均分配给每台服务器罢了。
<2>若分配给该用户的后端服务器出现故障,并且如果页面被浏览器缓存,那么当用户再次访问网站时,请求都会发给出现故障的服务器,从而导致访问失败。
2、DNS实现负载均衡
DNS的全拼是Domain Name System,中文也叫做域名服务器,是负责将域名解析成IP地址的,例如将www.baidu.com这个域名解析成了115.239.211.112,我们访问www.baidu.com时其实访问的是115.239.211.112这台服务器。
请求过程:
当用户向我们的域名发起请求时,DNS服务器会自动地根据我们事先设定好的调度策略选一个合适的IP返回给用户,用户再向该IP发起请求。
优点:
<1> DNS负载均衡最大的优点就是配置简单。服务器集群的调度工作完全由DNS服务器承担,那么我们就可以把精力放在后端服务器上,保证他们的稳定性与吞吐量。而且完全不用担心DNS服务器的性能,即便是使用了轮询策略,它的吞吐率依然卓越。
<2> DNS负载均衡具有较强了扩展性,你完全可以为一个域名解析较多的IP,而且不用担心性能问题。
缺点:
<1> 由于把集群调度权交给了DNS服务器,从而我们没办法随心所欲地控制调度者,没办法定制调度策略。
<2> DNS服务器也没办法了解每台服务器的负载情况,因此没办法实现真正意义上的负载均衡。它和HTTP重定向一样,只不过把所有请求平均分配给后端服务器罢了。
<3> 当我们发现某一台后端服务器发生故障时,即使我们立即将该服务器从域名解析中去除,但由于DNS服务器会有缓存,该IP仍然会在DNS中保留一段时间,那么就会导致一部分用户无法正常访问网站(可以用动态 DNS来解决)。
3、反向代理实现负载均衡
请求过程:
用户发来的请求都首先要经过反向代理服务器,服务器根据用户的请求要么直接将结果返回给用户,要么将请求交给后端服务器处理,再返回给用户。
反向代理负载均衡
优点:
1、隐藏后端服务器。与HTTP重定向相比,反向代理能够隐藏后端服务器,所有浏览器都不会与后端服务器直接交互,从而能够确保调度者的控制权,提升集群的整体性能。
2、故障转移。与DNS负载均衡相比,反向代理能够更快速地移除故障结点。当监控程序发现某一后端服务器出现故障时,能够及时通知反向代理服务器,并立即将其删除。
3、合理分配任务 。HTTP重定向和DNS负载均衡都无法实现真正意义上的负载均衡,也就是调度服务器无法根据后端服务器的实际负载情况分配任务。但反向代理服务器支持手动设定每台后端服务器的权重。我们可以根据服务器的配置设置不同的权重,权重的不同会导致被调度者选中的概率的不同。
缺点:
调度者压力过大 。由于所有的请求都先由反向代理服务器处理,那么当请求量超过调度服务器的最大负载时,调度服务器的吞吐率降低会直接降低集群的整体性能。
制约扩展。当后端服务器也无法满足巨大的吞吐量时,就需要增加后端服务器的数量,可没办法无限量地增加,因为会受到调度服务器的最大吞吐量的制约。
本文引用了网友的智慧,十分感谢:
https://blog.csdn.net/yuanaili/article/details/81191408
https://blog.csdn.net/qq_34802511/article/details/81387587