随机
随机从服务器端地址选取一个来处理请求。 在统计学角度看,请求会分摊到各个服务器。 但是随机算法不会考虑服务器的性能和负载情况,不能充分利用异构服务器集群的性能。 另外,当后端服务器集群数量很大,使用随机算法,会导致客户端与多个服务器端建立连接、维护连接,产生额外的资源消耗。
优点:
- 简单
缺点:
- 没有考虑服务器负载和性能
源地址哈希法, IP hash
通常根据客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。 当服务器列表不变时,客户端每次都访问到相同服务器ip。减少要维护连接的数量。 如果服务器数量经常发生变化,可以使用一致性哈希算法,对服务器建立虚拟节点,减少客户端和服务器端连接漂移。
优点:
- 简单
- 在不支持会话保持的场景中,可以使用 ip_hash 实现简单的会话保持
缺点:
- 没有考虑服务器负载和性能
轮询, Round Robbin
太公分猪肉,人人有份。 请求依次发送到服务器列表调度处理。 因为要按顺序发送请求,显然是有状态的。不过从高可用的状态来看,这个状态即使丢失影响也不大,不需要额外持久化。
优点:
- 简单
缺点:
- 没有考虑服务器负载和性能
加权轮询, Weighted Round Robbin
给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载。 解决服务器间性能不一的情况,它用相应的权值表示服务器的处理性能。
然而加权轮询也不是银子弹。在请求服务时间变化较大或每个请求消耗时间不一致的情况下,容易导致服务器间的负载不平衡。 机器配置是静态的,负载是动态的。简单的RR实现,使用机器配置作为权重。 高级的RR实现,根据负载实现动态权重也是可行的,需要增加负载统计,向监控平台汇报metrics,定时更新权重。 另外,加权的实现要考虑权重的公约数问题,否则当权重的数值很大,会导致更新缓慢,具体以后再聊。
优点:
- 简单版本的RR实现相对简单。
- 考虑到机器性能差异。
- 适合大量短请求
缺点:
- 如果不考虑负载,在请求服务时间变化较大或每个请求消耗时间不一致的情况下,容易导致服务器间的负载不平衡。
- 如果考虑负载,则需要增加监控模块。
加权最小连接数, Weighed Least Connections
以连接数来衡量服务器负载情况。 通过服务器当前所活跃的连接数来估计服务器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器时,其连接数加一; 当连接中止或超时,其连接数减一。
优点:
- 适合长时处理的请求服务,如 FTP 等应用
小结
选择负载均衡算法,通常使用加权RR或者加权最小连接数。加权能够根据机器性能和负载分摊请求。 加权最小连接数适合长时间处理的请求。 加权轮询更加适合大量短时间的请求。