vlambda博客
学习文章列表

架构学习系列:高性能负载均衡


单服务器无论如何优化,硬件配置有多高,瓶颈总会被触摸到,当单服务器无性能法满足业务需要时,就需要设计高性能集群来提升处理性能,这也就用到了负载均衡,负载均衡也是我们耳熟能详的标志性方案了。


先看下负载均衡的百科解释:负载均衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。其主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题。


负载均衡最重要的一个应用是利用多台服务器提供单一服务。

在此,我们先看下负载均衡的分类有哪些?常见的负载均衡系统有三种:DNS负载均衡硬件负载均衡软件负载均衡



DNS负载均衡



其他优点与缺点也是比较鲜明。

优点:

  • 简单、成本低:负载均衡工作交给DNS服务器处理,无须自己开发或维护负载均衡设备。

缺点:

  • 更新不及时:DNS缓存时间比较长,修改DNS配置后,由于缓存的原因,还会有很多用户继续访问以前的IP,这样就会导致访问失败,达不到负载均衡的目的,并且也影响用户正常使用业务。我们经常在第三方DNS服务商改完域名解析后,一般会有24小时以内生效的提示。

  • 扩展性差:DNS负载均衡的控制权在域名商那里,无法根据业务特点对其做更多的定制化功能和扩展特性

  • 分配策略比较简单:DNS负载均衡支持的算法比较少;不能区分服务器的差异;也无法感知后端服务器的状态。



硬件负载均衡



硬件负载均衡是通过单独的硬件设备来实现负载均衡功能。目前业界比较典型的硬件设备有两种;F5和A10。这类设备性能强劲,功能强大,但价格不菲。另一方面,普通业务量用“土豪”设备,一是负担过重,一是业务量不大,太浪费资源。

其优点与缺点也是向价格看齐:

优点:

  • 功能强大:全面支持各层级的负载均衡,支持全面的负载均衡算法,支持全局负载均衡。

  • 性能强大:对比一下,软件负载均衡支持到10万并发就很厉害了,而硬件负载均衡可以支持百万以上的并发,所以为什么贵?

  • 稳定性高:不用多说,商用硬件负载均衡,肯定经过良好的严格测试,经过大规模的使用验证的。要不然,钱就白花了。

  • 支持安全防护:这家伙虽然贵,但是不仅仅体现在负载均衡上,还具备防火墙、防DDos攻击等安全功能。

缺点:

  • 价格昂贵:普通一点儿的也得十几万,好点儿的,快赶上一线城市的“首付”了。

  • 扩展能力差:硬件设备,可以根据业务进行配置,但是无法在硬件方面进行扩展与定制了。



软件负载均衡



软件负载均衡通过负载均衡软件来实现负载均衡功能,最常见的有Nginx和LVS。其中Nginx是软件的七层负载均衡,LVS是Linux内核的四层负载均衡。四层与七层的区别在于协议与灵活性。Nginx支持HTTP、邮件服务;而LVS的四层负载均衡,与协议无关,约束性更小,几乎可以做所有的应用,例如IM,数据库等。

软件与硬件的主要区别主要体现在性能方面。上面也说过了, 软件性能可支持到10万并发,而硬件最少可达到百万级别并发。

其优点与缺点:

优点:

  • 简单:无论部署还是维护都比较简单,想想部署一台Nginx服务器多简单就知道了

  • 便宜:买台最便宜的服务器就能搭建使用。

  • 灵活:四层LVS与七层Nginx随你选。

缺点(相对于硬件来说):

  • 性能一般:一台Nginx大约能支撑5万并发。

  • 功能一般:与硬件比起来,只能甘拜下风,毕竟一辆自行车怎么与汽车比速度呢?

  • 安全性:一般不具备防火墙和DDos攻击等安全性能。


三种类别的负载均衡并非是互斥的,他们的特性决定了他们也可以进行组合使用:具体来说,DNS负载均衡用于实现地理级别的负载均衡;硬件负载均衡用于实现集群级别的负载均衡;软件负载均衡用于实现机器级别的负载均衡。

一般业务量,我们选择软件负载均衡即可,一般使用Nginx或者LVS。


负载均衡的算法数量较多,主要分为以下四类:

  • 任务平分类负载均衡系统将收到的请求“平均”分到后端服务器,当然平均可以是平分,也可以是根据权重进行平分。

  • 负载均衡类负载均衡系统根据后端的服务器的负载压力来进行分配。这里的负载压力可以使用CPU负载来衡量,也可以使用连接数、I/O使用率、网卡吞吐量来衡量。

  • 性能最优类负载均衡系统根据后端服务器的响应时间来进行任务分配 ,谁响应时间最短优化分配给谁。

  • Hash类负载均衡系统根据hash值来分配到不同的服务器。

接下来看下,具体的算法:


轮询

轮询是最简单的一个策略,负载均衡收到请求后,按照顺序轮流分配到后端服务器上。它并不会因为某个后端服务器负载高,或配置低而少分配请求。


加权轮询

负载均衡根据服务器权重进行请求分配,权重高的可以多分配一些请求,权重低则少分配一些请求。加权轮询是轮询的一种特殊方式,其主要目的是为了解决不同服务器处理能力有差异的问题。比如32核与16核服务器可以配置2:1的比例进行请求分配。

加权轮询可以根据服务器差异进行任务的分配 ,但是无法根据服务器当前状态进行任务分配。


负载最低优先

负载均衡将请求分配当前服务器负载最低的后端服务器。

负载可以根据不同的任务类型和业务场景使用不同的指标来衡量:

  • LVS 四层网络负载均衡可以以“连接数”来判断服务器的状态;

  • Nginx 七层网络负载均衡可以以“HTTP请求数”或者“响应时间”来判断服务器状态(Nginx内置的算法不支持,如fair)

负载最低优先解决了轮询算法中无法感知服务器状态的问题,但也大大提升了其实行方式的复杂度。因为他要求负载均衡系统每个后端服务器的负载压力,根据响应时间、连接数、http请求数等。


性能最优类

性能最优类算法是将请求分配给处理速度最快的后端服务器,以达到最快响应。这也是通过响应时间来判断的。


Hash类

负载均衡系统根据任务中某些关键信息进行Hash运算,将相同Hash值的请求分配到同一台服务器上,这种方式主要是为了满足特定业务需求。常用的有IP Hash,ID Hash等方式。


拿Nginx来说,它内置的负载均衡算法有轮询、加权轮询以及IP hash三种方式。而我们常用的一般是轮询和加权轮询,而其扩展方式可以实现fair和url hash方式。

负载均衡是我们在业务中最常用的来分散请求任务,缓解单服务器性能瓶颈的方法。云服务器中最常用的负载均衡服务阿里云的SLB,腾讯云的CLB,AWS 的ELB等。 


声明:本系列学习内容来自于《从零开始学架构》。另,图片源于网络,若有侵权,请及时联系删除。