Pulsar 负载均衡与transaction_coordinator_assign

news2025/1/31 18:48:17

背景与现状

TC加载到哪个broker上取决于transaction_coordinator_assign-partition-${TC ID}分区加载到哪个broker上。

默认transaction_coordinator_assign有16个分区,因此默认有16个TC,我们需要根据集群机器/broker数目来设置合理的TC个数。
为了保证集群压力均衡,和为了提高服务可用性,我们需要让TC尽量均衡地打散到整个集群机器上,避免所有TC加载到某几台机器。

  • 可用性:比如说,如果16个TC都加载到两三台broker上,那么在集群滚动升级的时候,重启该broker就会导致大量TC同时不可用,这就会明显影响到客户端了。
  • 负载均衡:而且broker承载TC本身也会造成一定的资源消耗,如TC需要跟客户端、TB、TP进行协调,某个broker承载太多TC会导致该机器的负载过高。

transaction_coordinator_assign目前是属于pulsar/system namespace下面的。
目前我们是不对pulsar/system namespace的bundles执行load shedding的,即只会在第一次加载bundle的时候使用hash分配尽量均匀地在当前可用broker列表上均匀地分布,之后不会再对这些bundle进行shedding切换。除非该broker重启导致bundle被卸载,或者管理员执行amdin命令导致bundle被unload,从而触发bundle assign。

存在的问题

那么目前就会有如下问题:
因为broker滚动重启都是有一定时间间隔的,而且一般是一台broker恢复完再重启下一台。
如果集群一开始一台broker都没有在线,然后开始启动集群,那么就会导致所有TC都加载到第一个启动的broker上了
如下图,中间shutdown集群一段时间,然后启动集群,导致16个TC全部加载到broker1上面去了,后面broker2~broker5启动起来后,也不会分配到任何TC。
在这里插入图片描述
这个问题只在集群初启动时会出现,当集群是滚动重启升级时不会有问题,因为集群始终有大量的broker可用,能够保证transaction_coordinator_assign-partition-${TC ID}分区尽量均衡地分配到所有broker上。

要解决这个问题,目前来说也比较简单,集群启动完成后把broker1重启一下,这样所有TC就会重新加载到所有其他broker上了。
如下图:
在这里插入图片描述
还有一个case,举个例子:如果一开始集群broker个数为2,16个TC分配到这两个broker上,后续机器扩容到5台,那么类似地,TC不会分配到新加入的3台机器上。
同样地,对集群滚动重启一轮就没啥问题了。

动态负载均衡

关于是否对transaction_coordinator_assign进行动态负载均衡的分析
前面也说了,目前我们是不对pulsar/system namespace的bundles执行load shedding的。因此transaction_coordinator_assign是不会进行动态负载均衡的
那有必要做动态的负载均衡吗?

动态负载均衡肯定是有好处的,上面问题出现的根源就是无法适应集群加入新broker的情况

bundle负载度量

但是目前所有的负载均衡算法,在分配bundle的时候,都是根据bundle的流量吞吐、消息速率来估测(度量)它会造成多大负载。对于普通业务topic而言这是合适的,但是对于pulsar/system下面的bundle这是不合适的,因为transaction_coordinator_assign本身是没有流量的,transaction_coordinator_assign造成的负载是TC的运行本身
因为shedding算法一般都会从负载大到小挑选bundle执行unload,然后load到低负载broker上,因此在执行shedding时,pulsar/system下面的bundle基本都不会被挑选出来进行shedding,也就是说,开没开动态负载均衡都差不多

因此,就算要启用动态负载均衡,也应该要另起一套负载估测逻辑。那该如何估测呢?

首先,目前客户端在使用事务时,都是直接与所有TC建立链接,然后使用round robin模式挑选TC为它服务,比如说,先在TC 1创建事务txn1,下一次就在TC 2那创建事务txn2。

因此,理论上集群的每个TC造成的负载都是几乎相同的。因此我们可以用TC的个数来作为bundle的负载单位

broker负载度量

还有一个优先级的问题。比如说,broker1加载了所有TC,但是因为没加载什么业务流量,导致CPU负载(资源使用率,或者说scores)比较低,但是broker2、broker3一个TC都没加载,反而因为加载了大部分流量导致CPU负载比较高。
那么我们在分配TC的时候,应不应该把TC切换到broker2、broker3身上?
应该。因为我们可以先保证把TC均摊到三个broker身上,然后再使用原来的动态负载均衡算法把业务流量均衡好就行。

目前的负载均衡算法还使用BrokerData来对Broker本身的负载进行度量,也就是根据CPU负载等资源使用率来判定低载broker
因此我们在对TC进行负载均衡时,也需要更新broker负载的度量标准,新标准也很简单:TC的个数

至此,针对TC的动态负载均衡算法的框架已经搭好了,具体的实现算法就各显神通了。
参考AvgShedder的实现,下面举个例子:
对所有broker承载的TC个数进行统计排序得到一个queue,假设根据承载的TC个数对broker 进行编号,编号为broker1 ~ broker N,broker1承载最多的TC,broker N承载最少的TC。
计算broker1比broker2的TC个数差值M,则如果broker 1上面能找到满足下面条件的bundle:

  • 包含transaction_coordinator_assign-partition-${TC ID}分区的个数小于等于M
    那么就可以将该bundle切换到broker N上面。

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

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

相关文章

如何使用递归 Grep 命令在目录中搜索?

在 Linux 系统中,grep 是一个强大的文本搜索工具,可以用于在文件中查找指定的文本模式。当需要在目录及其子目录中搜索特定的文本时,可以使用递归 grep 命令来快速定位目标文件。本文将详细介绍如何使用递归 grep 命令来搜索目录中的文件。 递…

如何搭建第一个SpringBoot+MyBatis项目

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…

ChatGPT已能模仿任何写作风格,让你的自媒体快速起号

我认识的一两个技术大佬目前失业在家,压力不小。对于现在的就业市场来说,再找工作,高不成低不就。他们的薪资,一般企业无法承受,大厂岗位又在缩减。今年真正感受到了寒冬。 对于我们还有饭吃的程序员,现在不…

【Linux网络服务】Apache网页优化

Apache网页优化 一、网页压缩1.1网页压缩步骤 二、网页缓存三、隐藏版本信息五、Apache防盗链 一、网页压缩 在企业中,部署Apache后只采用默认的配置参数,会引发网站很多问题,换言之默认配置是针对以前较低的服务器配置的,以前的…

如何通过自学成为一名白帽黑客(网安工程师)

从事网络安全这么多年,总是会被问到很多奇奇怪怪的问题: 「叔叔,我Steam账号被盗了,能帮忙找回吗?我给你发红包」 「我的手机被监控了,生活和工作受到了严重影响,该怎么解决?」 「…

学会这两件事,让你在人生路上走得更远

人生,就是一场不断前行,没有退路的旅行,也是一场不断醒悟的过程。 看透,然后醒悟;放下,然后幸福。 有些事,看淡就好;有些人,看穿就行。 不管世事如何艰难,只要…

Compose也能开发iOS了,快来体验~

前言 在之前,我们已经体验了Compose for Desktop 与 Compose for Web,目前Compose for iOS 已经有尚未开放的实验性API,乐观估计今年年底将会发布Compose for iOS。同时Kotlin也表示将在2023年发布KMM的稳定版本。 届时Compose-jb KMM 将实…

腾讯云4核8G服务器12M带宽支持多少人访问?

腾讯云轻量4核8G12M服务器配置446元一年,518元12个月,腾讯云轻量应用服务器具有100%CPU性能,系统盘为180GB SSD盘,12M带宽下载速度1536KB/秒,月流量2000GB,折合每天66.6GB流量,超出月流量包的流…

解锁接口关联测试新技能!HttpRunner教你如何轻松搞定。

目录 前言: 一、安装HttpRunner 二、编写测试用例 三、运行测试用例 四、实现接口关联测试 五、总结 前言: 在接口自动化测试中,一个常见的场景就是需要对多个接口进行关联测试,例如登录后获取token,再利用token…

如何自学黑客?零基础自学黑客需要多久?

问题一:黑客如何学起? 必须从学习者的角度来看,如果你是一个已经学过编程,通晓几门语言的人那么这个答案就会和一个从没有接触过的计算机,甚至连什么叫高级语言还不知道的人有所区别的对待。 这就像是登珠穆朗玛峰一…

ARM实验5-流水灯仿真实验

一、实验名称:流水灯仿真实验 二、实验目的: 掌握ARM处理器的输入输出接口。掌握通过MDK提供的仿真功能,实现系统的仿真运行。通过该编程实验,进一步巩固和强化学生ARM汇编编程的能,ARM应用程序框架,培养…

chatgpt赋能python:Python中的主函数调用其它函数

Python中的主函数调用其它函数 Python语言是一种高级编程语言,它被广泛应用于大数据处理、人工智能、数据分析、网络编程以及Web开发等领域中。在Python中,我们可以使用函数来封装复杂的业务逻辑,使代码更加可读、可维护和可扩展。在本文中&…

基于docker部署testlink并集成mantis

使用docker pull命令拉取需要的镜像。由于testlink和mantis都需要存储相关数据,所以这里可以看到还拉取了一个mysql镜像。 # docker pull bitnami/testlink:1.9.16-r8 # docker pull vimagick/mantisbt # docker pull mysql:5.7.20 使用docker network命令中创建…

Flutter重构开发

最近学习了flutter技术,然后用flutter技术重构了线上项目的首页板块,较深入的理解flutter的状态管理和ui组件的使用,总结下遇到的几点问题。 - 使用gex的controller报错 Don’t use one refreshController to multiple SmartRefresher,It w…

2021年长三角高校数学建模竞赛B题锅炉水冷壁温度曲线解题全过程文档及程序

2021年长三角高校数学建模竞赛 B题 锅炉水冷壁温度曲线 原题再现: 在燃煤发电过程中,锅炉是一种重要的热能动力设备。它通过在炉膛中燃烧煤粉释放热量,将水加热成一定温度(或压力)的蒸汽,蒸汽再推动汽轮机…

C4d渲染农场的定义、应用领域和未来发展趋势

Cinema 4D(C4D)是一款常用于3D动画、建模和渲染的软件,由Maxon Computer开发。随着CG行业的不断发展和应用场景的多样化,C4D渲染农场成为了CG制作中不可或缺的一环。本文将深入介绍C4D渲染农场的概念、特点、应用以及未来发展趋势…

信创办公–基于WPS的EXCEL最佳实践系列 (规整数据摆放)

信创办公–基于WPS的EXCEL最佳实践系列 (规整数据摆放) 目录 应用背景操作步骤1、数据排序2、例如:职务按照 经理-主任-职员 排序3、排列第二种方法4、实操案例5、案例练习一方法一:通过公式函数增加辅助列方法二:用辅…

二分查找笔记

1.1 什么是算法? 定义 在数学和计算机科学领域,算法是一系列有限的严谨指令,通常用于解决一类特定问题或执行计算 In mathematics and computer science, an algorithm (/ˈlɡərɪəm/) is a finite sequence of rigorous instructions, …

IO多路转接之select

本文分享的是IO多路转接中的select,其中包括select函数如何去使用,以及使用相关代码实现客户端向服务端发送消息的服务,从而更好地理解多路转接的select。 多路转接 多路转接是IO模型的一种,这种IO模型通过select函数进行IO等待&…

AI浪潮再掀低代码开发热,快来了解最新趋势!

在近些年的发展中,人工智能 (AI) 已融入我们社会和生活的方方面面。从聊天机器人和虚拟助手到自动化工业机械和自动驾驶汽车,我们已经越来越离不开AI技术了,哪怕是我们的日常生活中也充满了它的影子,我们很难忽视它的影响。 AI时代…