4.4 负载均衡调度算法
本节介绍负载均衡的另一个重要职责:“选择谁来处理用户请求”,也就是负载均衡器所采用的调度算法。
负载均衡调度算法是一个相对活跃的研究领域,从简单的随机选择,到更复杂的考虑各种延迟和后端负载状态的算法,笔者无法逐一展开,所以仅从功能和应用的角度简要介绍一些常见的负载均衡算法。
轮询均衡算法(Round-Robin):按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点是实现简单。轮询算法假设所有的服务器处理请求的能力都一样,调度器会将所有的请求平均分配给每个真实服务器。
最小连接均衡算法(Least-Connection):该算法中调度器需要记录各个服务器已建立连接的数量,然后把新的连接请求分配到当前连接数最小的服务器。
最小连接均衡算法特别适合于服务器处理时间不一致的场景。例如,当某些请求可能占用较长时间,而另一些请求很快就会完成时,最小连接算法可以有效避免某些服务器因处理大量复杂请求而过载。
一致性哈希均衡算法(Consistency Hash):将请求中的某些特征数据(例如 IP、MAC 或者更上层应用的某些信息)作为特征值来计算需要落在的节点。一致性哈希算法会保证同一个特征值的请求每一次都会落在相同的服务器上。
随机均衡算法(Random):此种负载均衡算法类似于轮询调度,不过在分配处理请求时是随机的过程。由概率论可以得知,随着客户端调用服务端的次数增多,其实际效果趋近于平均分配请求到服务端的每一台服务器,也就是达到轮询的效果。
以上算法假设的是所有服务器处理能力均相等,并不管服务器的负荷和响应速度。如果集群内各个服务器处理能力不一致呢?如服务器 A 每秒可处理 10 个请求,服务器 B 每秒可处理 100 个请求,不考虑服务器的处理能力的负载均衡算法,实际上是一种“伪均衡”算法。
考虑各个服务器的处理能力存在差异,负载均衡算法又有了对服务器“加权”的补充。
加权负载均衡算法增加了按权值高低分配的机制,权重较高的服务器处理更多的连接,从而保证服务器集群整体处于均衡状态。常用的加权负载均衡算法包括加权轮询(Weighted Round Robin)、加权最小连接(Weighted Least-Connection)和加权随机(Weighted Random)等,这里不再逐一介绍了。