Nginx系列-负载均衡(Nginx配置介绍)
之前简单聊了一下负载均衡,包括四层负载均衡以及七层负载均衡,以及市面上常用来做负载均衡的设备以及软件,本节里面我们主要看一下Ngnix负载均衡的配置。
# Nginx负载均衡的简单配置
我们先来看一下nginx作为负载均衡的模型图,然后再来看一下具体的配置。如下图:
客户端发起请求之后,需要访问相关的服务器,nginx利用反向代理根据不同的策略,将请求分配到不同的机器上面。其默认策略是轮询的模式,所谓轮询,即当用户请求过来的时候,请求会按照顺序循环一次分发到对应的机器上面,比如nginx下挂了三台tomcat服务器,分别是tomcat1 tomcat2 tomcat3,那么请求过来的时候分别会分发到1,2,3,1,2,3...如此轮询,下面我们来看一下其配置:
server {
listen 80;
server_name www.kd.com;
location / {
proxy_pass http://tomcats;
}
}
upstream tomcats {
server 172.16.128.139:8080;
server 172.16.128.141:8080;
server 192.168.31.84:8080;
}
2
3
4
5
6
7
8
9
10
11
12
上面就是通过upstream配置了三台tomcat服务器,并且端口号是8080,当请求域名"http://www.kd.com" 的时候,请求会分发到这三台中一台。
# Nginx负载均衡策略
轮询策略:上述我们说到了轮询,其实这就是一种nginx的默认的负载均衡的策略。关于轮询上述已经介绍,因此不多赘述。
权重策略:根据服务器的处理能力,配置权重,权重越高,那么后续请求过来的时候访问到该台服务器的概率也就越大。配置如下:
upstream tomcats { server 172.16.128.139:8080 max_conns=2 weight=6; server 172.16.128.141:8080 max_conns=3 weight=4; server 192.168.31.84:8080 max_conns=4 weight=2; }
1
2
3
4
5在上述配置中,其第一台服务器172.16.128.139的机器被访问到的概率是最高的,因为权重是三台服务器中最大的。
IP哈希策略:根据ip进行hash算法的运算,然后除以服务器的数量进行取模运算,获取机器的索引号,从而定位分发到具体的机器上面,主要的hash算法的公式是这样的:hash(ip)%node_counts=index。不过这里面有个注意点,假设有三台机器,分别是172.16.12.145、172.16.12.146、172.16.12.148,那么这三台机器取模运算之后所获取的索引index的值是同一个,也就是说请求会被分发到同一台机器,为什么呢?其实原理也是很简单,因为nginx内部ip hash的算法中只是对ip地址的前三位进行hash取模运算,简单地来说是这样的,hash(172.16.12),所以最终得到的index的索引是一致的。当然有兴趣的同学可以看一下相关的源码信息,该模块对应的源码信息在“/nginx-1.16.1/src/http/modules/ngx_http_upstream_ip_hash_module.c”。关于ip哈希的配置也比较简单,具体如下:
upstream tomcats { ip_hash; server 172.16.128.139:8080; server 172.16.128.141:8080 weight=4; server 192.168.31.84:8080; }
1
2
3
4
5
6一致性哈希算法策略:关于一致性hash算法感觉可以专门出一篇文章来介绍,在此先一笔带过。后续老猫整理输出,这边值得去提的是,目前一致性hash是要给nginx装上额外的插件才能完成配置。
url哈希算法策略:关于url哈希算法策略,我们可以类比一下IP 哈希,其原理也大致差不多,该算法:hash(url)%node_counts=index,其他的不多做赘述,我们来看一下该策略的配置
upstream tomcats { hash $request_uri; server 172.16.128.139:8080; server 172.16.128.141:8080 weight=4; server 192.168.31.84:8080; }
1
2
3
4
5
6least_conn算法策略:表示的是连接数最小的那台数据会优先被请求到,举个例子,倘若有三台机器,如果在配置一致的情况下由于某种原因导致其中一台连接数量比较少,那么我们就可以有这样的一个配置,后续的请求会大概率的分配到这个连接数比较少的那台服务器上,具体配置如下:
upstream tomcats { least_conn; server 172.16.128.139:8080; server 172.16.128.141:8080 weight=4; server 192.168.31.84:8080; }
1
2
3
4
5
6
# upstream主要配置参数介绍
upstream中的配置参数主要有这几个,分别是:max_conns 、slow_start、down、backup 、max_fails、fail_timeout。我们依次来看一下。
max_conns:可以用于限制一台服务器最大的连接数。默认值为0,表示不做任何限制,我们使用这个配置的时候,可以根据服务器的能力给其分别设置连接数,如果连接数超过其设置的连接的数的时候,这台服务器就无法访问。某种意义上起到了熔断的作用,相当于是保险丝,其保护了服务器的可用。其配置方式如下:
#worker进程设置成一个,便于测试观察成功的链接数 worker_process 1; upstream tomcats { server 172.16.128.139:8080 max_conns=2; server 172.16.128.141:8080 max_conns=3; server 192.168.31.84:8080 max_conns=4; }
1
2
3
4
5
6
7slow_start:在对应的服务器上加入这个配置之后,可以让服务器延迟加入集群中。此配置便于运维人员观察流量从小到大的增长,便于运维人员启动一些其他的服务。(这个参数的配置只有商业版本的nginx才可以使用,如果是开源的nginx,则无法使用)。关于其配置如下:
upstream tomcats { server 172.16.128.139:8080 weight=6 slow_start=60s; server 172.16.128.141:8080 weight=2; server 192.168.31.84:8080 weight=1; }
1
2
3
4
5注意点:(1)该参数不能使用在hash和random load balancing中。(2)如果一个upstream中只有一台服务器,那么此时该配置失效。
down和backup:被标识成down的服务器表示不可用,请求不会被分发到该服务器。当一台服务器被标识成backup的时候,那么此时这台机器作为备用机器,当其他服务器均挂掉无法使用的时候,那么此时这台机器会被激活。
upstream tomcats { server 172.16.128.139:8080 down; server 172.16.128.141:8080 backup; server 192.168.31.84:8080 weight=1; }
1
2
3
4
5max_fails和fail_timeout:标记成max_fails的节点表示,如果请求过来到这台服务器失败次数超过该配置的次数的时候,那么此时则把该节点置为不可用,之后的请求将不会访问到该节点。fail_timeout表示失败的时间段。这两者一半配合在一起使用,表示的是一段时间之内失败次数超过过少次之后,该时间断之内该服务器节点不可用。等到过了这个时间段之后,服务器有重新恢复,可以被请求访问到。
upstream tomcats { server 172.16.128.139:8080 max_fails=2 fail_timeout=15s; server 172.16.128.141:8080; server 192.168.31.84:8080 weight=1; }
1
2
3
4
5上述配置表示在15秒内请求访问到172.16.128.139这台服务器失败次数达到两次的时候,则认为该server已经挂了或者宕机了,随后再过15秒,这15秒内不会有新的请求达到挂掉的节点。而是会请求到其他正常运行的节点,15秒后会会有新的请求尝试连接刚才那台宕掉的机器,如果还是失败,则重复上一过程,一直到恢复。
keepalive:该配置可以提高请求的吞吐量,当配置完该文件之后,就会保持长链接,当请求过来的时候,则会直接拿到链接进行获取资源,而不用经过打开和关闭链接的过程,从而大大提高了吞吐量。具体的配置有三个keepalive表示连接处理的数量,proxy_http_version表示设置长链接http的版本,proxy_set_header表示header信息,如果设置成空,则表示清除header信息,如下:
upstream tomcats { server 172.16.128.139:8080; server 172.16.128.141:8080; server 192.168.31.84:8080; keepalive 32;##表示长链接处理的数量 } server { listen 80; server_name www.kd.com; location / { proxy_pass http://tomcats; proxy_http_version 1.1;#设置长链接的版本为1.1 proxy_set_header Connection "";#清除connection header信息 } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
以上就是罗列了upstream中常用的一些配置参数,当然这几个都是比较常用的,另外的还有很多其他的配置信息,老猫在此不一一举例,大家详细可以参考相关的nginx的文档,文档地址为:http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html
到此呢,老猫就简单地将nginx的相关负载均衡的配置策略以及常用的负载均衡中的属性和大家介绍了一下,另外的上述提到的一致性hash,老猫会抽空专门做一个主题来和大家进行同步。