分布式架构下的负载均衡

231 阅读4分钟

这是我参与8月更文挑战的第19天,活动详情查看: 8月更文挑战

现在我们上线一个项目,基本上都不是只部署一个节点,最少都会部署两个节点,考虑高可用异地容灾等有些项目节点非常的多,让多个节点协同为客户提供高可用,负载均衡就起到很关键的作用,基本原理就是现实一对多的映射机制,下面引入百度百科的图片来一看就清楚负载均衡的用途。 8718367adab44aedf8cca07ebd1c8701a08bfbae.webp 实现负载均衡技术比较场景的是:

  1. DNS轮询
  2. CDN
  3. IP负载均衡

负载均衡实现方式

DNS轮询

DNS轮询是比较简单的方式,以域名作为访问入口,在配置DNS解析的时候配置多条DNS A记录,客户端在解析DNS的IP的时候就将不同的IP给不同的客户端,这套针对同一个域名,不用的客户端访问到了不同的IP,就将流量分散到了不同的IP地址。

CDN

CDN(Content Delivery Network,内容分发网络)。通过发布机制将内容同步到大量的缓存节点,并在DNS服务器上进行扩展,找到里用户最近的缓存节点作为服务提供节点。

IP负载均衡

IP负载均衡是基于特定的TCP/IP技术实现的负载均衡,通俗的说法就是针对一个IP访问,通过软件或者硬件技术,将不同的请求分发到后面不同的内网服务器上面,这个用的比较多。硬件方式实现主要产品:F5-BIG-IP-GTM(简称F5),软件实现方式:**LVS、HAProxy、NginX,**Nainx用的比较多,它的负载工作在第7层,使用起来也比较方便;LVS、HAProxy可以工作在4-7层。

负载均衡算法

针对不同的方式实现负载均衡,基本实现目的就是将请求通过一定的算法将请求不要打到一个节点,实现分布到不同的节点,这个时候算法就比较重要,肯定那里面的算法并不需要我们自己去实现,软件提供者都帮我们写好了,我们只需要参数配置就可以了,了解每一种算法可以让我们更好的去使用它。

轮询法

看字面意思就是:轮着来,将请求按请求的先后顺序轮流的分配到不同的服务器上,对每台服务器都是公平的,反正都是轮着来接收请求的,这种方式不会管当前服务器实际的连接数和当前的负载,毕竟有些请求处理比较慢,万一运气不好全部都收到请求处理比较慢的话,那样就会挤压很多在那台服务器上,还有可能是服务器的配置不一样,这台配置低点,但是也要处理同样多的请求,就比较出力,正是上面那样问题,就导致了这种算法的缺点。

随机法

通过系统随机函数,随机将客户端的请求分配给一台后端服务器。随着访问量不同的增大,可能实际出来的效果就和轮询法的效果差不多。这种方式比较简单,只需要一个随机函数就行,随机数可能导致分布不均,达不到负载均衡的要求。

源地址哈希法

根据客户端请求的IP地址,采用哈希函数计算得到一个哈希值,然后根据这个哈希值对当前所有服务器的个数进行取模运算,然后分配到具体那台服务器上,针对相同的IP地址会映射到同一个后台的服务器。

加权轮询法

这种算法是对轮询法的改进,不同的后台服务器可能配置不一样,有些配置高些,有些配置低些,肯定是希望配置高的处理更多的请求,配置低的就少处理一点请求,将配置高的服务器的权重设置的高点,配置低的服务器的权重设置的低些,在轮询的时候根据权重来分配不同的请求,这样的每台服务器都会接受到请求,权重高的接收到的请求多些,权重低的收到的请求低些。

最小连接数法

在分发请求的时候,自己内部维护一张表,当前后端服务器的连接情况,当新的请求进来时,动态的找到当前连接数最少的服务器,然后将请求分配给那台服务器,尽可能的提高后台服务器利用率。