背景
在整个大环境的降本增效的熏陶下,我们也不得不做好应对方案。
根据对线上流量、存储以及系统资源的占用,发现我们的 Pulsar 集群有许多的冗余,所以考虑进行缩容从而减少资源浪费,最终也能省一些费用。
不过在缩容之前很有必要先聊聊扩容,Pulsar 一开始就是存算分离的架构(更多关于 Pulsar 架构的内容本文不做过多介绍,感兴趣的可以自行搜索),天然就非常适合 kubernetes 环境,也可以利用 kubernetes
的能力进行快速扩容。
扩容
Pulsar 的扩容相对比较简单,在 kubernetes 环境下只需要修改副本即可。
Broker
当我们的 broker 层出现瓶颈时(比如 CPU、内存负载较高、GC 频繁时)可以考虑扩容。
计算层都扩容了,也需要根据流量计算下存储层是否够用。
如果我们使用的是 helm 安装的 Pulsar 集群,那只需要修改对于的副本数即可。
broker:
configuration
component: broker
replicaCount: 3->5
当我们将副本数从 3 增加到 5 之后 kubernetes 会自动拉起新增的两个 Pod,之后我们啥也不需要做了。
Pulsar 的负载均衡器会自动感知到新增两个 broker 的加入,从而帮我们将一些负载高的节点的流量迁移到新增的节点中。
Bookkeeper
在介绍 bookkeeper 扩容前先简单介绍些 Bookkeeper 的一些基本概念。
Ensemble size (E):当前 Bookkeeper 集群的节点数量
Write quorum size (QW):一条消息需要写入到几个 Bookkeeper 节点中
ACK quorum size (QA):有多少个 Bookkeeper 节点 ACK 之后表示写入成功
对应到我们在 broker.conf
中的配置如下:
managedLedgerDefaultEnsembleSize: "2"
managedLedgerDefaultWriteQuorum: "2"
managedLedgerDefaultAckQuorum: "2"
这个三个参数表示一条消息需要同时写入两个 Bookkeeper 节点,同时都返回 ACK 之后才能表示当前消息写入成功。
从这个配置也可以看出,Bookkeeper 是多副本写入模型,适当的降低 QW 和 QA 的数量可以提高写入吞吐率。
大部分场景下 Bookkeeper 有三个节点然后 E/QW/QA 都配置为 2 就可以满足消息多副本写入了。
多副本可以保证当某个节点宕机后,这个节点的消息在其他节点依然有存放,消息读取不会出现问题。
那什么情况下需要扩容 Bookkeeper 了,当然如果单个 Bookkeeper 的负载较高也是可以扩容的。
但我们当时扩容 Bookkeeper 的场景是想利用 Pulsar 的资源隔离功能。
因为有部分业务的消息量明显比高于其他的 topic,这样会导致某个 Broker 的负载较高,同时也可能影响到其他正常的 topic。
最好的方式就将这部分数据用单独的 broker 和 Bookkeeper 来承载,从而实现硬件资源的隔离。
这样的需求如果使用其他消息队列往往不太好实现,到后来可能就会部署多个集群来实现隔