githubEdit

3. 策略选择

根据前面的这些分析,虽然我们有三种卸载策略和两种放置策略,可以产生3*2=6种组合,但其实我们只有两种比较推荐的选择:

  • ThresholdShedder + LeastResourceUsageWithWeight

  • UniformLoadShedder + LeastLongTermMessageRate

这两种选择各有优缺点,读者可根据场景需求自行选择,下面表格总结了两种选择的优缺点:

这两种选择均具有各自的优势与不足,读者可依据下面表格和具体的场景需求自主进行选择。

策略

适应异构环境

(适应性)

适应负载抖动

(稳定性)

过度加载问题

(正确性)

过度卸载问题

(正确性)

负载均衡速度

ThresholdShedder + LeastResourceUsageWithWeight

一般1

一般3

UniformLoadShedder + LeastLongTermMessageRate

2

一般4

可以看到:

  1. 在适应异构环境方面,ThresholdShedder + LeastResourceUsageWithWeight 的表现只能评为一般。原因在于,ThresholdShedder 并非能完全适配异构环境。尽管它不会将高负载的 broker 错误判定为低负载,然而异构环境依然会对 ThresholdShedder 的负载均衡成效造成影响。

    比如说,当前集群存在三台broker,资源使用率分别为10,50,70,broker1、broker2同构,broker3上面是空载,但是因为部署了其他进程,导致它资源使用率达到70。此时我们会希望broker3分摊部分压力给broker1,但是由于平均负载为43.33,43.33+10>50,因此不会判定broker2为超载,而超载的broker3也没有流量可以卸载,从而使得负载均衡算法处于无法工作的状态。

  1. 在同样的场景下,若采用 UniformLoadShedder 与 LeastLongTermMessageRate 的组合,问题将更为严峻。这会致使部分负载从 broker2 转移至 broker3,进而使得 broker3 所服务的topic 均出现显著的性能下滑,故而适应性评定为差。

    因此,不建议将Pulsar运行在异构的环境下,当前的负载均衡算法都无法很好地适应。

  1. 在负载均衡速度层面,尽管 ThresholdShedder + LeastResourceUsageWithWeight 能够一次性卸下所有高负载 broker 的负荷,然而,鉴于历史权值算法会对负载均衡决策的准确性产生严重干扰,实际上它需要经过多次负载均衡操作才能最终趋于稳定,故而其负载均衡速度得分仅为一般水平。

  1. UniformLoadShedder + LeastLongTermMessageRate 由于一次仅能处理一个超载的 broker,所以当 broker 数量较多时,完成负载均衡所需的时间较长,因此负载均衡速度得分也是一般

上面这些结论我都通过实验进行了验证,感兴趣的读者可以查看AvgShedder的PR内容,我将实验的过程和结果都贴在PR里面。

[improve] [pip] PIP-364: Introduce a new load balance algorithm AvgShedderarrow-up-right

Last updated

Was this helpful?