通常而言,有如下几种常见的负载均衡策略:算法
一.轮询。后端
特色:给每一个请求标记一个序号,而后将请求依次派发到服务器节点中,适用于集群中各个节点提供服务能力等同且无状态的场景。缓存
缺点:该策略将节点视为等同,与实际中复杂的环境不符。加权轮询为轮询的一个改进策略,每一个节点会有权重属性,可是由于权重的设置难以作到随实际状况变化,仍有必定的不足。服务器
二.随机。session
特色:每次请求随机分发给服务器节点。并发
缺点:在同一截面上发生碰撞的几率比较高; 在非对等集群组网,或者硬件配置差别较大时,各节点负载不均匀 经过加权随机进行提高。负载均衡
三.最小响应时间(服务调用时延)。性能
特色:根据每一个服务器处理请求的时间和平均时间的差值,来动态调整分发权重, 能够保证服务延时大的服务器,处理更少的请求。 该策略能够保证处理请求能力强的服务器接收到更多的请求。 经过动态权重缩小服务调用时延的震荡范围,使全部请求的处理时间接近平均值。ui
缺点:计算平均响应时间会耗费时间,滞缓请求的分发。 改进的只计算最近若干次的平均时间的策略。url
四. 最小并发数。客户端的每一次请求服务在服务器停留的时间可能会有较大的差别,随着工做时间加长,若是采用简单的轮循或随机均衡算法,每一台服务器上的链接进程可能会产生较大的不一样,并无达到真正的负载均衡。最小并发数的策略则是记录了当前时刻,每一个备选节点正在处理的事务数,而后选择并发数最小的节点。该策略可以快速地反应服务器的当前情况,较为合理地将负责分配均匀,适用于对当前系统负载较为敏感的场景。
五.一致性哈希。哈希值是32位的正整数,其值的分布范围按照必定规则分配给多个虚拟节点; 虚拟节点数量至少应是实际节点的两倍; 实际节点经过哈希值再对虚拟节点进行瓜分; 对“请求”取哈希值,分发到相应虚拟节点,虚拟节点对应的实际节点来处理“请求”。 相同参数的请求,老是发送到同一个服务提供者。 当某一台服务器宕机时,本来发往该节点的请求,基于虚拟节点,平摊到其余提供者, 从而避免引发集群剧烈变更。
ngnix负载均衡的五种策略:
一、轮询(默认)
每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
二、指定权重
指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况。
upstream backserver {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
三、IP绑定 ip_hash
每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
四、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
五、url_hash(第三方)
按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
例子:
proxy_pass http://backserver/; upstream backserver{ ip_hash; server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载) server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大) server 127.0.0.1:6060; server 127.0.0.1:7070 backup; (其它全部的非backup机器down或者忙的时候,请求backup机器) }