负载均衡实际上是一种网络技术,主要是基于现有的网络结构,增加吞吐量、加强网络数据处理能力、提高应用系统的灵活和可用性。利用Nginx可实现负载均衡,Nginx支持加权Round-Robin负载均衡算法,即加权轮询方式访问server指令指定的后端服务的功能。该功能是集成在Nginx的upstream框架中,指令中涉及多个参数,各个参数含义说明如下:
weight:服务访问的权重,默认是1
max_conns:server的最大并发连接数,仅作用于单worker进程,默认是0,表示没有限制
max_fails:在fail_timeout时间段内,最大的失败次数,当达到最大失败时,会在fail_timeout秒内这台server不允许再次被选择
fail_timeout:单位为妙,默认10秒
下图是负载均衡配置,下图右边是实验结果,可以看到通过配置upstream和proxy_pass,当用curl命令访问nginx服务时,会根据权重将请求代理到8011或者8012的服务上(备注:这里另外启动了一个nginx服务来模拟后端服务,即监听在8011和8012的服务)。
上图的配置中,还开启了keepalive,开启keepalive的作用是使用长连接,通过复用连接,降低nginx与后端服务建立、关闭连接的消耗,提升吞吐量的同时还可以降低延迟。下图是开启keepalive的情况下,使用tcpdump命令监听8011端口,连续往8011端口发送两次请求,从打印的信息中可以看到只有刚开始的时候有Flag=S的请求。
关闭keepalive设置后,用curl命令连续往连续往8011端口发送两次请求,可以看到有两段Flag=S的请求,说明重新建立了TCP连接。
上面介绍了加权轮询的负载均衡策略,Nginx还支持基于客户端IP地址的Hash算法实现负载均衡,模块是upstream_ip_hash,使用ip_hash模式,工作原理是hash表记录了每个客户端IP和后端服务器的对应关系,客户端每次都访问都是同一个后端服务器响应。另外,Nginx还支持基于任意关键字实现Hash算法的均衡策略,模块是upstream_hash模块,可以通过指定关键字作为hash key。下图是iphash的配置,实验结果如右图所示:
使用ip_hash模式,本质上是hash表记录了每个客户端IP和后端服务器的对应关系,客户端每次的访问都发往同一个后端服务器。如果后端服务出现扩容或者宕机,那么路由信息会随着服务器的改变而改变。ip_hash的模式下,如果出现扩容或者服务宕机会带来一个问题:hash算法引发大量路由变更,可能导致缓存大范围失效的情况,从而引发性能问题。针对这种情况,Nginx提供了一致性Hash算法来缓解此问题。采用一致性Hash算法语法配置上很简单,添加consistent即可,语法格式:hash key[consistent]。配置内容如下所示
upstream firstCluster{hash $remote_addr consistent;...}
除前面介绍的负载均衡算法外,nginx还支持最小连接数负载均衡算法,即找出当前后端服务中,连接数最小的一个,将请求转发过去。如果出现多个服务连接数一样,那么将采用round-robin
算法来决定最终将请求转发到哪台服务上。
upstream firstCluster{least_conn;...}
默认情况下Nginx的负载均衡算法是单worker进程的,如果要支持多worker进程,需要使用upstream_zone模块。该模块的功能是分配出共享内存,将其他upstream模块定义的负载均衡策略数据、运行时每个后端服务的状态数据存放在共享内存中,这样就达到了在所有worker进程中都生效的效果,配置方式如下所示
upstream firstCluster{zone zone_name 16k;...}
前面介绍的负载均衡策略都在upstream指令块中配置,下面列举了upstream提供的不包含cache的变量,通过$变量名称,可以获取这些变量的值。
upstream_addr: 后端服务器IP地址,例如127.0.0.1:8001
upstream_connect_time: 与后端服务器建立连接消耗的时间,时间为秒
upstream_header_time: 接收到后端法务发回响应中http头部所消耗的时间,单位秒
upstream_response_time: 接收完整后端服务返回的响应所消耗的时间,单位秒
upstream_http_字段名称: 从后端法务返回的响应头部某个字段的值
upstream_bytes_received: 从后端服务接收到的响应长度,单位字节
upstream_response_length: 从后端服务返回的响应包体的长度,单位字节
upstream_status: 从后端服务返回的状态码
upstream_cookie_名称: 从后端服务发回的响应头Set-Cookie中取出cookie值
以上就是对Nginx提供负载均衡算法策略的介绍。