Appearance
Nginx 负载均衡
Nginx 七层负载均衡
Example Configuration
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; } }
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; } }
示例:
# 在http配置段中
http {
...
upstream backend-server {
server 192.168.174.141 weight=1;
server 192.168.174.142 weight=2;
server 192.168.174.99 backup; # 备份服务器,当主服务器宕机无法接收请求时将会被启用,可用于sorry server
# server 192.168.174.100 down; # 手动标记主机永久不可用
# server 192.168.174.101 max_conns=[NUMBER] max_fails=[NUMBER] fail_timeout=[NUMBER]; # 从左往右参数分别是:最大并发连接数,用于健康状态检测的最多失败次数,失败的时间
# --- 调度算法 ---
# least_conn; # 最少连接
# fair; # 按后端服务器的响应时间来分配请求,响应时间短的优先分配
# ip_hash; # 每个访客固定访问一个后端服务,此外还可以通过hash来按照键值来绑定请求,↓↓↓如下所示↓↓↓
# * 语法: hash key [consistent]; 例如: `hash $remote_addr`效果和ip_hash算法效果一致,[consistent]参数参考` /扩展(一致性哈希算法)/ `
# --- 其他 ---
# keepalive 32; # 激活连接上游服务器的缓存,数字32表示nginx的每个work进程最大的连接数,当超过该数字时,最近最少使用的连接将会被关闭,该参数常用在后端缓存服务器上
}
...
}
# 在server配置段中
server {
listen 80;
server_name agou-ops.com;
location / {
proxy_pass http://backend-server;
}
}
# ----------- 设置负载均衡所调用的proxy参数
5.准备Nginx负载均衡调度使用的proxy_params
$ vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
# -=------------------
# 在http配置段中
http {
...
upstream backend-server {
server 192.168.174.141 weight=1;
server 192.168.174.142 weight=2;
server 192.168.174.99 backup; # 备份服务器,当主服务器宕机无法接收请求时将会被启用,可用于sorry server
# server 192.168.174.100 down; # 手动标记主机永久不可用
# server 192.168.174.101 max_conns=[NUMBER] max_fails=[NUMBER] fail_timeout=[NUMBER]; # 从左往右参数分别是:最大并发连接数,用于健康状态检测的最多失败次数,失败的时间
# --- 调度算法 ---
# least_conn; # 最少连接
# fair; # 按后端服务器的响应时间来分配请求,响应时间短的优先分配
# ip_hash; # 每个访客固定访问一个后端服务,此外还可以通过hash来按照键值来绑定请求,↓↓↓如下所示↓↓↓
# * 语法: hash key [consistent]; 例如: `hash $remote_addr`效果和ip_hash算法效果一致,[consistent]参数参考` /扩展(一致性哈希算法)/ `
# --- 其他 ---
# keepalive 32; # 激活连接上游服务器的缓存,数字32表示nginx的每个work进程最大的连接数,当超过该数字时,最近最少使用的连接将会被关闭,该参数常用在后端缓存服务器上
}
...
}
# 在server配置段中
server {
listen 80;
server_name agou-ops.com;
location / {
proxy_pass http://backend-server;
}
}
# ----------- 设置负载均衡所调用的proxy参数
5.准备Nginx负载均衡调度使用的proxy_params
$ vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
# -=------------------
Nginx 四层负载均衡
Example Configuration
worker_processes auto; error_log /var/log/nginx/error.log info; events { worker_connections 1024; } stream { upstream backend { hash $remote_addr consistent; server backend1.example.com:12345 weight=5; server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; } upstream dns { server 192.168.0.1:53535; server dns.example.com:53; } server { listen 12345; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass backend; } server { listen 127.0.0.1:53 udp reuseport; proxy_timeout 20s; proxy_pass dns; } server { listen [::1]:12345; proxy_pass unix:/tmp/stream.socket; } }
worker_processes auto; error_log /var/log/nginx/error.log info; events { worker_connections 1024; } stream { upstream backend { hash $remote_addr consistent; server backend1.example.com:12345 weight=5; server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; } upstream dns { server 192.168.0.1:53535; server dns.example.com:53; } server { listen 12345; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass backend; } server { listen 127.0.0.1:53 udp reuseport; proxy_timeout 20s; proxy_pass dns; } server { listen [::1]:12345; proxy_pass unix:/tmp/stream.socket; } }
示例:
stream {
upstream ssh_servers {
server node01:22; # 同七层负载均衡,可指定权重weight,是否为备用节点backup,此外还有fail_timeout
server node02:22;
}
upsteam web_servers {
server node01:80;
server node02:80;
}
server {
listen 9922;
proxy_pass ssh_servers;
proxy_timeout 10m; # 客户端两次请求之前的间隔,默认为10min
proxy_connect_timeout 60s; # nginx与被反代服务器舱室连接的超时时长,默认为60s
}
server {
listen 80;
proxy_pass web_servers;
}
}
stream {
upstream ssh_servers {
server node01:22; # 同七层负载均衡,可指定权重weight,是否为备用节点backup,此外还有fail_timeout
server node02:22;
}
upsteam web_servers {
server node01:80;
server node02:80;
}
server {
listen 9922;
proxy_pass ssh_servers;
proxy_timeout 10m; # 客户端两次请求之前的间隔,默认为10min
proxy_connect_timeout 60s; # nginx与被反代服务器舱室连接的超时时长,默认为60s
}
server {
listen 80;
proxy_pass web_servers;
}
}
四七层负载均衡对比
- 四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;
- 四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号)
- 四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同事的使用)
- 四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
- 通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡。
Nginx负载均衡调度算法
详情参考:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
调度算法 | 概述 | 简称 |
---|---|---|
轮询 | 按时间顺序逐一分配到不同的后端服务器(默认)不考虑实际负载或实际配置,所有服务器都是平等,平均负载请求 | rr |
weight | 加权轮询,weight值越大,分配到的访问几率越高 | wrr |
ip_hash | 每个请求按访问IP的hash结果分配,这样来自同一IP的客户端固定会访问同一个后端服务器 | - |
url_hash | 按照访问URL的hash结果来分配请求,每次相同的URL都会定向到同一个后端服务器 | - |
consistent_hash | 一致性哈希算法,需要额外的模块包 | - |
least_conn | 最少连接数,那个机器连接数少就分发 | lc |
wlc | 加权最小连接 | wlc |
部分配置示例:
# rr 与 wrr
upstream web_lb {
server 172.16.1.20:80 weight=5;
server 172.16.1.30:80;
server 172.16.1.40:80;
}
# ip_hash,注意ip_hash不能与轮询或者加权轮询共同使用
upstream web_lb {
ip_hash;
server 172.16.1.20:80;
server 172.16.1.30:80;
server 172.16.1.40:80;
}
# consistent_hash
upstream somestream {
consistent_hash $request_uri;
server 10.50.1.3:11211;
server 10.50.1.4:11211;
server 10.50.1.5:11211;
}
# rr 与 wrr
upstream web_lb {
server 172.16.1.20:80 weight=5;
server 172.16.1.30:80;
server 172.16.1.40:80;
}
# ip_hash,注意ip_hash不能与轮询或者加权轮询共同使用
upstream web_lb {
ip_hash;
server 172.16.1.20:80;
server 172.16.1.30:80;
server 172.16.1.40:80;
}
# consistent_hash
upstream somestream {
consistent_hash $request_uri;
server 10.50.1.3:11211;
server 10.50.1.4:11211;
server 10.50.1.5:11211;
}
扩展(一致性哈希算法)
一致性hash用于对hash算法的改进,后端服务器在配置的server的数量发生变化后,同一个upstream server接收到的请求会的数量和server数量变化之间会有变化。尤其是在负载均衡配置的upstream server数量发生增长后,造成产生的请求可能会在后端的upstream server中并不均匀,有的upstream server负载很低,有的upstream server负载较高,这样的负载均衡的效果比较差,可能对upstream server造成不良的影响。由此,产生了一致性hash算法来均衡。
ℹ️ 详细介绍参考:https://baike.baidu.com/item/%E4%B8%80%E8%87%B4%E6%80%A7%E5%93%88%E5%B8%8C/2460889?fr=aladdin
在 nginx 中的应用:
upstream backend_server {
...
hash $request_uri consistent; # 增加`consistent`即可
...
}
upstream backend_server {
...
hash $request_uri consistent; # 增加`consistent`即可
...
}
参考链接
- ngx_http_upstream_module:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
- upstream-keepalive:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
- ngx_stream_core_module:http://nginx.org/en/docs/stream/ngx_stream_core_module.html
- ngx_stream_upstream_modulehttp://nginx.org/en/docs/stream/ngx_stream_upstream_module.html
- 一致性哈希:https://baike.baidu.com/item/一致性哈希/2460889?fr=aladdin