带你认识pulsar负载均衡利器Bundle

简介: 带你认识pulsar负载均衡利器Bundle

Pulsar是一款非常优秀的消息流平台,这篇文章主要讲Pulsar中Topic通过Bundle这个负载均衡利器在Broker中的分配。

1 Topic层级概念

首先看一下Pulsar的架构图,如下图:

微信图片_20221212210544.jpgPulsar的Broker可以管理一个或者多个Topic。Pulsar是一个多租户平台,多租户的特性体现在Topic是一个层级概念,Topic的URL如下图:

微信图片_20221212210622.png

一个Topic可以使用persistent属性指定是否持久化,而Topic的上层使用租户来进行权限隔离,使用Namespace来进行策略管理。

Topic的层级概念也可以用下图来表示:

微信图片_20221212210649.jpg

在一个公司内部的Pulsar集群中,可以根据业务部门建租户,根据业务部门内部的不同项目组来划分Namespace,根据每个项目组的不同业务单元来划分Topic。

2 Namespace Bundles

Pulsar把Namespace拆成了Bundle,Bundle是namespace的子集。如下图一个Namespace下面有6个Topic:

微信图片_20221212210709.png

我们把这个Namespace划分成四个hash区域,从0x00000000~0xffffffff,之后把6个Topic按照名字(上面URL图中的最后一部分)做Hash运算,分配到这四个区域内,如下图:

微信图片_20221212210731.png

上图中,Topic0做Hash运算后值落在了0xc0000000~0xffffffff这个区域,其他几个Topic也分别落到了自己的Hash区域。

为什么要为Namespace划分Bundle子集呢?因为Pulsar有自动负载均衡机制,会把繁忙的Broker里面的一些Topic迁移到比较空闲的Broker中,实现Broker直接的流量均衡。这个搬移如果直接搬移Namespace,会太重,比如上面的图需要一下子搬移6个Topic。如果以Topic为单位,每次搬移数据就会太小,而且搬移过程中需要保存大量Topic和Broker之间的元数据。有了Bundle后,以Bundle为单位进行迁移,迁移Topic会容易很多,比如上图中,一次迁移一个Bundle,有的包含一个Topic,有的包含两个Topic。

3 Broker分配Bundle

Broker集群启动过程中会在Zookeeper竞争创建临时节点,创建成功的成为Leader节点,叫Load Manager,这个节点会定期搜集其他Broker的服务状态,比如CPU、内存、网卡带宽利用率,这些指标都是临时数据,所以Leader节点并不会保存太多数据。

Leader节点会根据搜集到的负载情况为其他Broker节点分配Bundle。如下图:

微信图片_20221212210754.png


上图中Broker1竞争成为Leader,它负责为其他几个Broker分配Bundle。初始化时,每个Broker都没有Boundle,Leader把topic0分配给了Broker3,这就代表topic0所在的Bundle分配给了Broker3,之后Hash值跟topic0相同的都会落到这个Bundle。然后把topic1分配给了Broker2,这就代表topic1所在的Bundle分配给了Broker2。类似把其他2个Bundle分别分配给了Broker0和Broker1。

4 高可用

还是以上面的图为例,如果Broker0宕机了,Load Manager和ZK都能检测到broker0宕机,这时Load Manager会重新把Bundle(0x00000000~0x400000000)分配给其他三个broker,最后选择哪个broker取决于Load Manager收集到的每个broker的负载情况,会找一个负载最小的broker分配。如下图:

微信图片_20221212210816.png

如果Broker1宕机了,也就是Leader节点宕机了,那Broker0、Broker2和Broker3三个节点会去Zookeeper抢占注册临时节点,注册成功的成为新的Leader,新的Leader节点会把Broker1的Bundle分配给剩下的3个Broker。

5 客户端

Topic通过Bundle绑定了Broker之后,客户端就可以跟自己要访问的Broker建立长链接,如下图:

微信图片_20221212210837.png

这里需要注意:图中的第1、2两步既可以用HTTP的方式,也可以用TCP的方式,但是第3步也就是Broker跟client建立连接只能用TCP。

Pulsar为客户端提供了代理,客户端可以直接跟代理通信,如下图:

微信图片_20221212210859.png

6 总结

使用了Bundle,Pulsar可以方便地通过Load Manager节点做负载均衡,不用考虑一次搬移的Topic太多,也不用担心一次搬移一个Topic而需要保存太多元数据。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
消息中间件 存储 NoSQL
一文读懂Kafka Connect核心概念
Kafka Connect 是一种用于在 Apache Kafka 和其他系统之间可扩展且可靠地流式传输数据的工具。 它使快速定义将大量数据移入和移出 Kafka 的连接器变得简单。 Kafka Connect 可以摄取整个数据库或从所有应用程序服务器收集指标到 Kafka 主题中,使数据可用于低延迟的流处理。 导出作业可以将数据从 Kafka 主题传送到二级存储和查询系统或批处理系统进行离线分析。
|
消息中间件 存储 Kubernetes
kafka/pulsar on k8s
kafka/pulsar on k8s
kafka/pulsar on k8s
|
关系型数据库 MySQL 数据库
CDC YAML 在阿里云的最佳实践
本文撰写自阿里云开源大数据平台数据通道团队,主要介绍了 Flink CDC YAML 在实时计算Flink版的最佳实践。
836 4
CDC YAML 在阿里云的最佳实践
|
消息中间件 存储 Kafka
RocketMQ 工作原理图解,看这篇就够了!
本文详细解析了 RocketMQ 的核心架构、消息领域模型、关键特性和应用场景,帮助深入理解消息中间件的工作原理。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
RocketMQ 工作原理图解,看这篇就够了!
|
存储 自然语言处理 数据库
ClickHouse中的倒排索引能解决你什么问题?
ClickHouse中的倒排索引能解决你什么问题?
38556 3
ClickHouse中的倒排索引能解决你什么问题?
|
消息中间件 存储 Java
【干货】看看我司消息队列用啥,全网最接地气pulsar教程(含业务解耦demo源码)
本文介绍了Apache Pulsar消息队列系统的核心特性及其与其它消息队列的区别,通过Docker安装Pulsar及Pulsar Manager,并结合电商业务场景,对比了串行执行与使用Pulsar实现异步解耦的优势,最后通过Java代码示例展示了如何利用Pulsar解决实际业务问题。
1068 4
【干货】看看我司消息队列用啥,全网最接地气pulsar教程(含业务解耦demo源码)
|
网络协议 算法 Java
聊聊 Pulsar: Pulsar 分布式集群搭建
聊聊 Pulsar: Pulsar 分布式集群搭建
1933 1
|
消息中间件 Cloud Native Kafka
一文搞懂 Kafka consumer 与 broker 交互机制与原理
AutoMQ致力于打造下一代云原生Kafka系统,解决Kafka痛点。本文深入解析Kafka Consumer与Broker的交互机制,涉及消费者角色、核心组件及常用接口。消费者以group形式工作,包括leader和follower。交互流程涵盖FindCoordinator、JoinGroup、SyncGroup、拉取消息和退出过程。文章还探讨了broker的consumer group状态管理和rebalance原理。AutoMQ团队分享Kafka技术,感兴趣的话可以关注他们。
1315 3
一文搞懂 Kafka consumer 与 broker 交互机制与原理
|
API Apache 数据库
Flink CDC 3.0 正式发布,详细解读新一代实时数据集成框架
Flink CDC 3.0 正式发布,详细解读新一代实时数据集成框架
1237 32
|
存储 SQL 关系型数据库
数据仓库、数据湖、流批一体,终于有大神讲清楚了!
数据仓库,数据湖,包括Flink社区提的流批一体,它们到底能解决什么问题?今天将由阿里云研究员从解决业务问题出发,将问题抽丝剥茧,从技术维度娓娓道来:为什么你需要数据湖或者数据仓库解决方案?它的核心难点与核心问题在哪?如果想稳定落地,系统设计该怎么做?
5286 0