upstream负载均衡
语法规则
upstream *name*
{ … }
Default:——
Context:http
定义一组服务器。服务器可以侦听不同的端口(可以混合侦听TCP和UNIX域套接字的服务器)
http{
# backend是虚拟服务的名字,可自行定义
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com backup;
}
server {
listen 80;
server_name dh
location / {
# 这里的proxy_pass的http://后面的部分要配置成 upstream的服务名称
proxy_pass http://dh;
}
}
upstream dh {
server localhost:8088;
server localhost:8089;
}
}
服务器在负载均衡调度的状态
调度状态 | 状态解析 |
---|---|
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails的失败次数后,服务暂停的时间 |
max_conns | 限制最大的接收的连接数 |
upstream dh {
# 负载均衡不会分配到 dh1.com 这台机子
server dh1.com down;
# 预留备份即其他参与负载均衡的机子都提供不了服务的时候
# 预留的机子就会顶上,由预留机子提供服务直到其他机子其中一个恢复
# 当其他提供服务的机子恢复后,该机子会自动变回预留状态,从而由其他机子提供服务
server dh2.com backup;
# 表示允许失败的次数是10次,十次调用失败后,需要等待30s再重新检查该机子
server dh3.com max_fails=10 fail_timeout=30s;
server dh4.com max_conns=1000;
}
调度算法
算法名称 | 算法原理 |
---|---|
轮询 | 按时间顺序逐一分配到不同的后端服务器 |
加权轮询 | weight值越大,分配到的访问几率越高 |
ip_hash | 每个请求按访问IP的hash结果分配,这样来自同一个IP的请求将会固定访问一个后端服务器 |
url_hash | 按照访问URL的hash结果来分配请求,这样每个URL定向到同一个后端服务器 |
least_conn | 最少连接数,哪个机器的连接数少就分发给哪个机器 |
hash关键数值 | hash自定义的key来分发请求 |
# 加权方式(weight默认是1)
upstream dh {
server dh1.com down weight=8;
server dh2.com backup weight=6;
server dh3.com max_fails=10 fail_timeout=30s weight=1;
}
# ip_hash方式
upstream dh {
ip_hash;
server dh1.com down;
server dh2.com backup;
server dh3.com max_fails=10 fail_timeout=30s;
}
# url_hash方式 (其实也就是采用了hash 关键字的形式)
upstream dh {
hash $request_uri;
server dh1.com down;
server dh2.com backup;
server dh3.com max_fails=10 fail_timeout=30s;
}
# least_conn方式
# 指定组应使用负载平衡方法,其中请求以最少数量的活动连接传递给服务器
#同时考虑服务器的权重。如果有多个这样的服务器,则使用加权循环平衡方法依次尝试它们
upstream dh {
least_conn;
server dh1.com down;
server dh2.com backup;
server dh3.com max_fails=10 fail_timeout=30s;
}