腾讯云上基于 Apache Pulsar 的大规模生产实践
导语
Pulsar Meetup 2024 北京站已经成功落下帷幕。在本次盛会中,腾讯云的高级工程师韩明泽和王震江为与会者带来了精彩的演讲。他们围绕多网接入、集群迁移以及高可用最佳实践这三大核心议题,深入剖析了《腾讯云上基于 Apache Pulsar 的大规模生产实践》,为听众呈现了一场知识与经验交织的盛宴。
作者介绍
王震江
腾讯研发工程师,负责腾讯云 TDMQ for Apache Pulsar 商业化开发,开源社区爱好者
韩明泽
腾讯高级工程师,负责腾讯云 TDMQ for Apache Pulsar 商业化开发
拥有7年消息队列开发经验,熟练掌握 Pulsar、 Kafka、RocketMQ 等主流消息队列
Apache Pulsar/BookKeeper/Zookeeper contributor,RoP maintainer
多网络接入
网络介绍
云环境中,我们常遇到三种网络类型:内网、VPC(虚拟私有云)以及公网。若 VPC 和公网需要访问集群,则必须通过网络寻址功能实现 IP 映射,从而打通这些网络。在以往的方案中,这一步骤是通过 AdvertisedListeners+ListenerName 来完成的,它负责将每个 IP 映射文件存放在 Broker 集群里。
然而,这种方法带来了三个显著的问题。
首先,配置过程变得相当复杂。由于每个接入点都对应一个 IP 映射,随着接入点的不断增加,这些映射文件会变得异常庞大,管理起来极为不便。同时,每个 Broker 所对应的文件可能并不一致,这进一步加剧了配置的复杂性。
其次,这种架构导致了职责的混淆。Broker 本应专注于消息的收发过程,但在此架构下,它还需承担网络寻址的职责,这使得其职责变得模糊不清。
最后,这种方法的维护成本也相对较高。配置文件频繁变动,修改起来既麻烦又容易出错。而且,如果不同节点之间的数据不一致,导致整体维护难度很大。
路由寻址
针对上述挑战,我们创新性地提出了路由寻址方案。这一改进方案的核心在于引入 LookupService 来执行路由寻址任务,通过数据库,集中管理和维护网络映射和寻址信息。
路由寻址方案带来了四大显著优势:
● 架构简化:从下图可以看出,整个系统结构更加简洁明了,避免了不必要的复杂性。
● 职责明确:在此方案下,Broker 得以专注于其核心任务——消息的收发,而无需再承担网络寻址的职责,实现了有效的解耦。
● 运维便捷:运维团队只需专注于管理工作,无需与 Broker 进行繁琐的交互,从而大大降低了运维成本和复杂性。
● 扩展性强:这一优势在多集群管理或集群迁移时尤为明显,它确保了业务的稳定性和连续性,为系统的未来发展奠定了坚实基础。
综上所述,路由寻址方案的提出,不仅有效解决了原有方案中的问题,还带来了诸多优势,为系统的优化和升级提供了有力支持。
集群迁移
产品形态
TDMQ Pulsar 主要有三种典型的产品形态。
第一种是 Broker 共享,Bookie 共享,这种的产品形态成本比较低,但是存在一些问题,主要面临隔离性问题和稳定性问题。
第二种是 Broker 独占,Bookie 独占,这种形态下,计算层、存储层资源独占。这种形态优点是隔离性好,缺点是成本相对较高
第三种是 Broker 独占,Bookie 共享。这种形态综合考虑了稳定性和成本,算是一种折中的方案。
三种形态并无明显的优劣之分,更多的是要结合实际的应用场景做出选择。
整体架构
我们最初采用的都是共享的产品形态。但是,随着用户规模增加,对产品的稳定性提出更高的要求,共享形态并不能很好的满足业务的诉求。他们需要从共享模式迁移到更为适合的后两种模式。这时,集群迁移问题便随之而来。为了应对这一挑战,我们精心设计了集群迁移方案,该方案主要包含以下四个关键步骤:
● 元数据同步
● 数据同步(GEO)
● 订阅进度同步(GEO+补偿)
● 切换集群(Unload+寻址调整)
订阅进度说明
整体的集群迁移实现逻辑比较简单。主要的难点在于订阅进度的同步上。
在使用社区 GEO 方案进行订阅进度同步时,我们发现存在一些问题。GEO 中的订阅进度只会同步 MarkDeletePosition,这样,会导致订阅进度并不完整。因为 Pulsar 中,订阅进度是由两部分组成的。这意味着,在实际迁移的过程中,用户可能会遇到消息大量重复处理的情况。
进度同步
为了解决集群迁移过程中可能出现的消息重复消费问题,我们创新性地提出了一个补偿方案。
1、 我们会在同步消息到目标集群的时候,在消息的元数据中,携带原集群的消息 ID。
2、 我们会将原集群中的订阅进度(MarkDeletePosition和IndividuallyDeleteMessages)同步到目标集群。
3、 当消费者迁移到目标集群后。在目标集群中,读取消息之后,如果消息是来自原集群,那我们将原集群中的消息 ID 和原集群的订阅集群进行比对,如果判断消息已经在原集群中消费完成,我们就将消息过滤掉,不再投递给消费者。
通过上面的机制,我们有效解决了消费进度同步不完整的问题。
高可用最佳实践
如今,公司对 TDMQ Pulsar 集群的基本要求已经远远超越了单点故障的防范,而是至少需要具备可用区级别的容错能力。更进一步,对集群能力乃至跨地域能力的需求也日益增长。
在此,我们将重点聚焦于可用区维度的探讨。特别是在存储层面,副本的分布策略显得尤为重要。
可用区容灾
在高可用存储系统中,副本分布是确保数据可靠性和系统稳定性的关键环节。其中,机架感知和跨可用区分布是副本分布策略的重要方面。
机架感知
机架感知是指系统能够识别并感知到不同服务器所在的机架,从而在分配副本时尽量将副本分散到不同的机架上。这样做的好处是,当某个机架出现故障时,其他机架上的副本仍然可用,保证了数据的可靠性和系统的稳定性。
跨可用区分布
跨可用区分布是指将副本分散到不同的可用区(如不同的地理区域或数据中心)。这样做可以进一步提高数据的可靠性和系统的容错性。当某个可用区出现故障时,其他可用区上的副本可以接管并提供服务,确保系统的持续运行。
在实现跨可用区分布时,通常需要配置相关的参数来开启机架感知和跨可用区分布功能。这些配置通常包括指定副本的数量、分布方式以及可用区的选择等。
注意事项
尽管副本分布策略可以显著提高系统的可靠性和稳定性,但在实际执行过程中,仍需注意以下几点:
● 副本恢复过程的数据保证
在副本恢复过程中,需要保证剩余的副本数量大于等于w-a+1(w是写副本数,a是确认副本数)。这是为了确保在恢复过程中,即使出现部分副本丢失或不可用的情况,仍然有足够的副本可以恢复数据,保证数据的不丢失和高可靠性。
● 处理数据堆积和读取策略
在某些情况下,可能会出现数据堆积和读取策略不当的问题。例如,当某个副本节点出现故障时,如果是读堆积消息,可能会导致读取速度变慢。因为读取的时候,默认是轮询读取每个副本节点,当读取到故障节点的时候,会出现超时的情况,造成读取性能明显下降。为了解决这个问题,可以优化读取策略或开启粘性读开关,使系统在选择读取节点时更加智能和高效。
最佳实践
在3可用区和2可用区下,既能满足数据高可靠,又能满足服务可用性的部署形态。
地域容灾
除了副本分布策略外,容灾能力也是确保系统高可用性的重要方面。容灾能力是指系统在出现故障或灾难时能够快速恢复并提供服务的能力。
在实现容灾能力时,通常需要建立异地备份集群并定期同步数据。当主集群出现故障时,可以切换到备份集群提供服务。同时,还需要建立相应的运营切换机制和消息堆积处理机制以确保系统的持续运行和数据的一致性。
综上所述,高可用存储层的副本分布策略及注意事项是确保系统可靠性和稳定性的重要环节。在实际应用中,需要根据具体的业务场景和需求来选择合适的策略并注意相关的注意事项以确保系统的正常运行和数据的安全性。
总结
展望未来,我们将继续致力于优化 Apache Pulsar 在腾讯云上的应用,不断提升系统的性能、稳定性和可用性。我们将持续关注用户需求,不断推出更多创新性的解决方案,以满足用户在不同场景下的需求。同时,我们也将积极参与开源社区的建设,与更多开发者共同推动 Apache Pulsar 的发展,为消息队列技术的进步贡献我们的力量。
相关文章:

腾讯云上基于 Apache Pulsar 的大规模生产实践
导语 Pulsar Meetup 2024 北京站已经成功落下帷幕。在本次盛会中,腾讯云的高级工程师韩明泽和王震江为与会者带来了精彩的演讲。他们围绕多网接入、集群迁移以及高可用最佳实践这三大核心议题,深入剖析了《腾讯云上基于 Apache Pulsar 的大规模生产实践…...
Linux网络:序列化与反序列化
Linux网络:序列化与反序列化 序列化与反序列化jsonjsoncppValue对象序列化反序列化WriterReader 序列化与反序列化 在网络通信中,最重要的就是通过接口,将数据通过网络发送给另一台主机。那么另一台主机收到数据后,就可以对数据进…...
Aloudata BIG 主动元数据平台支持 Oracle/DB2 存储过程算子级血缘解析
Aloudata BIG 算子级血缘主动元数据平台已经支持 Oracle 类型、DB2 类型的存储过程算子级血缘解析,并达到 90% 血缘解析准确率: 能够识别准确的字段级数据加工依赖关系;能够识别多级嵌套调用的存储过程的血缘;能够推断存储过程内…...

Java 解决阿里云OSS服务器私有权限图片通过URL无法预览的问题
简单描述一下此场景的业务: 由于系统中需要将上传的图片在系统中展示(private私有权限不能直接通过url直接展示),不想通过先下载下来然后以流的形式返回给前台展示这种方法很不友好,毕竟现在前台展示方式都是通过图片URL进行展示,所以就上官网查看API文档,果然找到了解决…...

HarmonyOS 5.0应用开发——应用打包HAP、HAR、HSP
【高心星出品】 目录 应用打包HAP、HAR、HSPModule类型HAPHAR创建HAR建立依赖HAR共享内容 HSP创建HSP建立依赖同上HSP共享内容同上 HAR VS HSP 应用打包HAP、HAR、HSP 一个应用通常会包含多种功能,将不同的功能特性按模块来划分和管理是一种良好的设计方式。在开发…...
Android demo文件内容记录
<style name"Theme.Demo1" parent"Theme.MaterialComponents.DayNight.DarkActionBar"><!-- Primary brand color. --><item name"colorPrimary">color/purple_500</item>//状态栏的背景色,优先级小于androi…...
掌握SQL高阶技巧,助你提高数据处理的效率和查询性能
高级 SQL 技巧 窗口函数(Window Functions) 窗口函数允许你对数据集的特定行执行计算,而不会聚合结果。常见的窗口函数包括: ROW_NUMBER():为每一行分配一个唯一的序号。RANK():为每一行分配一个排名&am…...

【AI服务器】全国产PCIe 5.0 Switch SerDes 测试和分析,以11槽PCIe GPU底板(PCIe 4.0/5.0)为例(二)
3 PCIe 4.0 SerDes 和 5.0 SerDes 要求比较 表 2 总结 PCIe 4.0 和 5.0 SerDes 要求之间的差 异。PCIe 标准包含三个相互依赖的规范,这些规范 旨在确保不同供应商的 SerDes 和通道的互操作性: ● PCIe BASE 规范定义了整个协议栈的芯片 级性能,是一…...

#数据结构(二)--栈和队列
栈和队列 一栈 1.栈的顺序存储结构 特点:先进后出 栈是一种只能在一端进行插入或删除操作的线性表。 表中允许插入删除操作的一端为栈顶(top),表的另一端为栈底(bottom), 1 结构体的定义 …...

react18中的函数组件底层渲染原理分析
react 中的函数组件底层渲染原理 react组件没有局部与全局之分,它是一个整体。这点跟vue的组件化是不同的。要实现 react 中的全局组件,可以将组件挂在react上,这样只要引入了react,就可以直接使用该组件。 函数式组件的创建 …...

提升产品竞争力之--IPD产品成本篇
在汉捷的咨询过程中,很多企业老总交流时都会提起这个抱怨:“现在产品竞争太激烈了,客户买产品首先看价格,你价格高一点就买别家的啦……” 汉捷咨询在前文谈到“通过定义产品包需求,来提升产品竞争力。差异化开发&…...

如何在Debian操作系统上安装Docker
本章教程,主要介绍如何在Debian 11 系统上安装Docker。主要使用一键安装Docker脚本和一键卸载脚本来完成。 一、安装Docker #!/bin/bashRED\033[0;31m GREEN\033[0;32m YELLOW\033[0;33m BLUE\033[0;34m NC\033[0mCURRENT_DIR$(cd "$(dirname "$0")…...

ArrayList和Array、LinkedList、Vector 间的区别
一、ArrayList 和 Array 的区别 ArrayList 内部基于动态数组实现,比 Array(静态数组) 使用起来更加灵活: ArrayList 会根据实际存储的元素动态地扩容或缩容,而 Array 被创建之后就不能改变它的长度了。ArrayList 允许…...

Linux开发环境配置(下)
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿…...

系统开发常用命令合集
本文还会持续更新,大家可以点赞收藏~ ifconfig ifconfigwlan0表示无线网络接口 eth0表示以太网接口(有线) HWaddr是接口的物理地址(MAC地址) inet addr是接口的IPv4地址 Bcast是广播地址,Mask是子网掩码 …...

Termius工具在MAC的使用出现的问题:
Termius工具在MAC的使用出现的问题: 在使用SFTP时,出现不了本地的文件的位置 解决方案: 在Apple store下载的使用不了LOCAL SFTP, 需要在网页上进行下载才可以: 官网下载地址:https://termius.com/down…...
浅析Android中View的绘制流程
前言 在《浅析Android中View的测量布局流程》中分析了VSYNC信号到达App进程之后开启的View布局过程,经过对整个View树进行遍历进行测量和布局,最终确定View的大小以及在屏幕中所处的位置。但是如果用户想在屏幕上看到View的内容还需要经过绘制来生成图形…...

pikachu靶场- 文件上传unsafe upfileupload
pikachu靶场- unsafe upfileupload 概述client checkMIME typegetimagesize() 概述 不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断…...
java中this的内存原理是?
在Java中,this关键字是一个特殊的引用,指向当前对象的实例。它在以下几个方面发挥重要作用: 指向当前对象:this可以用来访问当前对象的属性和方法,尤其在参数命名与实例变量重名时,用于区分。 构造函数&a…...

Matlab 车牌识别技术
1.1设计内容及要求: 课题研究的主要内容是对数码相机拍摄的车牌,进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发,涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...