0%

消息队列之pulsar broker 集群的负载均衡

[TOC]

概述

sTdrdA.md.png

namespace, bundle, topic, broker.

例如,一个 namespace 有 4 个 bundle,100 个 topic,2 个 broker,那么这 100 个 topic,会均分到 4 个bundle里, 而这 4 个 bundle 又会均分到 2 个 broker 里。这是理想情况。

再例如,一个 namespace 有 4 个 bundle,1 个 topic,2 个 broker, 那么这 1 个 topic, 只会分配到一个 bundle 里,而这 1 个 bundle 也只会分配到 1个 broker 里。 这就负载不均衡了。这里的 1 个 topic, 也可以是有 100 个 topic, 但是其中一个 topic 的消息量特别大,其他 topic 的消息量特别小。所以对于消息量很大的 topic, 需要使用分区 topic。

In case of partitioned topics, different partitions are assigned to different brokers. Here “topic” means either a non-partitioned topic or one partition of a topic.

Pulsar broker集群负载均衡

Pulsar 是一个横向可伸缩的消息系统,其中一个核心需求是:一个合理的集群中的流量必须尽可能均匀地分布在所有可用的 Pulsar brokers 上。

您可以使用多种设置和工具来控制流量分布,这需要了解一些如何在 Pulsar 中管理流量的背景知识。 当然,在大多数情况下,上面提到的核心需求是开箱即用的,您不必担心。

Pulsar 负载管理体系架构

接下来的部分介绍了 Pulsar 负载管理器(load manager)的基本结构。

动态分配topic

  1. 当客户端开始使用一个新的topic的时候,topic会被分配到一个broker上面。
  2. 当一个broker crash,该broker上面的topic会被重新分配到别的broker上面
  3. 当一个broker过载过后,会分配部分topic到负载更低的broker上面
  4. 新加一个broker后,如果以前的broker的负载不到达一定的阈值,是不会分配老的topic到新的broker上的

In case of partitioned topics, different partitions are assigned to different brokers. Here “topic” means either a non-partitioned topic or one partition of a topic.

又因为 Brokers 的无状态特性,使得根据使用情况动态分配成为可能,如可以快速扩容或缩小集群规模。

分配粒度

topic的动态分配并不是在topic或者partition级别进行分配的。 而是在namespace的bundle级别进行分配。

一个bundle作为一个整体分配到不同的broker上面。

一个namespace可以配置为包含N个bundle,topic根据hash值分配到不同的bundle上面。

每个 bundle 都是独立的,因此会被独立的分配到不同的 broker。

创建命名空间和包

当你创建一个新的命名空间时,这个命名空间将使用默认的 bundle 数量。 您可以在 conf/brocher.conf 中设置此选项:

1
2
# 当命名空间创建时没有指定 bundle 数量时,将使用这个默认的值。
defaultNumberOfNamespaceBundles=4

你可以更改系统默认设置,或者在创建新的命名空间时指定这个值:

1
$ bin/pulsar-admin namespaces create my-tenant/my-namespace --clusters us-west --bundles 16

如上命令,创建命名空间时指定了 bundle 数量为16. 因此,这个命名空间里面的所有主题就可以分布到16个 broker 里面。

正常情况下, 应设置 bundle 数量大于 broker数量。因为主题是根据哈希自动分布到 bundle 里面的。 例如,命令空间内有1000个主题,可以使用比如 64 个 bundle ,让流量均匀的分布在 16 个broker上。

拆分命名空间

由于 bundle 中主题的负载会随着时间的变化而变化,或者在前期很难预测流量的变化。所以,broker 支持将一个 bundle 拆分为两个。 此时新建的 bundle 会被重新分配到其他的 broker。

默认情况下,新拆出来的 bundle 总是立刻分配到其他的broker,以平衡流量分布。

自动负载切分

Pulsar 的负载管理器支持自动的负载切分。 这意味着,当系统检测到某个 broker 过载时,系统会强制将一些流量自动分配到一些低负载的broker。

即当检测到 broker 过载时,broker 将强制 ”卸载“ bundle 的一些流量较大的子集,以降低 broker 的负载。

默认情况下,自动负载切分是启用的。 你能够通过如下配置项禁用自动负载切分:

1
2
# 启用/禁用自动负载拆分
loadBalancerSheddingEnabled=true

Broker 过载阈值

Broker 是基于 Cpu,网络,和内存使用的阈值来判断是否过载的。 当其中任何一个指标超过阈值时,将会触发切分操作(如果允许的话)。

默认情况下,负载阈值设置为85%:

1
2
# 使用阈值确定 broker 是否过载
loadBalancerBrokerOverloadedThresholdPercentage=85

Pulsar 会从系统中采集这些指标的使用情况。

总结

总体来说, pulsar 的负载均衡是在每一个 pulsar broker 参与实现的。在使用过程中,消费者和生产者关注 namespace 和 topic。在负载均衡器中, 新增加了一个 bundle 的概念。一个 namespace 下可以有 N 个 bundle, 这个 N 最好是 broker 集群节点的整数倍。topic 根据 hash 策略被分配到一个 bundle 上,一个 bundle 也对应了一个 broker。这样一个 topic 就始终由一个 broker 来代理。

正是由于以上的原因。所以推荐是使用分区 topic。

参考

官方doc:pulsar负载均衡