nginx的6种负载均衡策略
在服务器集群中,Nginx起到一个反向代理服务器的作用。为了避免单独一个服务器压力过大导致服务器奔溃,就需要将不同用户的请求转发给不同给不同的服务器,保证集群中的每一台服务器都能正常运作,这种机制就叫做负载均衡。
下面说一下Nginx支持的6种负载均衡策略。
轮询(默认)
轮询是Nginx支持的默认负载均衡策略,轮询策略就是指每个请求会按时间顺序逐一分配到不同的后台服务器上。比如说一个集群中只有服务器A和服务器B,第一次访问是服务器A,第二次访问就是服务器B,第三次访问就是服务器A...以此类推。
upstream balanceServer {
server localhost:8081;
server localhost:8082;
server localhost:8083;
server localhost:8084;
}
轮询策略提供如下参数:
fail_timeout | 与max_fails结合使用,表示max_fails次失败后服务器暂停的时间。 |
max_fails |
设置在fail_timeout参数设置的时间内最大失败次数,默认是1,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了,返回proxy_next_upstream模块定义的错误。
|
fail_time | 服务器会被认为停机的时间长度,默认为10s。 |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里,当其他所有的非backup机器down掉或者繁忙的时候才会请求backup服务器,因此这台机器压力会最低。 |
down | 标记服务器永久停机了,表示当前的server暂时不参与负载。 |
weight | 负载的权重,默认为1。weight越大,表示这台服务器被访问的几率就越大。 |
在轮询策略下,如果集群中的某个服务器挂掉了,就会自动剔除该服务器。
轮询策略适合服务器配置相当,无状态且短平快的服务使用。
权重(weight,加权轮询)
权重策略是在轮询策略的基础上,另外指定了轮询的几率。
upstream balanceServer {
server localhost:8081;
server localhost:8082 backup;
server localhost:8083 max_fails=3 fail_timeout=20s;
server localhost:8084 weight=2;
}
在上面的例子中,weight参数用来指定轮询的几率,weight的默认值为1,weight的数值与访问比率成正比,比如8084端口的服务器被访问的几率是其他服务器的两倍。
权重越高,分配到需要处理的请求就越多。
权重策略可以与least_conn和ip_hash结合使用。
权重策略比较适合服务器的硬件配置差别较大的情况。
根据IP分配(ip_hash)
这种策略是按照客户端的IP去分配服务器,使同一个客户端的请求都转发到同一个后台服务器,保证了Session的统一性,可以用来解决Session的跨域问题。
upstream balanceServer {
ip_hash; # 指定负载均衡策略为ip_hash
server localhost:8081;
server localhost:8082 backup;
server localhost:8083 max_fails=3 fail_timeout=20s;
server localhost:8084 weight=2;
}
在Nginx的1.3.1版本之前,不能在这种策略种使用权重(weight)。
ip_hash不能和backup参数同时使用。
这个策略适用于有状态服务,比如说Session会话。
当有服务器需要剔除的时候,必须手动down掉。
最少连接(least_conn)
这个策略是把请求转发给连接数较少的后端服务器。前面的轮询策略是把请求平均地转发给集群中的每个后台服务器,使得它们的负载大致相同,但是有些请求可能占用的时间会很长,可能导致所在的后端负载过高。这种情况下选用least_conn策略就能达到更好的负载均衡效果。
upstream balanceServer {
least_conn; # 指定负载均衡策略为least_conn
server localhost:8081;
server localhost:8082 backup;
server localhost:8083 max_fails=3 fail_timeout=20s;
server localhost:8084 weight=2;
}
这个策略适合用在请求处理时间长短不一造成服务器过载的场景。
响应时间(fair)
这种策略是按照服务器的响应时间来分配请求,响应时间短的优先分配。
upstream balanceServer {
fair; # 指定负载均衡策略为fair
server localhost:8081;
server localhost:8082;
server localhost:8083;
server localhost:8084;
}
fair策略是一种第三方策略,需要安装第三方插件。
根据URL分配(url_hash)
这种策略是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash的话,就可以使得同一个url(也就是同一个资源请求)到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。
upstream balanceServer {
url_hash; # 指定负载均衡策略为url_hash
server localhost:8081;
server localhost:8082;
server localhost:8083;
server localhost:8084;
}
url_hash策略是一种第三方策略,需要安装第三方插件。
配置实例
# user yanggb;
worker_processes 4; events {
# 最大并发数
worker_connections 1024;
} http {
# 待选服务器列表
upstream balanceServer {
server 10.1.40.129:8099 fail_timeout=60s;
server 10.1.40.23:9088;
server 10.1.40.77:7086;
} server {
# 监听端口
listen 80; # 根目录下
location / {
# 选择哪个服务器列表
proxy_pass http://balanceServer;
}
} }
总结
Nginx的负载均衡其实也可以看作是5种,因为其中的权重轮询其实可以归类到轮询策略中。除了轮询策略(包括权重轮询)外的其他负载均衡策略都是使用不同的算法实现的,在实际的运用中,需要根据不同的场景有针对性地去选择不同的负载均衡策略(可以多种策略组合使用),来响应实际的需求。
"有没有那么一个特别的场景,能让你想起我。"
nginx的6种负载均衡策略的更多相关文章
- nginx的几种负载均衡策略
转自https://www.cnblogs.com/1214804270hacker/p/9325150.html 一.关于Nginx的负载均衡 在服务器集群中,Nginx起到一个代理服务器的角色(即 ...
- [转帖]Nginx服务器的六种负载均衡策略详解
Nginx服务器的六种负载均衡策略详解 咔咔侃技术 2019-09-11 17:40:12 一.关于Nginx的负载均衡 在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独 ...
- 【Nginx(三)】Nginx配置集群 负载均衡策略
Nginx配置集群 负载均衡策略 一.安装环境 1.安装JDK8的环境,配置JDK8的环境变量 2.上传jar包demo-1.jar 和 demo-2.jar demo-1.jar 监听8080端口; ...
- Spring Cloud Ribbon 中的 7 种负载均衡策略
负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 Ribbon 就属于后者--客户端负载均衡器. 服务端负载均衡器的问题是,它提供了更强的流量控制权,但 ...
- 【Nginx(四)】Nginx配置集群 负载均衡策略
1.Nginx常见的负载均衡策略 ip_hash (固定分发) 简介:根据请求按访问ip的hash结果分配,这样每个用户就可以固定访问一个后端服务器 场景:服务器业务分区.业务缓存.Session需要 ...
- Nginx的两种负载均衡搭建(Tomcat版)
前言 Nginx的负载均衡一般采用upstream来实现,但是,还有另一种文件拓展的方式,同样可以实现负载均衡. 一.一般的负载均衡 upstream my_server { server local ...
- DNS负载均衡与NGINX负载均衡策略
负载均衡是指的是把请求均匀的分摊到多个服务器上处理.一般常见的负载均衡有两种:①客户端与反向代理服务器之间的DNS负载均衡②反向代理服务器与应用服务器之间的负载均衡(这种负载均衡有很多,可以是webl ...
- Nginx服务器之负载均衡策略(6种)
一.关于Nginx的负载均衡 在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器.详情请查看我的另一篇博客. 二.Ng ...
- Nginx几种负载均衡算法及配置实例
本文装载自: https://yq.aliyun.com/articles/114683 Nginx负载均衡(工作在七层"应用层")功能主要是通过upstream模块实现,Ngin ...
随机推荐
- JS 查找数组的父节点及祖先节点
function findAllParent(node, tree, parentNodes=[], index = 0){ if(!node || node.parentId === 0){ ret ...
- Java 类加载机制(阿里)-何时初始化类
(1)阿里的面试官问了两个问题,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的 ...
- SpringCloud的入门学习之Netflix-eureka(Eureka的集群版搭建)
1.Eureka单机版的话,可能会出现单点故障,所以要保障Eureka的高可用,那么可以进行搭建Eureka的集群版. 高可用的Eureka的注册中心,将注册中心服务部署到多台物理节点上,形成一个集群 ...
- 01初识 JavaScript
1.初识 JavaScript 1.1 JavaScript 是什么 l JavaScript 是世界上最流行的语言之一,是一种运行在客户端的脚本语言 (Script 是脚本的意思) l 脚本语言 ...
- Python散列类型和运算符
集合定义 集合的交 并 差 常见的运算符的用法 字典的定义 字典的 get items keys pop popitem update 方法 三种逻辑运算 集合 集合特性 唯一性:不存在两 ...
- [Go] 分页计算页码的主要逻辑
当使用imap进行读取邮件体的时候,有个函数可以根据传入的开始和结束索引来一次读取多条邮件内容主要逻辑类似这样,从1开始, 1,10 11,20 21,30 或者 1,31 32,63 ...
- [Linux] deepin系统添加PHP仓库源出错Error: could not find a distribution template for Deepin/stable
aptsources.distro.NoDistroTemplateException: Error: could not find a distribution template for Deepi ...
- CodeForces 1236D(模拟)
题意 https://vjudge.net/problem/CodeForces-1236D 最近,爱丽丝得到了一个新玩偶.它甚至可以走路! 爱丽丝为玩偶建造了一个迷宫,并想对其进行测试.迷宫具有n行 ...
- 初学JavaScript正则表达式(二)
正则表达式的实例化与标识符 字面量: var reg = /\bis\b/g // \b--字符边界 g全文搜索 查找单词为is的字符 He is a boy. IS He? 构造函数: var re ...
- JVM的内存结构以及性能调优
JVM的内存结构以及性能调优 发布时间: 2017-11-22 阅读数: 16675 JVM的内存结构以及性能调优1:JVM的结构主要包括三部分,堆,栈,非堆内存(方法区,驻留字符串)堆上面存储的是引 ...