那些NB哄哄的负载均衡算法究竟是什么样子的?

在软件系统的架构设计中,对集群的负载均衡设计是做为高性能系统优化环节中必不可少的方案。负载均衡本质上是用于将用户流量进行均衡减压的,所以在互联网的大流量项目中,其重要性不言而喻。前端

1、什么是负载均衡?算法

早期的互联网应用,因为用户流量比较小,业务逻辑也比较简单,每每一个单服务器就能知足负载需求。随着如今互联网的流量愈来愈大,稍微好一点的系统,访问量就很是大了,而且系统功能也愈来愈复杂,那么单台服务器就算将性能优化得再好,也不能支撑这么大用户量的访问压力了,这个时候就须要使用多台机器,设计高性能的集群来应对。sql

那么,多台服务器是如何去均衡流量、如何组成高性能的集群的呢?后端

此时就须要请出 「负载均衡器」 入场了。缓存

负载均衡(Load Balancer)是指把用户访问的流量,经过「负载均衡器」,根据某种转发的策略,均匀的分发到后端多台服务器上,后端的服务器能够独立的响应和处理请求,从而实现分散负载的效果。负载均衡技术提升了系统的服务能力,加强了应用的可用性。安全

(能够按照图中去理解,图片来源网络)性能优化

2、负载均衡方案有几种?服务器

目前市面上最多见的负载均衡技术方案主要有三种:网络

基于DNS负载均衡架构

基于硬件负载均衡

基于软件负载均衡

三种方案各有优劣,DNS负载均衡能够实如今地域上的流量均衡,硬件负载均衡主要用于大型服务器集群中的负载需求,而软件负载均衡大可能是基于机器层面的流量均衡。在实际场景中,这三种是能够组合在一块儿使用。下面来详细讲讲:

基于DNS负载均衡

(网络图片)

基于DNS来作负载均衡实际上是一种最简单的实现方案,经过在DNS服务器上作一个简单配置便可。

其原理就是当用户访问域名的时候,会先向DNS服务器去解析域名对应的IP地址,这个时候咱们可让DNS服务器根据不一样地理位置的用户返回不一样的IP。好比南方的用户就返回咱们在广州业务服务器的IP,北方的用户来访问的话,我就返回北京业务服务器所在的IP。

在这个模式下,用户就至关于实现了按照「就近原则」将请求分流了,既减轻了单个集群的负载压力,也提高了用户的访问速度。

使用DNS作负载均衡的方案,自然的优点就是配置简单,实现成本很是低,无需额外的开发和维护工做。

可是也有一个明显的缺点是:当配置修改后,生效不及时。这个是因为DNS的特性致使的,DNS通常会有多级缓存,因此当咱们修改了DNS配置以后,因为缓存的缘由,会致使IP变动不及时,从而影响负载均衡的效果。

另外,使用DNS作负载均衡的话,大可能是基于地域或者干脆直接作IP轮询,没有更高级的路由策略,因此这也是DNS方案的局限所在。

基于硬件负载均衡

(网络图片)

硬件的负载均衡那就比较牛逼了,好比大名鼎鼎的 F5 Network Big-IP,也就是咱们常说的 F5,它是一个网络设备,你能够简单的理解成相似于网络交换机的东西,彻底经过硬件来抗压力,性能是很是的好,每秒能处理的请求数达到百万级,即 几百万/秒 的负载,固然价格也就很是很是贵了,十几万到上百万人民币都有。

由于这类设备通常用在大型互联网公司的流量入口最前端,以及政府、国企等不缺钱企业会去使用。通常的中小公司是不舍得用的。

采用 F5 这类硬件作负载均衡的话,主要就是省心省事,买一台就搞定,性能强大,通常的业务不在话下。并且在负载均衡的算法方面还支持不少灵活的策略,同时还具备一些防火墙等安全功能。可是缺点也很明显,一个字:贵。

基于软件负载均衡

(网络图片)

软件负载均衡是指使用软件的方式来分发和均衡流量。软件负载均衡,分为7层协议 和 4层协议。

网络协议有七层,基于第四层传输层来作流量分发的方案称为4层负载均衡,例如 LVS,而基于第七层应用层来作流量分发的称为7层负载均衡,例如 Nginx。这两种在性能和灵活性上是有些区别的。

基于4层的负载均衡性能要高一些,通常能达到 几十万/秒 的处理量,而基于7层的负载均衡处理量通常只在 几万/秒 。

基于软件的负载均衡的特色也很明显,便宜。在正常的服务器上部署便可,无需额外采购,就是投入一点技术去优化优化便可,所以这种方式是互联网公司中用得最多的一种方式。

3、经常使用的均衡算法有哪些?

上面讲完了常见的负载均衡技术方案,那么接下来我们看一下,在实际方案应用中,通常可使用哪些均衡算法?

轮询策略

负载度策略

响应策略

哈希策略

下面来分别介绍一下这几种均衡算法/策略的特色:

1.轮询策略

轮询策略其实很好理解,就是当用户请求来了以后,「负载均衡器」将请求轮流的转发到后端不一样的业务服务器上。这个策略在DNS方案中用的比较多,无需关注后端服务的状态,只要有请求,就日后端轮流转发,很是的简单、实用。

在实际应用中,轮询也会有多种方式,有按顺序轮询的、有随机轮询的、还有按照权重来轮询的。前两种比较好理解,第三种按照权重来轮询,是指给每台后端服务设定一个权重值,好比性能高的服务器权重高一些,性能低的服务器给的权重低一些,这样设置的话,分配流量的时候,给权重高的更多流量,能够充分的发挥出后端机器的性能。

2.负载度策略

负载度策略是指当「负载均衡器」日后端转发流量的时候,会先去评估后端每台服务器的负载压力状况,对于压力比较大的后端服务器转发的请求就少一些,对于压力比较小的后端服务器能够多转发一些请求给它。

这种方式就充分的结合了后端服务器的运行状态,来动态的分配流量了,比轮询的方式更为科学一些。

可是这种方式也带来了一些弊端,由于须要动态的评估后端服务器的负载压力,那这个「负载均衡器」除了转发请求之外,还要作不少额外的工做,好比采集 链接数、请求数、CPU负载指标、IO负载指标等等,经过对这些指标进行计算和对比,判断出哪一台后端服务器的负载压力较大。

所以这种方式带来了效果优点的同时,也增长了「负载均衡器」的实现难度和维护成本。

3.响应策略

响应策略是指,当用户请求过来的时候,「负载均衡器」会优先将请求转发给当前时刻响应最快的后端服务器。

也就是说,无论后端服务器负载高不高,也无论配置如何,只要以为这个服务器在当前时刻能最快的响应用户的请求,那么就优先把请求转发给它,这样的话,对于用户而言,体验也最好。

那「负载均衡器」是怎么知道哪一台后端服务在当前时刻响应能力最佳呢?

这就须要「负载均衡器」不停的去统计每一台后端服务器对请求的处理速度了,好比一分钟统计一次,生成一个后端服务器处理速度的排行榜。而后「负载均衡器」根据这个排行榜去转发服务。

那么这里的问题就是统计的成本了,不停的作这些统计运算自己也会消耗一些性能,同时也会增长「负载均衡器」的实现难度和维护成本。

4.哈希策略

Hash策略也比较好理解,就是将请求中的某个信息进行hash计算,而后根据后端服务器台数取模,获得一个值,算出相同值的请求就被转发到同一台后端服务器中。

常见的用法是对用户的IP或者ID进行这个策略,而后「负载均衡器」就能保证同一个IP来源或者同一个用户永远会被送到同一个后端服务器上了,通常用于处理缓存、会话等功能的时候特别好用。

以上,就是实现高性能负载均衡的常见技术方案和策略了.

为何某些人会一直比你优秀,是由于他自己就很优秀还一直在持续努力变得更优秀,而你是否是还在知足于现状心里在窃喜! 

欢迎工做一到五年的Java工程师朋友们加入Java架构开发:744677563

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代!

相关文章
相关标签/搜索