githubEdit

1. 介绍

1.1 bundle

Pulsar的负载单元称为bundle,bundle可以理解为topic的容器,一个bundle能够包含多个topic,并且通过一致性哈希算法将topic名称映射至相应的bundle。

bundle是Pulsar支持百万topic分区的关键,它能将Pulsar对Zookeeper的压力降低几个数量级。

首先,每个broker对topic分区的所有权关系是通过在Zookeeper上面的一个临时节点来表示的,broker尝试获取topic的所有权时,就会在Zookeeper上面创建对应的临时节点,当broker下线时临时节点会自动删除,从而释放掉所有权。

如果不引入bundle,则每个topic分区都需要在Zookeeper上面对应一个临时节点,但是Zookeeper的QPS上限只有几万,而且不支持横向拓展,从而限制Pulsar的topic上限为只有几万。

引入bundle概念,只需要在Zookeeper上面建立bundle对应的临时节点,,每个bundle能容纳几十上百个分区,从而能将Zookeeper的压力降低几个数量级,支持百万级别的topic分区。

1.2 卸载策略与放置策略

所谓负载均衡其实很简单,大致分为两个步骤:

1. 将bundle从高载的brokerA身上卸载

2. 将卸载下来的bundle分配给低载的brokerB

分别对应了Pulsar的两个接口:

1. LoadSheddingStrategy 是卸载策略,负责识别高负载的broker,并将其承载的部分bundle unload下来,以降低负载。

2. ModularLoadManagerStrategy 是放置策略,负责将bundle分配给低载broker。

LoadSheddingStrategy 策略旨在卸载高负载的broker bundle,然而,为了确保集群负载均衡模块的高效运行,不仅需要正确地 “卸载” ,还必须恰当地 “放置” bundle。这两者是相辅相成的,它们之间的协调配合是至关重要的。在后续章节中,我们将深入探讨这一关键点。

另外,Pulsar还支持多种负载均衡器,默认使用的是ModularLoadManagerImpl,这篇文章也基于使用ModularLoadManagerImpl负载均衡器来展开。负载均衡器的作用包括搜集上报负载数据、执行卸载策略和放置策略等,一个良好的均衡效果离不开准确及时的负载数据信息,这里就先不展开了。

1.3 相关配置

首先,让我们了解一些配置,下面配置都建议使用默认值,这里仅作介绍以供学习之用。

  • loadBalancerEnabled

配置loadBalancerEnabled用来控制是否启用负载均衡器,要想使用负载均衡功能,必须把它打开。默认配置为true。

  • loadBalancerSheddingEnabled

要想启用LoadSheddingStrategy卸载策略,必须设置loadBalancerSheddingEnabled为true。

如果把它关闭了,则无法主动识别高负载broker了,只有在broker重启、broker扩缩容的时候才会执行bundle unload,然后借由放置策略ModularLoadManagerStrategy来分配bundle给broker,因此失去动态负载均衡的能力了。

  • loadBalancerSheddingIntervalMinutes

LoadSheddingStrategy策略的执行时间间隔由配置loadBalancerSheddingIntervalMinutes决定,默认为1min一次。

  • loadBalancerSheddingGracePeriodMinutes

在bundle unload的时候,该bundle包含的所有topic都会暂时不可用,直到bundle加载到新的broker上。因此bundle unload也是有代价的,负载切换期间bundle包含的topic都会不可用,出现秒级不可用时间。

为了避免同一个bundle频繁被unload,导致这些topic分区的流量频繁抖动,LoadSheddingStrategy策略在挑选候选卸载bundle集合的时候,会将刚卸载“没多久”的bundle先过滤掉,“没多久”由配置loadBalancerSheddingGracePeriodMinutes来决定,默认为30min。

  • loadBalancerLoadSheddingStrategy

配置loadBalancerLoadSheddingStrategy决定了使用哪个Shedding卸载算法,从2.10版本开始默认算法为ThresholdShedder。有四种可用算法:AvgShedder、ThresholdShedder、OverloadShedder、UniformLoadShedder。

  • loadBalancerLoadPlacementStrategy

放置策略ModularLoadManagerStrategy由配置loadBalancerLoadPlacementStrategy控制,默认使用LeastLongTermMessageRate。

实现的接口名为org.apache.pulsar.broker.loadbalance.ModularLoadManagerStrategy,有四种实现,但是一般不会考虑RoundRobinBrokerSelector,它是使用RoundRobin的方式来放置bundle,没有考虑真实的负载等指标。

Last updated

Was this helpful?