咱们都知道,Nginx支持负载均衡,能够很方便的帮助咱们进行水平扩容,然而它到底是依据什么原则进行请求的分发,其中又有哪些负载均衡算法可供选择和配置,今天就让咱们好好来了解一下。 git
什么叫负载均衡,咱们能够参考一下图片中的这种状况:github
我所理解的负载均衡,就是:算法
可以将客户端的请求均匀地分发到后台各个应用服务器上,从而缓解服务器压力。后端
而且当服务器出现宕机或者扩容时,也能正常运行。服务器
上面了解了什么是负载均衡,那么Nginx是怎么实现这个功能的呢?cookie
Nginx中负责与上游交互的模块,统称为upstream模块。并发
而指定上游服务地址是经过upstream
和server
指令完成的,其关系为:负载均衡
指定上游服务器的address
时,其地址能够是域名、IP地址或者unix socket地址。框架
能够在域名或者IP地址后加端口,若是不加端口,那么默认使用80端口
。socket
在address
后面能够添加一些参数,好比:
backup
:指定当前server为备份服务,仅当非备份server不可用时,请求才会转发到该server。
down
:标识某台服务已经下线,再也不服务。
举个例子:
upstream upstream-service {
server 127.0.0.1:17002;
server 127.0.0.1:17000;
}复制代码
在upstream
这个模块中,它还提供了一个最基本的负载均衡算法round-robin
。
其功能是:
以加权轮询的方式访问server指令指定的上游服务。
这个算法是默认集成在Nginx的框架中,没法移除,因此后面讲解的全部算法都是基于此,全部算法在某些特殊状况下最终都会变成round-robin
。
涉及到的指令有:
weight
:服务访问的权重,默认是1。 max_conns
:server的最大并发链接数,仅做用于单worker进程。 max_fails
:在fail_timeout
时间内,最大的失败次数。当达到最大失败时,会在fail_timeout
时间内不容许再次被选择。 fail_timeout
:单位为秒,默认是10秒。指定一段时间内,最大的失败次数max_fails
。到达max_fails
后,该server不能访问的时间。 有的时候,正常的轮询算法并不能知足咱们的需求,
好比:带有cookie请求状态的链接,若是应用服务没有设置专门的管理cookie的服务器,那么咱们就但愿同一个用户能被分配到同一个服务器。
再好比:咱们后端应用须要针对请求当中的参数或者URL,将相同的请求放到相同的服务器上进行处理。
针对第一种状况,就能够用upstream_ip_hash
。针对第二种状况,可使用upstream_hash
。
功能:
以客户端的IP地址做为hash算法的关键字,映射到特定的上游服务器中。
1. 对IPV4地址使用前3个字节做为关键字,对IPV6则使用完整地址。
2. 可使用
round-robin
算法的参数。3. 能够基于
realip
模块修改用于执行算法的IP地址。
举个例子:
upstream upstream-service {
ip_hash;
server 127.0.0.1:17002;
server 127.0.0.1:17000;
}复制代码
功能:
经过制定关键字做为hash key,基于hash算法映射到特定的上游服务器中。
1. 关键字能够含有变量、字符串。
2. 可使用
round-robin
算法的参数。
举个例子(以请求中的参数username做为hash key):
upstream upstream-service {
hash user_$arg_username;
server 127.0.0.1:17002;
server 127.0.0.1:17000;
}复制代码
hash算法在必定程度上已经能够知足了咱们的业务需求,但若是这个时候遇到应用宕机或者应用扩容,那么hash的总数就会变化,这样颇有可能带来大量请求本来请求的服务器会更换,路由会失效,这样对于咱们的应用服务也会产生极大的影响,这时候就能够采用一致性hash算法。
对于一致性哈希算法的理解,能够参考这篇文章:一致性哈希算法的理解与实践
它的使用也十分简单,就是在以前说的upstream_hash
模块的hash
指令最后,添加参数consistent
,这样Nginx就可使用一致性哈希算法了。
举个例子(仍以请求中的参数username做为hash key):
upstream upstream-service {
hash user_$arg_username consistent;
server 127.0.0.1:17002;
server 127.0.0.1:17000;
}复制代码
以上就是Nginx中比较常见的负载均衡方法了,还有一些好比最少链接算法
等,都是在此之上的一些应用。若是你们有什么疑问,欢迎在下方留言。
有兴趣的话能够访问个人博客或者关注个人公众号、头条号,说不定会有意外的惊喜。