多种负载均衡策略【长篇干货】
01
什么是负载均衡
在我们讲engines的负载均衡之前,我们需要理解一下负载均衡这个概念,它的英文名称是load balance。
这一个概念在单机应用是不存在的,只有在分布式系统或者集群当中才存在,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡,原理是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,从而提高了数据的吞吐量。
举一个生活中很常见的例子:我们去银行取钱,银行只有一个人工服务窗口,几百个人在那边排队取钱。正常情况一个窗口需要12小时才可以把这个每个人取钱需求进行完成。
那如果银行开多一个窗口,那就可以用六个小时就可以完成全部的任务,那再开多一个窗口,那就可以四个小时就可以把全部人的取钱需求进行完成,也可以避免一位某一个银行的服务人员临时有事,导致我们整个银行的取钱不能用。
02
常见的负载均衡解决方案
我们知道了什么是负载均衡,我们需要想一下市场上面有哪些负载均衡的解决方案,然后我们应该怎么选择?
像一般的国企或者运营商,他们那边的话基本都会购买对应的硬件来解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,这一些负载均衡器价格比较昂贵,动不动弄就几百万上千万,而且他们的数量还需要很多台。
像这些硬件的负载均衡的话,对于很多的创业公司或者互联网公司可能不太适用,毕竟价格太昂贵。那就通过软件来进行解决,常见的有LVS、Nginx等,它们是基于Linux系统并且开源的负载均衡解决方案。
根据对应的性能还有成本来看Nginx的话,这多数公司的选择。或者使用硬件跟软件互相结合,比如前面流量入口使用F5服务器,后面的话使用我们的Nginx再做一个负载分发。
03
Nginx的负载均衡举例
前面说了一个银行取钱的例子,转换到我们后端的请求来看,假如我们的一个服务器的某个接口支持5000的并发,处理耗时可以维持在500毫秒以内。
那如果来了个1万的并发,那我们这个处理耗时就要变成一秒了,随着并发量的增多,我们解决了耗时也会变长;那我们就可以启用多几个服务器,对外提供同样的功能,这样就可以减轻每个服务器的压力,提高接口响应速度和并发。
下面这个图就是Nginx最常用的负载均衡,第一个用户二当家小D请求到Nginx那边,然后Nginx把他分配到ip1那个节点。老王又请求了Nginx,Nginx会根据负载均衡策略把它分发到ip2的那个节点, 以此类推。
这样的话每个后端节点都可以分发到别人的请求,然后也不会造成请求积压,或者单点故障。
Nginx配置负载均衡很简单,下面这一个就是我们的一个例子
upstream lbs { server 192.168.0.106:8080; #节点一 server 192.168.0.106:8081; #节点二}
location /api/ { proxy_pass http://lbs; proxy_redirect default;}
upstream 后面的 lbs 是这个集群的名称,里面可以写很多的应用服务器的ip和跟端口,每个server可以认为是我们后端的一个服务。
底部使用proxy_pass 加 http://lbs 进行转发到对应的集群,用户访问 域名/api/xxx 的时候,会命中Location规则,从而进入对应的集群,按照上面的配置保存好,然后重启我们的Nginx应用即可。
给一个建议方便大家进行一个测试:
可以用spring boot或者node开发一个应用,对外提供一个接口。这个接口的主要功能就是用户访问之后 返回当前这个机器的ip跟端口,这样我们或许做负载均衡测试的时候,就可以知道我们当前访问的是哪个机器。
04
Nginx常见的负载均衡策略解析
上面我们讲解了Nginx的负载均衡配置,其实负载均衡的策略有很多种,Nginx本身就自带很多种,我们分别来解释一下每一个负载均衡策略的一个作用,还有使用场景。
1、负载均衡策略之节点轮询(默认)
节点轮询这个负载均衡策略是Nginx默认的,它表示每个请求按顺序分配到不同的后端服务器, 比如我们配置了十个服务器。那用户发起10次请求的时候,每个服务器都会收到一次这样的一个请求。
这一种的话会有个缺点 可能造成性能和负载分配不均。像我们后端使用的服务器,有些服务器配置高,有些服务器配置低,配置高的处理请求更快,配置低点处理请求更慢一点,那如果请求量到达上百万上千万的时候,这个差距就慢慢的被拉开。
那这一种策略就比较适合做文件服务器或者你们机器的配置和压力比较均匀的时候。
//案例upstream lbs { server 192.168.159.133:8080 weight=5; server 192.168.159.133:8081 weight=10; }
2、负载均衡策略之weight 权重配置
权重配置负载均衡策略,这个意思就是我们可以使用weight这一个给服务器配置对应的占比。这一个数字越大,分配的流量就越高。
好比我们有些服务器配置比较低,有些服务器配置比较高,那我们就可以给配置高的服务器给他的权重配置高一点,那这样的话他分配的流量就更高,能者多劳嘛!
所以这个负载均衡策略他适合的场景就是服务器性能差异大的情况下进行使用。
//案例upstream lbs { server 192.168.159.133:8080 weight=5; server 192.168.159.133:8081 weight=10; }
3、负载均衡策略之ip_hash(固定分发)
ip_hash, 这一个的意思就是会根据用户的来源的ip进行哈希,然后根据结果再进行分配到对应的服务器上面去, 这样的话每个用户就可以固定的访问到后端的某一个服务器。
那这一种策略的话适合哪一些场景呢?比如我们有些服务器需要做业务分区,或者我们每一个服务器上面的想做本地的缓存,再或者我们的session有单点的情况下就可以使用这一种策略,它的核心就是用户会固定到访问到我们这一个节点,而不会分发到其他的节点。
upstream lbs { ip_hash; server 192.168.159.133:8080; server 192.168.159.133:8081;}
除了上面我们说的三种负载均衡策略之外其实社区里面还有很多种,比如可以根据响应的最短时间进行分发,大家如果对这些感兴趣的话,可以搜索一下Nginx社区里面的负载均衡策略。
额外补充一些知识点,upstream还可以为每个节点设置对应的状态值
-
比如down 表示当前的server暂时不参与负载
upstream lbs { ip_hash; server 192.168.159.133:8080 down; server 192.168.159.133:8081;}
-
比如backup ,其它所有的非backup机器down的时候,会请求backup机器,这台机器压力会最轻,配置也会相对低
upstream lbs { ip_hash; server 192.168.159.133:8080 backup; server 192.168.159.133:8081;}
本章小结
-
掌握什么是负载均衡。
-
知道Nginx怎么去配置负载均衡。
-
掌握Nginx的三种常见的负载均衡策略,还有它的使用场景。
- 点赞
- 收藏
- 关注作者
评论(0)