一、静态算法(不考虑后端真实服务器的负载情况,按算法该谁就分配给谁)
1.rr(RoundRobin)轮询算法
算法原理:将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载
举例:就像在食堂打饭,有三个打饭窗口。学生们排成一队从餐厅门口进入食堂,依次到第一个窗口、第二个窗口、第三个窗口打饭,后面的学生再从第一个窗口循环,每个窗口平等地接待学生,不考虑每个窗口当前打饭的人数多少(不考虑请求复杂度)。
算法缺点:缺乏负载考量
若不同请求的处理时间差异较大,该算法无法根据请求的复杂程度合理分配,可能造成某些服务器上长时间运行复杂请求,而其他服务器处理简单请求却空闲
2.wrr(weight RR)加权轮询
算法原理:根据真实服务器的不同处理能力来设定不同的调度权重,处理能力强的服务器分配更高的权重,能处理更多的请求
举例:有三个快递员负责一个片区的快递派送。快递员A经验丰富、效率高,设定权重为3;快递员B和C相对较慢,权重为2和1。当有新的快递任务时,按照权重比例分配,比如先给A派3个快递任务,再给B派2个,接着给C派1个,然后重复这个分配顺序。(对应服务器不同性能)
算法缺点:动态变化适应力差
当服务器的性能状态发生动态变化(如硬件故障导致性能下降)时,权重无法及时自动调整,仍按照原有设定分配请求,影响整体性能。
3.SH(source hashing)源IP地址hash,实现session 绑定
算法原理:根据请求的源IP地址,通过hash将源IP地址映射到特定的服务器上。可以保证同一源IP的请求总是被发送到同一台服务器上
缺点:单点故障、负载不均衡
将同一源地址的请求固定分配到一台服务器上,如果该服务器出现故障,这些请求将无法得到处理,导致服务中断。如果某些源地址的请求量非常大,而其他源地址请求量较少,会导致分配到大量请求的服务器过载,而其他服务器空闲,造成负载不均衡。
4.DH(destination Hashing) 目标地址hash
算法原理:根据请求的目标IP地址,通过hash将目标IP地址映射到特定的服务器上。如果该服务器可用且未超载,就将请求发送到该服务器,否则返回空。
例子:就像一个大型仓库,根据货物的目的地地址,通过特定的编码规则将货物分配到对应的货架区域。比如,目的地是北京的货物,通过散列计算后总是分配到A货架区域,只要A货架区域有空间且正常运作,就将货物存放到那里。
缺点:负载不均衡、灵活性差
根据目标地址散列分配请求,可能导致某些服务器接收到的请求数量过多,而其他服务器请求数量过少,无法实现负载的均衡分配。一旦目标地址与服务器的映射关系确定,就难以根据服务器的实际负载情况进行动态调整
二、动态算法(须考虑后端真实服务器的负载情况)
1.最少链接调度(Least Connections,LC)
算法原理:通过监控每台服务器当前的活动连接数,将新的请求分配给当前活动连接数最少的服务器。Overhead=activiteconns(活动连接数)x256+inactiveconns
举例:在银行办理业务,有三个服务窗口(RS)。当有客户来办理业务时(请求),大堂经理(LVS)会观察每个窗口正在办理业务的客户数量,将新客户引导到当前办理业务人数最少的窗口,以减少客户的等待时间
缺点:忽略服务器处理能力
仅依据活动链接数分配请求,没有考虑服务器本身的处理能力。一台处理能力弱但当前链接数少的服务器可能被分配新请求,而处理能力强但链接数稍多的服务器却得不到请求,导致整体效率不高。
2.加权最少链接调度(Weighted Least Connections,WLC)加权最少链接调度(Weighted Least Connections,WLC)
算法原理:在最少链接调度的基础上,结合服务器的权重值,计算每台服务器的有效连接数(活动连接数除以权重),将请求分配给有效连接数最少的服务器。Overhead=(activeconns+inactiveconns)x256/weight
举例:有三个停车场,停车场1容量大、车位多(权重高),停车场2和3容量较小(权重低)。当有车辆要停车时,会根据每个停车场当前的停车数量以及其容量(权重)来决定停放位置。计算每个停车场的“有效停车数”(当前停车数除以权重),将车辆停放到“有效停车数”最少的停车场。
缺点:计算复杂度增加、权重与实际负载匹配问题
虽然引入了权重,但权重和服务器实际处理能力之间的匹配难以做到精准。如果权重与实际能力不符,会影响负载分配的合理性,并且需要计算每台服务器的有效连接数(活动连接数除以权重),增加了算法的计算复杂度,在大规模集群中可能会影响调度效率。
3.基于局部性的最少链接调度(Locality - Based Least Connections,LBLC)
算法原理:主要用于缓存服务器集群,将请求发送给具有相同内容服务器的集群节点中连接数最少的服务器。如果集群中没有该内容的服务器,就按照最少链接算法分配到某个节点,并将该内容缓存到这个节点上。
举例:在一个大型图书馆,有多个书架管理员负责不同区域的书籍借阅。当读者要借阅某本特定的书时,系统会先查找哪个管理员负责的区域有这本书,并且在这些有该书的管理员中,选择当前服务读者数量最少的管理员来为该读者服务。如果所有区域都没有这本书,就按照类似最少链接的方式分配一个管理员去处理,并将这本书添加到该区域的馆藏中。
缺点:适用场景有限
主要适用于缓存服务器集群,对于其他类型的服务器集群,该算法的优势无法充分发挥
4. 带复制的基于局部性最少链接调度(Locality - Based Least Connections with Replication,LBLCR)
算法原理:当请求的内容不在本地节点时,根据局部性原理,从其他节点中挑选一台连接数最少的节点,将请求发送给它,并且把该内容复制到本地节点上。如果所有节点都没有该内容,就按最少链接原则分配
举例:在一个连锁超市的库存管理系统中,每个分店相当于一个节点。当某个分店接到顾客对特定商品的订单,而该分店没有此商品库存时,系统会查找其他分店是否有该商品,并在有该商品的分店中选择当前订单处理量最少的分店进行调货,同时将该商品信息记录到本分店的库存系统中。如果所有分店都没有该商品,就按照类似最少链接的方式分配一个分店去采购该商品。
缺点:数据一致性难题、资源消耗较大
在不同节点间复制内容时,需要保证数据的一致性。如果复制过程中出现错误或延迟,可能导致不同节点上的数据不一致,影响服务的准确性。且内容的复制操作会占用额外的网络带宽和存储资源,增加了系统的开销。
5.最短期望延迟调度(Shortest Expected Delay,SED)
算法原理:结合服务器的权重和当前活动连接数,计算每个服务器的期望延迟时间,将请求分配给期望延迟时间最短的服务器。Overhead(负载)=(activiteconns+1+inactiveconns)x256/weight
举例:有三个出租车司机在机场等待乘客。每个司机的服务效率(类似权重)不同,而且当前已经搭载的乘客数量(活动连接数)也不同。调度系统会根据司机的服务效率和当前乘客数量,计算出每个司机接下一个乘客的期望等待时间,将新乘客分配给期望等待时间最短的司机(overhead最小的服务器)。
缺点:对参数敏感、产生过载
当某一台服务器weight值足够大时,计算出来的overhead较小会使得调度到该服务器上的请求较多,增加负载压力,产生过载
6.永不排队调度(Never Queue,NQ)
算法原理:如果有服务器的当前活动连接数为0,则直接将请求分配给该服务器(第一轮先均分访问请求)后续采用最短期望延迟调度算法(SED)
举例:在一家咖啡店,有三个咖啡师。当有顾客点单时,如果某个咖啡师当前没有在制作咖啡(活动连接数为0),就直接将订单分配给这个空闲的咖啡师。如果三个咖啡师都在忙碌,就按照最短期望延迟的方式,根据咖啡师的制作速度和当前订单数量,将订单分配给最有可能最快完成订单的咖啡师。
缺点:整体优化不足
该算法主要关注避免单个请求排队,可能忽视了整体系统的负载均衡和性能优化,无法从全局角度实现最优调度。