腾讯云上基于 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系统总…...
CUDA-求最大值最小值atomicMaxatomicMin
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 atomicMax和 atomicMin是 CUDA 中的原子操作,用于在并行计算中安全地更新共享变量的最大值和最小值。它们确…...
新的Midjourney就是一个增强版的Photoshop,你现在可以轻松的用它换衣服、换发型了
好久没有聊 Midjourney 了,昨晚他们发布了一项引人注目的新功能:AI 图像编辑,一个基于网页的加强版的 Photoshop 呼之欲出,让我大为震撼,也让用户们赞叹不已。 基于现有图像进行参考,进而生成新的图片&…...
Linux系统安装软件的4种方式【源码配置编译安装、yum安装、rpm包安装、二进制软件包安装(.rpm/.tar.gz/.tgz/.bz2)】
一.源码安装 linux安装软件采用源码安装灵活自由,适用于不同的平台,维护也十分方便。 (一)源码安装流程 源码的安装一般由3个步骤组成: 1.配置(configure) Configure是一个可执行脚本…...
基于Spring Boot的洪涝灾害应急信息管理系统设计与实现
摘要 近年来,全球气候变化加剧,洪涝灾害频发,给各国的经济发展和人民生活带来了巨大的威胁。为了提高洪涝灾害的应急响应能力,开发高效的应急信息管理系统变得至关重要。本文基于Spring Boot框架,设计并实现了一个洪涝…...
912.排序数组(桶排序)
目录 题目解法 题目 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 解法 class Solution { public:vector<int> sortArray(vect…...
IPC 进程间通信 消息队列
操作系统内核中采用一个链式队列管理消息,每个节点就对应一个消息: 操作系统规定了单个消息的数据长度不能超过8k(8192个字节),一个消息队列的表长(节点数)最多不超过256个 利用消息队列进行通信的特点: 1. 全双工:任何参与通信的…...
opencv 图像翻转- python 实现
在做图像数据增强时会经常用到图像翻转操作 flip。 具体代码实现如下: #-*-coding:utf-8-*- # date:2021-03 # Author: DataBall - XIAN # Function: 图像翻转import cv2 # 导入OpenCV库path test.jpgimg cv2.imread(path)# 读取图片 cv2.namedWindow(image,1) …...
使用DolphinScheduler接口实现批量导入工作流并上线
使用DS接口实现批量导入工作量并上线脚本 前面实现了批量生成DS的任务,当导入时发现只能逐个导入,因此通过接口实现会更方便。 DS接口文档 DS是有接口文档的地址是 http://IP:12345/dolphinscheduler/swagger-ui/index.html?languagezh_CN&lang…...
pycharm导出环境安装包列表
pycharm导出环境安装包列表 一、导出安装包列表二、安装requirements.txt三、列表显示已安装的包四、显示特定包的信息 一、导出安装包列表 pip freeze > requirements.txt二、安装requirements.txt pip install -r requirements.txt三、列表显示已安装的包 pip list四、…...
分体式智能网关在现代电力物联网中的优势有哪些?
随着电力系统的不断数字化和智能化,电力物联网已经成为现代电力行业发展的重要方向。电力物联网通过各种智能设备和传感器实现电力系统的监测、数据采集和分析,从而优化电力资源配置,提高电网的安全性和稳定性。在这个背景下,&quo…...
济宁网站运营/网页模板网站
“Bug总归会有解决的那一天,但是女生真的搞不定啊!” 每到5.20,怎么讨女友欢心就成了老大难的问题。也许是和代码相处太久,很多程序员常常调侃自己已经丧失了哄女孩的能力。 为了表达爱意,程序员们使尽浑身解数&#…...
wordpress 病毒式分享/百度客户端下载
1、重排序:指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。 2、数据依赖性:两个操作访问同一个变量,且者两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。 (1)分类&…...
计算机网站建设待遇/百度关键词是怎么排名靠前
简介拷贝对象是java中经常会遇到的问题。java中存在两种类型,基础类型和引用类型。java的赋值都是传值的,对于基础类型来说,会拷贝具体的内容,但是对于引用对象来说,存储的这个值只是指向实际对象的地址,拷…...
哪个网站做代购/百度怎么优化关键词排名
Spring核心系列之AOP(一) Hello,大家好,今天来给大家讲一讲Spring中的AOP,面向切面编程,它在Spring的整个体系中占有着重要地位。本文还是以实践为主,注解切入注入,OK,文章结构: AspectJ 详解Sp…...
学做分类网站/如何制作一个自己的网站
Hello,大家好,今天给大家继续讲解排序系列。可能有细心的"鸟友"会问,你不是讲解排序吗?怎么今天的主题是一个查找方法咧? 不错,因为考虑到在实际项目中,排序和查找经常是两个好基友,二…...
上海松江做网站建设/朋友圈的广告推广怎么弄
https://stackoverflow.com/questions/37714462/numpy-einsum-broadcasting https://obilaniu6266h16.wordpress.com/2016/02/04/einstein-summation-in-numpy/ https://cloud.tencent.com/developer/article/1369762...