Pulsar bundle数目的选择

news2025/7/13 16:45:48

看到今年Pulsar 峰会上挺多人分享负载均衡的内容,这里也整理分享一下相关的内容。

实践中,我们都会

关闭 auto bundle split,保证系统稳定

Pulsar bundle split 是一个比较耗费资源的操作,会造成连接到这个 bundle 上的所有 producer/consumer/reader 连接断开并重连。一般情况下,触发 auto bundle split 的原因是这个 bundle 的压力比较大,需要切分成两个 bundle,将流量分摊到其他 broker,来降低这个 bundle 的压力。

触发 auto bundle split 时 broker 负载比较高,关闭这个 bundle 上的 producer/consumer/reader,连接就会变慢,并且 bundle split 的耗时也挺长,就很容易造成 client 端(producer/consumer/reader)连接超时而失败,触发 client 端自动重连,造成 Pulsar/Pulsar client 不稳定。

对于生产环境,我们的建议是:预先为每个 namespace 分配好 bundle 数,并关闭 auto bundle split 功能。如果在运行过程中发现某个 bundle 压力过大,可以在流量低峰期进行手动 bundle split,降低对 client 端的影响

关于预先分配的 bundle 数量不宜太大,bundle 数太多会给 ZooKeeper 造成比较大的压力,因为每一个 bundle 都要定期向 ZooKeeper 汇报自身的统计数据


 

bundle数目的选择--单个分区topic包含的所有分区研究

不推荐开启bundle拆分的功能,也就是创建namespace的时候就要确定bundle的数目。那么该如何确定bundle的数目呢?

根据一致性hash算法,显然bundles数目越多越有利于负载均衡,但是bundles数目太大,也会有不好的一面。

pulsar在实现负载均衡算法的时候,会搜集性能指标,如msg/sec、avg latency之类的,这些是以bundle level来统计的,如果bundle数目过多,则会增大计算metrics的开销,而且这些metrics存储在ZK metadata store上,也会增大存储和network io开销。

因此,不能太多bundles,那有没有一个规则来指导设置bundles数目呢?

分析:

·提高性能方面:pulsar设计分区topic是为了让同一个topic下的不同分区分别由不同broker服务,这样一个客户端同时由多个bundle来服务,从而提高单个topic的吞吐量,但是如果多个分区被分配到同一个bundle,那么这几个分区就只能由同一个broker来服务,也就没法达到预期的效果。

·负载均衡方面:提高bundles数目,显然是可以提高负载均衡的效果的,但是设置到多高的值才能说是收益大于成本呢?单个分区topic如果使用round-robin的路由模式,则该topic下的每个分区的流量是均匀的,则如果该topic每个分区都分配到不同的bundle, 再由一个理想的shedding算法使得这些bundle均匀地分配到brokers上,则brokers的负载就能达到理想的负载均衡状态。可见,bundles数目设置的上限值应该是大概率使得不同分区分配到不同bundle,再往高了取其实就没有收益了,而且一般也没必要取到这个上限值。

即,我们目标是想尽量让不同分区分进不同的bundle里,对应概率模型:把k个球随机均匀放进m个桶里(pulsar中的分配不是随机的,是对通过hash来分配的,这里做近似)

则k个球都放进不同的桶的概率为

 

令Pk=1/t,则 

令t=2,m=500,则k≈26,即当集群的bundles总数为500时,一个分区数为26的分区topic,它的所有分区分配到不同的bundle的概率为1/2,也即至少有一个分区与另一个分区放到同一个bundle的概率为1/2,肯定足够的。

 上面是,对单个分区topic包含的所有分区的分布情况进行研究,我们尽量避免多个分区分配到同一个bundle上。下面我们研究整个namespace的所有topic分区的分布情况,因为如果不同bundle上承载的分区数目差距过大,则可能造成超大、超小bundle情况的出现。

bundle数目的选择--整个namespace的所有topic分区

超大、超小bundle的出现会严重影响负载均衡管理器的工作。如下例,假设shedding算法确定要卸载100M流量,算法如果从大到小挑选bundle(一般都是这样的)。

- 如果出现超大bundle 200M,则卸载它很有可能导致新的owner broker超载

- 如果bundle的流量大小排序情况为 90 1 1 1 1 1 0.1 0.1 0.1 0.1 ... ,则会导致算法需要卸载很多超小bundle的问题,而这对负载均衡几乎没有收益。

当然,上面两个问题,都可以尝试在shedding算法里尝试处理应对,但是,如果集群bundle流量分布状况是均匀的话,也就没必要设计更麻烦的算法来解决了。

要避免超大、超小bundle的出现,则bundle数目不需要过多,也不能过少。比如说,

- 10000个topic分区的namespace,仅有10个bundles,任一bundle的体积都过大。

- 100个topic分区的namespace,有200个bundles,则肯定会有很多bundle没有流量,成为超小bundle。

 

 

 方差的意义为:将m个球投入n个格子,格子里的球数与平均球数的差距的平方的期望。取平方根则大致可表示不同格子里的球数差距的期望。要精准表示不同格子里的球数差距的期望,得求如下公式:

 

可见,如果namespace下topic分区为bundle数目的100倍的情况下,不同bundle之间的topic分区数目差距就开始明显有差距了。

看到峰会上有人推荐一个经验值:topic分区数是bundle数目的20倍,根据我们前面的研究,可以分析出这个经验值的效果:

即一个有100000分区的namespace,分配5000个bundles,则每个bundle上的分区数的期望为100000/5000=20,而大部分的bundle上的分区数处在[20-4.47168,20+4.47168]这个区间内,即最多与最少的差距是8个分区。

下面分析一个pulsar测试集群的数据,下图是测试集群的bundle流量分布图,可以看到bundle的流量大小集中分布在1-10M区间内,没有超大bundle的出现,但是有相当多的超小bundle,流量<0.1M几乎可以认为是没有流量

 

下图是集群某个namespcae下所有bundle服务topic个数的分布图

总共有1142个topic,467个bundles,按照前面的推导,期望为 

样本标准差s=1.3784,而根据前面理论推导的标准差为1.5621,可以看到样本的标准差更小了,数据偏差更小了。数据集中在[2.4454-1.3784 , 2.4454+1.3784]=[1.067,3.8238]这个范围内,即绝大部分bundle上有1~4个topic

因此,topic分配到bundle上是足够均匀了,但是由于不少topic本身没有流量,导致出现超小bundle的出现,这是无法避免的,是很常见的现象,因此我们需要在shedding算法处理好这些超小bundle即可

而超大bundle的出现是可以避免地,我们要保证大流量的topic的分区数要足够多避免出现超大分区的出现,从而导致超大bundle的出现

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP 物料分类账配置详解Part 1( 基于SAP S/4HANA1909 版本)

本文将详细介绍&#xff1a;SAP 物料分类账配置要点 &#xff0c;本系统使用的版本是&#xff1a; SAP S/4HANA1909 版本目录 1 物料分类账的后台配置 1.1 激活物料分类帐的评估区域 1.2 分配货币类型并定义物料分类帐类型 1.3 分配物料分类帐类型给评估范围 1.5 定义…

m基于MATLAB的通信系统仿真,包括信号源,载波信号,放大器,带宽滤波器,接收端包括放大器,带宽滤波器,载波解调,低通滤波器等

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 Interference : 200KHz Signal source: 需要在给出的一个excel 文档里调用&#xff0c;我对应的信号是第二竖栏&#xff0c;就是从B1到B60 里面所有的filter(滤波器)都是自己来选值&am…

驱动 私有数据传参点灯

1.在串口工具进行输入&#xff1a; echo 1 > /dev/myled0 ---->led1灯点亮 echo 0 > /dev/myled0 ---->led1灯熄灭 echo 1 > /dev/myled1 ---->led1灯点亮 echo 0 > /dev/myled1 ---->led1灯熄灭 echo 1 > /dev/myled2 ----…

243 h160 相交链表

题解 本题关键: acbbca // 243 h160 相交链表public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode pointAheadA,pointBheadB;int rount2;while (rount>0){if (pointApointB){return pointA;}pointApointA.next;pointBpointB.next;if (pointAnul…

【树莓派不吃灰】命令篇⑥ 了解树莓派Boot分区,学习Linux启动流程

目录1. Linux启动过程1.1 内核引导1.2 运行init初始化进程 —— 初始化系统环境1.3 运行级别 —— runlevel1.4 系统初始化 —— 加载开机启动程序1.5 用户登录1.5.1 方式1&#xff1a;命令行登录1.5.2 方式2&#xff1a;ssh登录&#xff08;常用&#xff09;1.5.3 方式3&#…

[附源码]计算机毕业设计JAVA恒星学院网络计费系统

[附源码]计算机毕业设计JAVA恒星学院网络计费系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

Lingo软硬件划分 实例

文章目录一、SM2 加密算法软硬件划分1.1 实验目标1.2 实验过程&#xff08;1&#xff09; 综合考虑使得系统整体性能最&#xff08;2&#xff09;只考虑硬面积&#xff0c;即系统硬件面积最小&#xff08;3&#xff09;只考虑功耗&#xff0c;即系统功耗最小&#xff08;4&…

SpringBoot实用开发篇复习4(实用开发篇完)

在上面一节&#xff0c;我们学习了SpringBoot整合第三方技术&#xff0c;这次我们主要学习监控技术&#xff0c;主要包含四个部分&#xff0c;分别为监控的意义&#xff0c;可视化监控平台&#xff0c;监控的原理&#xff0c;自定义监控指标等&#xff0c;下面一起来学习吧。 …

nodejs+vue+elementui前台美食网上订餐点菜系统 vscode项目

前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 系统分为不同的层次&#xff1a;视图层&#xff08;vue页面&#xff09;&#xff0c;表现层&#xff08;控制器类&#xff09;&#xff0c;业务层&#xff08;接口类&#xff09;和持久层…

SSM框架+LayUi+Mysql实现的物流配送管理系统(功能包含分角色,登录/注册、车辆管理/路线管理/运单管理/调度安排/信息管理等)

博客目录SSM框架LayUiMysql实现的物流配送管理系统实现功能截图系统功能使用技术代码完整源码SSM框架LayUiMysql实现的物流配送管理系统 本系统为了解决物流平台的配送难题&#xff0c;将司机/物流配送的整体流程话&#xff0c;便于物流公司的统一管理&#xff0c;提高了物流日…

JUC学习笔记——共享模型之内存

在本系列内容中我们会对JUC做一个系统的学习&#xff0c;本片将会介绍JUC的内存部分 我们会分为以下几部分进行介绍&#xff1a; Java内存模型可见性模式之两阶段终止模式之Balking原理之指令级并行有序性volatile原理 Java内存模型 我们首先来介绍一下Java内存模型&#xf…

博途1200PLC编码器速度信号采集和滤波处理

速度估算有M法和T法测速2种常用方法,工业控制PLC上基本采用M法测速,M法测速的详细原理,这里不再赘述。感兴趣的可以参看下面的文章链接: PLC通过编码器反馈值计算速度的推荐做法(算法解析+ST代码)_RXXW_Dor的博客-CSDN博客PLC如何测量采集编码器的位置数据,不清楚的可以…

spring框架源码十七、Bean对象创建子流程

Bean对象创建子流程Bean对象创建子流程new ClassPathXmlApplicationContextClassPathXmlApplicationContext#ClassPathXmlApplicationContext(java.lang.String)ClassPathXmlApplicationContext#ClassPathXmlApplicationContext(java.lang.String[], boolean, org.springframew…

冒泡事件在Vue中的应用

什么是事件冒泡&#xff1f; 一想到“冒泡”这两个词会想到什么&#xff1f;想必然&#xff0c;那就是气泡自下而上的从水底往上生的场景&#xff0c;但是我们也知道&#xff0c;水在往上升的过程中&#xff0c;也会经历不同的高度。由此场景&#xff0c;那么想必然&#xff0c…

JavaEE 进阶:Spring 核⼼与设计思想

文章目录一、Spring 是什么1、什么是容器2、什么是 IoC① 传统程序开发Ⅰ 轮胎尺寸固定a. 代码b. 缺陷Ⅱ 轮胎尺寸改变a. 代码b. 缺陷② 控制反转式程序开发Ⅰ 控制反转Ⅱ 需求增加Ⅲ 优点③ 对⽐总结规律3、理解 Spring IoC4、DI 概念说明一、Spring 是什么 Spring是当前Java…

Windows安装nginx

Windows安装nginx1.下载Nginx2.Nginx的使用2.1 修改nginx.conf2.2 启动nginx3.可能出现的问题观前提示&#xff1a; 本文所使用的系统Windows10。 1.下载Nginx Nginx官网&#xff0c;点击download下载 根据需求下载自己所需版本&#xff0c;这里我下载的是稳定版本 2.Nginx的…

链表

章节目录&#xff1a;一、链表1.1 概述二、单向链表2.1 实现思路2.2 代码示例三、双向链表3.1 实现思路3.2 代码示例四、单向环形链表4.1 约瑟夫问题4.2 实现思路4.3 代码示例五、结束语一、链表 1.1 概述 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元…

谷粒学院(一) 项目环境搭建

一、数据库设计 数据库设计规约 以下规约只针对本模块&#xff0c;更全面的文档参考《阿里巴巴Java开发手册》&#xff1a;五、MySQL数据库 1、库名与应用名称尽量一致 2、表名、字段名必须使用小写字母或数字&#xff0c;禁止出现数字开头&#xff0c; 3、表名不使用复数名…

idea导入springboot项目运行教程

前置要求 ①具备Java环境&#xff0c;并且可以通过Maven进行安装项目依赖&#xff1b; ②具备IntelliJ IDEA工具&#xff0c;推荐专业版&#xff0c;社区版也不影响&#xff1b; ③具备Mysql5.7或以上版本数据库&#xff1b; ④具备Navicat数据库可视化管理工具&#xff1b;…

力扣(LeetCode)14. 最长公共前缀(C++)

模拟 取出 strsstrsstrs 的第一个字符串 strs[0]strs[0]strs[0] &#xff0c; 遍历strs[0]strs[0]strs[0] &#xff0c; 依次比较所有串的当前位置的字符&#xff0c;是否和 strs[0]strs[0]strs[0] 的当前字符相同。 代码展示 class Solution { public:string longestCommon…