本文仅仅是总结LVS和nginx中常使用的负载均衡调度算法
LVS:
轮询(RR):按一次循环的方式将请求调度到不同的服务器上。轮询算法假设所有的服务器处理请求的能力都一样,调度器会将所有的请求平均分配给每个真实服务器
加权轮询(WRR):LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是A的两倍
最小连接(LC):把请求调度到连接数量最小的服务器上
加权最小连接(WLC):给每个服务器一个权值,调度器会尽可能保持服务器连接数量与权值之间的平衡
基于局部性最少的连接(lblc):根据请求的目标IP寻找最近该目标IP地址所使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其他可行的服务器
带复制的基于局部性最少连接(lblcr):记录的不是一个目标IP与一台服务器之间的连接记录,它会维护一个目标IP到一组服务器之间的映射关系,防止单点服务器负载过高
目标地址散列调度(DH):通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标IP的请求会固定发给该服务器
源地址散列调度(SH):根据源地址散列算法进行静态分配给固定的服务器资源
nginx的upstream模块调度算法:
静态
轮询(rr):同上权重轮询(wrr):同上
ip_hash(静态调度算法):每个请求按客户端IP的哈希结果分配,当新的请求到达时,先将其客户端的IP通过哈希算法哈希出一个值,在随后的请求中,客户IP的哈希值只要相同,就会被分配至同一台服务器,该调度算法可以解决动态网页的session共享问题。但有时会导致请求分配不均,因为国内大多数公司都是NAT上网模式,多个客户端对应一个外部IP,所以这些客户端会被分配到同一节点服务器,从而导致请求分配不均
动态fair(动态调度算法):此算法会根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配;Nginx本身不支持fair调度算法,必须下载upstream_fair模块才行
此算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求;
least_conn:根据后端节点的连接数来决定分配情况,哪个机器连接数少就分发
url_hash:根据访问URL的hash结果来分配请求,让每个URL定向到同一个后端服务器;后端服务器为缓存服务器时效果显著
一致性hash:一般用于代理后端业务为缓存服务,如Squid、Memcached 等的场景;
一致性hash可以解决后端某个或几个节点宕机后,缓存动荡最小
nginx不支持,但是Tengine支持