一、Nginx 负载均衡
1. 负载均衡配置
- 通过 proxy_pass 属性,可以把 请求 代理至 后端服务
- 但是为了实现更高的 负载及性能, 我们的后端服务通常是多个
- 这个是时候可以通过 upstream 模块,实现 负载均衡
upstream backend {
server 127.0.0.1:8010 weight=1;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:8030 weight=1 backup;
}
location / {
proxy_pass http://backend;
}
2. upstream 相关参数
属性 | 描述 |
---|
server | 代理服务地址: 加端口 |
weight | 权重 |
max_fails | 失败多少次,认为主机已挂掉则,然后踢出 |
fail_timeout | 踢出后,重新探测时间 |
backup | 备用服务 |
max_conns | 允许最大连接数 |
slow_start | 当节点恢复,不立即加入,而是等待 slow_start 后再加入服务队列 |
server '服务地址':'端口'
weight='数字'
max_fails
fail_timeout
backup
max_conns
slow_start
3. upstream 负载均衡算法
weight
:权重(默认:轮询加权重)。ip_hash
:基于 IP 的 哈希值计算。
- 应用场景:保持 Session 一至性。
url_hash
:基于 URL 的 哈希值计算(需第三方模块)。
- 应用场景:静态资源缓存,节约存储,加快速度。
least_conn
:最少连接(需第三方模块)。least_time
:最快响应时间(需第三方模块)。
- 计算节点 平均响应时间,然后取响应最快的那个,分配更高 权重。
二、负载均衡算法
1. weight 轮询【默认】
- 接收到的请求,按照顺序逐一分配 到 不同的后端服务器
- 即使在使用过程中,某一台 后端服务器宕机,nginx 会自动将该服务器 剔除出队列,请求受理情况不会受到任何影响
- 这种方式下,可以给不同的 后端服务器 设置一个 权重值(weight),用于调整 不同的服务器上请求的分配率
- 权重数据越大,被分配到请求的几率越大
- 该权重值,主要是针对实际工作环境中,不同的 后端服务器 硬件配置进行调整的
upstream www.weight.com {
server 172.17.0.2:8080 weight=5;
server 172.17.0.3:9090 weight=10;
}
2. ip_hash IP 哈希值
- 每个请求按照发起 客户端 IP 的 Hash 值 进行匹配
- 这样的算法下,一个 固定 IP 地址的客户端,总会访问到 同一个后端服务器
- 这也在一定程度上,解决了集群部署环境下 Session 共享 的问题
upstream www.ip_hash.com {
ip_hash;
server 172.17.0.2:8080 weight=5;
server 172.17.0.3:9090 weight=10;
}
3. url_hash URL 哈希值【第三方插件】
- 按照访问的 URL 的 Hash 值 分配请求
- 每个请求的 URL 会指向 后端固定的某个服务器
- 可以在 nginx 作为 静态服务器 的情况下,提高缓存效率
- nginx 默认不支持 url_hash 算法
- 使用这种调度算法,需安装 Nginx 的 hash 软件包
4. fair 智能调整调度算法【第三方插件】
- 这个比上面两个 更加智能的负载均衡算法
- 动态的根据 后端服务器 的 请求处理到响应的时间,进行 均衡分配
- 响应时间短 处理效率高 的服务器,分配到请求的 概率高
- 响应时间长 处理效率低 的服务器,分配到的 请求少
- 它是结合了前两者的优点 的一种调度算法
- nginx 默认不支持 fair 算法
- 使用这种调度算法,需安装 upstream_fair 第三方模块
5. least_conn 最少连接
upstream www.least_conn.com {
least_conn;
server 172.17.0.2:8080;
server 172.17.0.3:9090;
}
三、负载均衡配置
- 在接收到某个请求后,分配到 后端 的多台服务器上,需要配置 upstream 模块
- 是命名一个 后端服务器组,组名必须为 后端服务器站点域名
- 内部可以配置多台服务器
ip:port
,还可以设置 跳转规则及权重 等等 - 是配置 Nginx 与 后端服务器 负载均衡,非常重要的一个模块
- 并且它还能对 后端的服务器 的 健康状态 进行检查,若 后端服务器 中的一台发生故障,则 前端的请求 不会转发到该 故障的机器
upstream qs-server {
ip_hash;
server 10.10.10.111:8080;
server 10.10.10.112:8080 weight=2;
server 10.10.10.113:8080;
}
server {
listen 80;
server_name www.qs.com;
location / {
proxy_pass http://qs-server;
proxy_set_header X-real-ip $remote_addr;
}
}
server {
listen 80;
server_name mongo.demo.com;
location / {
proxy_pass http://webhost;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
四、负载均衡备份
upstream www.backup.com {
server 172.17.0.2:8080;
server 172.17.0.3:9090 backup;
}