githubEdit

1. 配置

1.1 启用 AvgShedder

首先,毫无疑问,我会推荐使用 AvgShedder 作为卸载和放置策略。它是在所有可用选项中的最佳解决方案。要将 AvgShedder 配置为负载均衡算法,请设置以下配置:

loadBalancerLoadSheddingStrategy=org.apache.pulsar.broker.loadbalance.impl.AvgShedder
loadBalancerLoadPlacementStrategy=org.apache.pulsar.broker.loadbalance.impl.AvgShedder

需要注意的是,AvgShedder 在版本 3.0.63.2.43.3.1 中引入。因此,如果你使用的是早期版本,你需要将你的 Pulsar 版本升级到 3.0.6 或更高版本,如果你有代码cherry pick能力的话,可以将实现PR:[improve][broker] PIP-364: Introduce a new load balance algorithm AvgShedderarrow-up-right cherry pick到2.9以上的分支,因为我最开始就是给2.9分支开发的。

另外需要注意的是,在版本 3.0.6-3.0.73.2.43.3.1-3.3.2 中,AvgShedder 的配置名称存在冲突,你需要额外应用以下配置以避免冲突:

loadBalancerPlacementStrategy=org.apache.pulsar.broker.loadbalance.impl.AvgShedder

要检查配置是否成功,你可以扫描你的 leader broker 日志,查找以下日志:

log.info("brokerHitCountForHigh:{}, brokerHitCountForLow:{}", brokerHitCountForHigh, brokerHitCountForLow);

每当 AvgShedder 被触发时,都会打印此日志。如果你看到了这个日志,就表明 AvgShedder 已成功配置并正在运行。

为了简化操作,你可以直接在你的 broker.conf 文件中添加以下配置,以绕过兼容性问题:

loadBalancerLoadSheddingStrategy=org.apache.pulsar.broker.loadbalance.impl.AvgShedder
loadBalancerLoadPlacementStrategy=org.apache.pulsar.broker.loadbalance.impl.AvgShedder
loadBalancerPlacementStrategy=org.apache.pulsar.broker.loadbalance.impl.AvgShedder

1.2 调优 AvgShedder

AvgShedder 重用了 UniformLoadShedder 的一些配置,但这些配置的默认值并不适合 AvgShedder。你需要调整这些配置,以使 AvgShedder 能够更好地工作。以下是推荐的配置:

maxUnloadPercentage 设置为 0.5 意味着 AvgShedder 会识别出负载最高和最低的 broker,然后在这两个 broker 之间均匀分配流量,这是 AvgShedder 的核心概念。如果你将其设置为 0.2,AvgShedder 只会在最高负载和最低负载的 broker 之间分配 20% 的流量,因此无法达到最佳效果。

AvgShedder 引入了四个配置项,用于控制卸载和放置策略。这些配置项的默认值在大多数场景下都是适用的,但你可以根据需要进行调整。

AvgShedder 使用多次触发算法来处理负载波动,这意味着在最终触发 bundle 卸载之前,阈值需要被多次触发。例如,当一对 broker 之间的差异超过高阈值两次时,就会触发负载均衡。

在集群滚动重启或扩展时,不同 broker 之间往往存在较大的负载差异,因此我们希望更快地开始负载均衡。

因此,我们引入了两个阈值:

  • loadBalancerAvgShedderLowThreshold,默认值为 15

  • loadBalancerAvgShedderHighThreshold,默认值为 40

这两个阈值分别对应两个触发次数要求:

  • loadBalancerAvgShedderHitCountLowThreshold,默认值为 8

  • loadBalancerAvgShedderHitCountHighThreshold,默认值为 2

当一对 broker 之间的分数差异超过 loadBalancerAvgShedderLowThreshold 达到 loadBalancerAvgShedderHitCountLowThreshold 次,或者超过 loadBalancerAvgShedderHighThreshold 达到 loadBalancerAvgShedderHitCountHighThreshold 次时,就会触发 bundle 卸载。

例如,默认情况下,如果分数差异超过 15,则需要连续触发 8 次;如果分数差异超过 40,则需要连续触发 2 次。

loadBalancerAvgShedderLowThreshold 的默认值为 15,这意味着最高负载和最低负载的 broker 之间的负载差异范围将被限制在 15%。如果你希望达到更平衡的状态,可以降低这个值,例如设置为 10。然而,如果你设置得过小,可能会导致负载均衡机制被触发得太频繁,从而可能导致性能下降。

loadBalancerAvgShedderHitCountLowThreshold 的默认值为 8,这意味着当最高负载和最低负载的 broker 之间的负载差异超过 15% 达到 8 次时,就会触发负载均衡机制。增加这个值会使负载均衡机制更加稳定,但响应速度会更慢。

1.3 其他配置

1.3.1 资源权重

AvgShedder 重用了 ThresholdShedder 的资源权重配置,用于计算 broker 的分数。这些配置的默认值在大多数场景下都是适用的,但你可以根据需要进行调整。

将这些值设置为 0 意味着相应的资源不会被用于计算 broker 的分数。0-1 之间的值是有效的。这些配置的默认值如下:

在 4.0 版本之前,loadBalancerBandwidthInResourceWeight 的配置名称被拼写错误为 loadBalancerBandwithInResourceWeight,这一问题已通过 PIP-357: Correct the conf name in load balance modulearrow-up-right 修复。如果你使用的是早期版本并希望修改它,你应该使用 loadBalancerBandwithInResourceWeight 而不是 loadBalancerBandwidthInResourceWeightloadBalancerBandwidthOutResourceWeight 也存在同样的问题。

但我们仍然支持旧的配置名称以保持向后兼容性。

loadBalancerDirectMemoryResourceWeight 的默认值在版本 3.1.1 中被改为 0,这一改动通过 disable balancing based on DirectMemoryarrow-up-right 修复。如果你使用的是早期版本,建议将其设置为 0,因为直接内存使用率无法准确反映机器的实际负载。

loadBalancerMemoryResourceWeight 的默认值也在 disable balancing based on DirectMemoryarrow-up-right 中被改为 0。

为了简化操作,我建议你在 broker.conf 文件中添加以下配置,这样你就不必担心版本兼容性问题

1.3.2 不均匀分配 bundle

负载均衡器中有一个隐藏机制,它会强制均匀分配 bundle,这会严重与负载均衡算法冲突。

我强烈建议将此配置设置为 false,否则负载均衡算法将无法按预期工作。令人惊讶的是,这个配置既没有在官方文档中记录,也没有在 broker.conf 文件中记录,但默认值却被设置为 true。 即在 broker.conf 文件中添加以下配置:

Last updated

Was this helpful?