- 轮询(默认)
- 权重
- weight,访问比率等于权重之比
- IP 哈希
- 解决session问题:每个请求访问IP的hash结果分配,这样每个访客可以固定到后端某一个台服务器。
- 问题:
- 如某台服务器挂掉,对应ip_hash找不到该机器?
- 如果哈希选择失败次数达到20次以上,回退到轮询策略进行选择。
- 如果同一IP地址请求较多,造成某一服务器压力较大,而其余的服务器较空闲?。
- 可以使用url_hash 进一步细分,来实现负载均衡。
- 如某台服务器挂掉,对应ip_hash找不到该机器?
- 最少连接(least_conn)
- 选择连接数最少的服务器
- url_hash(第三方)
- 按访问URL的hash结果来分配请求,使每个URL定向到同一个后端服务器。后端服务器为缓存时比较适用。
- 此中策略中,不能使用weight,等其他参数。
- fair(第三方)
- 按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream模块可定义一个新的上下文, 它包含了一组upstream服务器,这些服务器可能被赋予了不同的权重、不同的类型甚至可以基于维护等原因被标记为down。 upstream模块经常使用在 proxy模块中; 常用指令
- ip_hash
-
- 基于客户端IP地址完成请求的分发
- 它可以保证来自于同一个客户端的请求始终被转发至同一个upstream服务器;
- keepalive
-
- 每个worker进程为发送到upstream服务器的连接所缓存的个数;
- least_conn
-
- 最少连接调度算法;
- server:定义一个upstream服务器的地址,还可包括一系列可选参数,如:
-
- weight
-
- 权重
- max_fails
-
- 最大失败连接次数,失败连接的超时时长由fail_timeout指定;
- fail_timeout
-
- 等待请求的目标服务器发送响应的时长;
- backup
-
- 用于fallback的目的,所有服务均故障时才启动此服务器;
- down
-
- 手动标记其不再处理任何请求;
官方给的简单例子:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
动态选择的例子
resolver 10.0.0.1;
upstream dynamic {
zone upstream_dynamic 64k;
server backend1.example.com weight=5;
server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
server 192.0.2.1 max_fails=3;
server backend3.example.com resolve;
server backend4.example.com service=http resolve;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://dynamic;
health_check;
}
}
实践与问题
实现默认轮询与权重
// 权重
upstream backend {
server 10.103.100.3:8090 weight=2;
server 10.103.100.4:8090;
}
// 默认轮询
upstream backend {
server 10.103.100.3:8090;
server 10.103.100.4:8090;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
问题
- upstream 模块是在http配置块底下,放在server配置块里面会报错
- upstream server 定义后台服务器时直接指定主机名和端口即可
- 不需要加上http://
- http:// 在proxy_pass 中加上即可
- weight 默认值为1
// 带权重ip_hash注意:
upstream backend {
ip_hash;
server 10.103.100.3:8090 weight=2;
server 10.103.100.4:8090;
}
// 普通ip_hash
upstream backend {
ip_hash;
server 10.103.100.3:8090;
server 10.103.100.4:8090;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
- weight,ip_hash 可以叠加使用