架构学习系列:高性能负载均衡
单服务器无论如何优化,硬件配置有多高,瓶颈总会被触摸到,当单服务器无性能法满足业务需要时,就需要设计高性能集群来提升处理性能,这也就用到了负载均衡,负载均衡也是我们耳熟能详的标志性方案了。
先看下负载均衡的百科解释:负载均衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。其主要作用是将大量作业合理地分摊到多个操作单元上进行执行,用于解决互联网架构中的高并发和高可用的问题。
负载均衡最重要的一个应用是利用多台服务器提供单一服务。
在此,我们先看下负载均衡的分类有哪些?常见的负载均衡系统有三种: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等。
声明:本系列学习内容来自于《从零开始学架构》。另,图片源于网络,若有侵权,请及时联系删除。