HA-1 - 负载均衡实现方式及算法

一、负载均衡的概念

负载均衡,英文 名称为LoadBalance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡能够平均分配客户请求到服务器阵列,借此提供快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能。(来源:网络定义)

用糙话说就是:当服务组成由一台服务器处理的时候期初能够承担所有的网络请求和业务处理,但是随着后期业务量的上升,在不考虑集群和业务拆分的场景下单服务器的处理能力有限,往往会导致服务能力下降甚至宕机,反过来如果需要多服务器协调处理就会出现同样提供服务能力的情况下,应该选择那一台服务器去处理,而这个确定如何分配请求资源的服务在整个集群环境下起着举足轻重的作用,实现的最终目标就是提高并发,达到有限资源使用的合理性,这也就是负载均衡的重要意义。


二、负载均衡分类

根据负载均衡的实施方式总体可分为两种:软件和硬件

1、软件负载均衡

  • 是指基于服务器操作系统安装必要的软件,从而达到负载均衡的效果,最常见的例如:LVS、Nginx、HAproxy,其优点是安装简单,配置方便,可以满足大部分的负载均衡的场景,还有最大的一个优点就是:成本低。

2、硬件负载均衡

  • 直接在服务器和外部网络间安装负载均衡硬件设备,这种设备我们通常称之为负载均衡器。由专门的设备完成,独立于操作系统,整体性能得到大量提高,加上更多的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。 一般来说,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵,很常见的有 F5负载均衡器,有钱任性我们就不多阐述了,毕竟我们不是思聪。

三、负载均衡的实现方式

1、HTTP重定向

当一个请求通过浏览器直达后端时,首先会被集群调度者(上文说的那个关键角色)拦截下来,根据设定好的负载均衡算法及相关的分配策略,选择一台服务器,并将此服务器的IP地址写入到该HTTP的header的Location字段中,同时将响应的消息码设为302,返回给浏览器。浏览器收到此消息后会重读消息码,解析Location字段,并向该URL发起请求,此时请求的才是真正意义上的服务器,服务器会将结果返回给浏览器。

在整个HTTP重定向实现服务器集群负载均衡过程中,存在三个角色:客户端(浏览器),重定向调度者,请求处理服务器,而对于浏览器其实进行了两次http请求。这也就是为什么叫http重定向

2、DNS

一般我们对外客户端的服务都会提供域名来访问,域名只是用于对外映射服务IP地址,便于记忆的一种方式,当然涉及其他的意义如品牌效应等不在本文谈论的范畴,当用户通过浏览器输入域名请求后,此域名地址并不是直接到达所要处理的服务器,而是指向域名服务商的服务器,域名解析服务器将域名解析成提供此服务的真实IP地址并返回给我们。浏览器收到IP之后才会向该IP发起请求,并得到相应的响应结果,而这个过程中,针对域名后端IP的映射层面具有天然的负载均衡能力,可基于这个映射能力来完成一定策略下IP的指定。

这也就说明一旦通用域名解析服务异常会导致多个不同网站的用户无法访问致,也说明我什么会出现DNS劫持的风险

3、反向代理

反向代理服务器是一个位于真实服务器之前的服务器,通常我们也曾了解过通过反向代理服务的方式请求,客户端是无法得知真实服务器IP地址的,所有向我们网站发来的请求都首先要经过反向代理服务器,而代理服务器将请求交给后端服务器处理后再返回给客户端。那通过这一层面我们也都看出请求首先经过反向代理服务器。也就是说其充当了服务器集群的调度者角色,它可以根据当前后端服务器的负载情况,将请求转发给一台合适的服务器,并将处理结果返回给用户。

4、负载均衡中间件

这样称呼可能似乎不准,因为不外乎针对软件负载均衡层面有较多的处理方式,但常用有针对性的在整个集群环境下我个人认为也可以理解。
例如:Nginx,lvs,apache,zookeeper等,甚至我们在开发过程中的Dubbo自身的注册中心也具有此角色能力。


四、负载均衡算法

1、轮询法

“风水轮流转 今年到我家”,将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

这样看似我们解决了资源调配的问题,但是资源真正合理利用了吗,愿望很美丽现实却很骨感,实际应用中同一个服务会部署到不同的硬件环境,性能各不相同。若直接使用简单轮询调度算法,给每个服务实例相同的负载,那么,必然会出现有的资源紧张有的浪费的情况。因此为了避免这种情况发生,业界就提出了加权轮询算法的解决方案。

2、加权轮询法

“能力越大,责任越大”,不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端

3、随机法

“点兵点将,大兵大将,小兵小将…”,通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。看似随机,其实当请求数增大到一定程度的时候,随机优势不再明显,而最终的分配效果可能更加贴近于轮询方式。

4、加权随机法

与加权轮询法一样,加权随机法也根据后端机器的性能配置,给系统的负载分配不同的权重值,调度者会依据权重值进行随机抽取相应的服务并进行请求,而不是同普通随机法是按照点兵点将的方式盲目提供。

5、哈希值寻址法

源地址哈希是利用客户端的IP,通过哈希函数计算得出一个hash数,用该数值对服务器个数进行取模,取模后的余数即为访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问,这个算法也适用于一些特殊场景业务的需要例如session的存取等。

6、最小连接数法

“谁有空谁来”,最小连接数算法想对来说已经从死板的轮询和加权中脱离出来,它具有一定的智能性,还是源于我们的后端服务器的配置各不相同,对于请求的处理有快有慢,对于请求的堆积情况有多有少,调度服务需要获取众多服务器当前的实际链接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器

总结:方法千千万,而原则是恒定不变的,负载均衡的最终目的就是在有限的资源配置下如何将资源利用最大化,且保障服务的可用性,才是我们要考虑的方向。

我的公众号欢迎订阅

HA-1 - 负载均衡实现方式及算法