当前位置: 首页 > 科技观察

系统设计基础负载均衡

时间:2023-03-17 21:27:00 科技观察

1.什么是负载均衡?负载均衡是一种保证服务器不会过载的技术。通过适当的负载平衡措施,工作负载和流量请求在服务器资源之间分配,以提供更高的弹性和可用性。在Internet的早期,单个服务器上的单个应用程序无法处理高流量。无论底层基础设施多么强大,来自大量流量的并发服务器请求都可能使单个服务器不堪重负。没有负载平衡的应用程序可用性的单个实例是单点故障。这对系统的可靠性构成了巨大的威胁。负载均衡的主要目的是将应用程序的工作负载分布到多台计算机上,使应用程序可以处理更高的工作负载。负载平衡是扩展应用程序的一种方式。负载平衡的第二个目的通常是在您的应用程序中提供冗余。也就是说,如果服务器集群中的一台服务器出现故障,负载均衡器可以暂时将该服务器从集群中移除,并将负载分配给健康的服务器。多台服务器以这种方式相互帮助通常被称为“冗余”。当发生错误并且任务从发生故障的服务器转移到正常运行的服务器时,通常称为“故障转移”。协作运行同一应用程序的一组服务器通常称为服务器“集群”。集群的目的通常是上述两个目标:在不同的服务器之间分配负载并为彼此提供冗余/故障转移。负载均衡或功能流量分配负载均衡可以分配多台主机的流量,提高用户系统的业务处理能力,提高服务可用性。到同一个后端服务器。健康检查支持自定义健康检查方式和频率,可以定时检查后端主机的运行状态,提供故障转移,实现高可用;负载均衡解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);Scalability通过增加或减少服务器的数量来提供网站的可扩展性(scalability);完善security安全防护,对负载均衡器做一些过滤,黑白名单,防盗链等;负载平衡如何工作?典型的负载均衡顺序如下:流量来到你的网站。您网站的访问者通过互联网向您的服务器发送大量并发请求。流量分布在服务器资源之间。负载平衡硬件或软件拦截每个请求并将其定向到适当的服务器节点。每个服务器运行合理数量的工作。节点接收请求并能够接受请求并响应平衡器,因为它没有因太多请求而过载。服务器返回请求。该过程以相反的顺序完成,以将服务器的响应返回给用户。值得注意的是,以上步骤只有在已经建立了多个资源(服务器、网络或虚拟资源)的情况下才能进行。否则,如果只有一台服务器或计算实例,所有工作负载都分布到同一位置,不再需要负载平衡。2.负载均衡的分类为了充分利用负载均衡的可扩展性和冗余性,我们可以尝试在系统的每一层增加一个负载均衡器。我们可以在三个地方添加LB:用户和web服务器之间web服务器和内部平台层之间,比如应用服务器或者缓存服务器内部平台层和数据库之间。负载均衡器主要处理四种类型的流量,包括:HTTPS-负载均衡器通过设置X-Forwarded-For、X-Forwarded-Proto和X-Forwarded-Port标头来处理HTTPS流量,以向后端提供有关原始请求。HTTP-类似于HTTPS。UDP-一些负载均衡器支持使用UDP对DNS和syslogd等协议进行均衡。TCP-TCP流量也可以分布在负载均衡器之间。到数据库集群的流量就是一个很好的例子。按照常规的开发角度,可以分为中间件负载均衡和客户端负载均衡。中间件负载均衡采用独立的负载均衡器,对客户端和服务端开发不敏感,如:硬件F5,软件Nginx。客户端负载平衡将负载平衡逻辑集成到客户端组件中。客户端从注册中心或静态配置中获取可用的服务,然后从服务地址中选择合适的服务器发起请求(Ribbon),然后根据实现类别进行分类,常见的负载均衡类型包括:软件负载均衡、硬件负载均衡和DNS负载均衡。软件负载均衡软件负载均衡是通过负载均衡软件实现负载均衡功能。常见的负载均衡软件有LVS、Nginx。其中,LVS是Linux内核的四层负载均衡。四层和七层的区别在于它们的协议和灵活性不同。四层负载均衡器作用于网络层和传输层协议(IP、TCP、FTP、UDP)的数据。第7层负载均衡器分发对应用层协议(例如HTTP)中的数据的请求。可以根据特定于应用程序的数据(例如HTTP标头、cookie或应用程序消息本身中的数据,例如特定参数的值)进一步分派请求。【划重点】LVS是四层负载均衡,Nginx、HAProxy既可以是四层负载均衡,也可以是七层负载均衡。Nginx是万级的,一般只用于七层负载,LVS用于四层负载。LVS在10万级别。硬件负载平衡硬件负载平衡是一种通过单独的设备实现负载平衡的功能。这类设备有点类似于路由器交换机,或者可以理解为负载均衡的基础网络设备。目前业界有两种硬件负载均衡:F5和A10。这类设备性能好,功能强大,但价格可以用昂贵来形容。一般只有银行、国有企业等大而富有的企业才会考虑使用这类设备开会。软件负载均衡和硬件负载均衡与硬件负载均衡器进行比较。软件负载均衡服务器价格比较贵,一般15w以上一般免费,功能比较齐全。全面支持各级负载均衡,支持多种负载均衡算法,支持相对较少的全局负载均衡,性能非常高。可以支持100W+以上并发和低并发。Nginx是W级,LVS是10W级。灵活性是不太灵活和更灵活。可根据业务选择七、四层负载均衡,也可根据业务方便扩展。例如,由于业务的特殊性,需要进行一些定制。功能。安全性高低,无防火墙或抗DDos攻击等安全功能让人们更方便的上网。人们通过浏览器访问网站时,只需要记住网站的域名,而不需要记住那些不太好理解的IP地址。在DNS系统中,有一种比较重要的资源类型,叫做hostrecord,也叫Arecord。记录是名称解析的重要记录,它将特定的主机名映射到对应主机的IP地址。如果你有自己的域名,如果想让别人访问你的网站,需要在特定的DNS解析服务商的服务器上填写A记录。一段时间后,其他人将可以通过您的域名访问您的网站。网站上。DNS除了解析域名,还有负载均衡的功能。下面是利用DNS工作原理来处理负载均衡的工作原理图:从上图可以看出,DNS服务器中要配置多条A记录,如:www.apusapp.comINA114.100.20.201;www.apusapp.comINA114.100.20.202;www.apusapp.comINA114.100.20.203;因此,每个域名解析请求都会根据相应的负载均衡算法计算出一个不同的IP地址并返回,这样A记录中配置的多台服务器就可以形成一个集群,实现负载均衡。上图中,用户请求www.apusapp.com,DNS根据A记录和负载均衡算法计算出一个IP地址114.100.20.203,返回给浏览器,浏览器访问真实的物理服务器114.100.20.203基于IP地址。所有这些操作对用户来说都是透明的,用户可能只知道域名www.apusapp.com。优点:负载均衡的工作交给了DNS,省去了网站管理和维护负载均衡服务器的麻烦。该技术实现更加灵活方便,简单易行,成本低廉,被大多数TCP/IP应用所采用。对于部署在服务器上的应用,无需修改任何代码,即可实现不同机器上的应用访问。服务器可以位于Internet上的任何位置。同时,很多DNS还支持基于地理位置的域名解析,即将域名解析为离用户地理位置最近的服务器地址,可以加快用户访问速度,提高性能。DNS可能会缓存A记录。当服务器下线时,即使修改了A记录,也需要很长时间才能生效。在此期间,DNS仍会将域名解析到离线服务器,最终导致用户访问失败。无法根据服务器的处理能力来分配负载。DNS负载均衡采用简单的轮询算法,无法区分服务器之间的差异,无法反映服务器当前的运行状态,因此其负载均衡效果不是很好。可能会导致其他网络问题。为了使本DNS服务器能及时与其他DNS服务器进行交互,保证DNS数据及时更新,并且能够随机分配地址,一般需要将DNS刷新时间设置为一个较小的值,但如果太小,会大大增加DNS流量,造成额外的网络流量。问题。事实上,大型网站总是部分使用DNS域名解析,将域名解析作为一级负载均衡方式,即域名解析得到的服务器组并不是真正提供服务的物理服务器,而是也提供负载平衡服务器的内部服务器。服务器,这组内部的负载均衡服务器会再次进行负载均衡,请把请求发给真正的服务器,最后完成请求。三、负载均衡算法1、健康检查(healthchecks)我们有一个前提,流量只会分发给健康的服务器,那么负载均衡器现在是如何判断服务器是否健康的呢?为了监控健康的服务器,health检查一般会尝试通过配置的协议和端口连接到服务器,以确保服务器处于监听状态。如果一个服务器的健康检查失败,即服务器不能正常响应请求,它会被自动从池中移除,直到它通过健康检查,流量才会被分配到坏掉的服务器上。2、负载均衡如何处理状态我们都知道基于会话的用户认证会在服务器上存储一些会话信息,但是当系统引入负载均衡时,这会带来一些问题。举一个电子商务网站的例子,当用户U发送的登录请求被分发到服务器S1,服务器中记录了session信息,当用户想提交购物请求时,请求被分发到服务器S2,但是服务器S2没有保存用户U的会话信息。为了解决这个问题,可以使用IP哈希算法。该算法根据IP分配流量对应的服务器,可以保证同一用户的流量访问同一台服务器。还有一种应用层的方法就是stickysession,中文应该叫stickysession。负载均衡器会设置一个cookie,带有这个cookie的会话会被分配到同一台服务器。3、负载均衡器如何选择后端服务器?负载均衡器在将请求转发到后端服务器之前会考虑两个因素。他们将首先确保他们选择的服务器确实适当地响应了请求,然后使用预先配置的算法从健康的服务器中选择一个。常见的算法如下:通过系统的随机算法,根据后端服务器的listsize值,随机选择其中一台服务器进行访问。由概率统计理论可知,随着客户端调用服务端的次数增加,其实际效果越来越接近后端各服务端的调用平均分布,这就是结果投票。轮询将请求按顺序依次分发到后端服务器,它平衡地对待后端中的每个服务器,而不管服务器上的实际连接数和当前系统负载。有一个慢provider积累请求的问题,比如:第二台机器很慢,但是没有挂掉,当请求转到第二台机器的时候卡在那里。久而久之,所有的请求都卡在了第二台机器上。WeightedRoundRobinWeightedRoundRobin调度旨在更好地处理具有不同处理能力的服务器。每个服务器都分配有一个权重(一个表示处理能力的整数值)。与权重较低的服务器相比,权重较高的服务器与集群中的服务器建立更多连接。这意味着您可以指定服务器相对于其他服务器应接收的任务的权重(比率)。如果集群中的服务器并非都具有相同的容量,这将很有用。例如,如果三台服务器中的一台只有另外两台的2/3容量,则可以使用权重3、3、2。这意味着对于每接收到8个任务,第一台服务器应接收3个任务,第二台服务器应接收3个任务服务器应该接收3个任务,最后一个服务器应该只接收2个任务。这样,与集群中的其他服务器相比,具有2/3容量的服务器仅接收2/3的任务。IPhash获取客户端的IP地址,通过hash函数计算出一个值,用这个值对服务器列表的大小进行取模运算,得到的结果就是客服查到的服务器序号终端要访问。源地址散列法用于负载均衡。对于IP地址相同的客户端,在后端服务器列表不变的情况下,每次都会映射到同一台后端服务器进行访问。最小连接数最小连接数算法更加灵活和智能。由于后端服务器的配置不同,请求的处理可能快也可能慢。它根据后端服务器当前的连接状态动态选择当前积压的连接数。使用最少的一台服务器处理当前请求,尽可能提高后端服务的使用效率,负责合理拆分到每台服务器。具有相同参数的一致哈希请求总是发送给相同的提供者。当某个provider宕机时,原本发送给该provider的请求会基于虚拟节点扩散到其他provider,不会引起剧烈变化。算法参见:http://en.wikipedia.org/wiki/Consistent_hashing4.其他基于队列方案的负载均衡方案所有任务都存储在任务队列中。服务器集群中的服务器连接到这个队列并接受尽可能多的任务。在这种情况下,没有真正的负载均衡器,只有任务队列和服务器。每个服务器都尽可能多地承担负载。如果一个服务器掉出集群,它的任务将在任务队列中保持未处理状态,稍后由其他服务器处理。因此,每个服务器都可以独立于其他服务器和任务队列运行。负载平衡器不需要知道哪些服务器是集群的一部分等。任务队列不需要知道服务器。每个服务器只需要知道任务队列。队列负载平衡还隐含地考虑了每个服务器的工作负载和容量。服务器只有在能够处理任务之前才会从队列中获取任务。5、自身的高可用性——负载均衡双机热备负载均衡器本身就是一个单点故障的隐患。解决方案之一是双机热备份(提高可用性的基本方法是冗余)。为了解决负载均衡器的单点故障问题,双机热备方案引入了第二个负载均衡器,当主节点挂掉时切换到备节点。这里的双机热备和故障切换一般都是使用KeepAlive来实现的。参考:https://www.jianshu.com/p/253790f4aa20https://www.cnblogs.com/bonelee/p/8890920.htmlhttps://www.educative.io