[toc]
nginx七层负载均衡概述
1.nginx负载均衡概念
- 后端web服务往往要承载大量并发请求,单台服务器难以负荷,后端使用多台web服务器组成集群,前端使用nginx作为负载均衡,将请求分散的打到后端服务器集群中,实现负载的分发。这样会大大提升系统的吞吐率、请求性能、高容灾等等。
示意图
2.nginx负载均衡upstream
2.1 语法
Syntax: upstream name { ... }
Default: -
Context: http
2.2 负载均衡方法
总揽
开源nginx调度算法
调度算法 | 概述 |
---|---|
Round Robin | 轮询(rr),按时间顺序逐一分配到不同的后端服务器(默认) |
Weight Round Robin | 加权轮询(wrr),weight值越大,分配到的访问几率越高 |
IP Hash | 每个请求按访问IP的hash结果分配,这样来自同一IP的请求固定访问同一个后端服务器 |
Generic Hash(url_hash) | 按照访问URL的hash结果来分配请求,每个URL定向到同一个后端 |
Least Connections | 最少链接数,哪个机器链接数少就分发 |
2.2.1 Round Robin 轮询
请求在服务器之间平均分配,同时考虑了服务器权重。默认情况下使用此方法(没有启用它的指令)
upstream backend {
# 没有配置就是Round Robin 轮询
server backend1.example.com;
server backend2.example.com;
}
2.2.2 Weight Round Robin 加权轮询
在此示例中,backend1.example.com具有weight 5
;其他两台服务器的默认权重(1
),但是具有IP地址的192.0.0.1
一台backup
服务器被标记为服务器,除非其他两台服务器均不可用,否则不会接收请求。随着权重的这种配置,每的6
请求,5
发送到backend1.example.com和1
对backend2.example.com
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server 192.0.0.1 backup;
}
2.2.3 Least Connections 最少连接
将活动连接最少的请求发送到服务器,再次考虑服务器权重
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
2.2.4 IP Hash
从客户端IP地址确定向其发送请求的服务器。在这种情况下,可以使用IPv4地址的前三个八位位组或整个IPv6地址来计算哈希值。该方法保证了来自同一地址的请求将到达同一服务器,除非该请求不可用
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
如果其中一台服务器需要暂时从负载平衡循环中删除,则可以使用down
参数对其进行标记,以保留客户端IP地址的当前哈希值。该服务器要处理的请求将自动发送到组中的下一个服务器
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
}
2.2.5 Generic Hash (url_hash)
发送请求到的服务器由用户定义的键决定,该键可以是文本字符串、变量或组合。例如,键可以是成对的源IP地址和端口,或者是一个URI,如本例所示
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
哈希指令的可选consistent
参数支持ketama一致哈希负载平衡。请求根据用户定义的散列键值均匀地分布在所有上游服务器上。如果上游服务器被添加到或从上游组移除,只有几个键被重新映射,在负载平衡的缓存服务器或其他积累状态的应用程序的情况下最小化缓存丢失。
应用场景
有一个服务器集群A,需要对外提供文件下载,由于文件上传量巨大,没法存储到服务器磁盘中,所以用到了第三方云存储来做文件存储。服务器集群A收到客户端请求之后,需要从云存储中下载文件然后返回,为了省去不必要的网络带宽和下载耗时,在服务器集群A上做了一层临时缓存(缓存一个月)。由于是服务器集群,所以同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。在此类场景下,为了使得缓存命中率提高,很适合使用url_hash策略,同一个url(也就是同一个资源请求)会到达同一台机器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取,既减少了带宽,也减少的下载时间。
upstream somestream {
hash $request_uri;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}
server {
listen 80 default;
server_name test.cdn.com;
charset utf-8;
location /get {
proxy_pass http://somestream;
}
}
2.2.6 random
每个请求将传递到随机选择的服务器,如果two
指定了参数,首先,NGINX考虑服务器权重随机选择两个服务器,然后使用指定的方法选择这些服务器之一
least_conn
–活动连接最少least_time=header