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