Apache Pulsar 消息、流、存储的融合

Apache Pulsar 消息、流、存储的融合

消息队列在大层面有两种不同类型的应用,一种是在线系统的message queue,一种是流计算,data pipeline的streaming高throughout,一致性较低,延迟较差的过程。

存算分离 扩容和缩容快速

segment 打散(时间和容量切分)多机器能力

多租户的能力,配额

原来的架构,多种消息中间件不同场景不同选型

统一兼容旧系统协议,统一存储bookkeeper

内部二级分层存储,统一批存储和流存储(之前外部系统计算存储到HDFS)

统一抽象管理,统一视图topic抽象,但是优化存储位置历史数据列存等

云原生的能力

Apache BookKeeper:Apache Pulsar的高可用强一致低延迟的存储实现

可调整(带宽,灾备等级,一致性等级)

新起一份fragment承载写

writer变成master,底层存储是对等节点(区别raft一致性)

两个writer有点像paxos

磁盘隔离WAL,数据盘隔离(可变换)

PMEM,快,容量小,寿命高,比SSD更适合做journal

Apache Pulsar 依赖的 Apache BookKeeper 作为其底层存储引擎,其架构设计与优化机制具有鲜明的分布式系统特征。以下从架构概念、适用场景、高可用优化及一致性保障等维度进行结构化解析:


一、核心架构概念

  1. 存储单元与数据结构

    • Entry‌:最小存储单元,每个 Entry 包含唯一递增的序列号,支持随机访问和批量读取2。
    • Ledger‌:由多个 Entry 组成的有序日志段,具有不可变性(一旦关闭无法追加)和原子性(写入成功或全失败)26。
    • Stream‌:逻辑上的无限数据流,由多个 Ledger 组成;当单个 Ledger 达到空间或时间阈值时,自动创建新 Ledger2。
    • Bookie 节点‌:存储节点,每个节点包含 Journal(预写日志)、Entry Log(Entry 持久化文件)和 Index Files(索引文件)6。
  2. 分片存储架构
    Pulsar 将 Topic 分区的数据切分为多个 Segment(即 BookKeeper Ledger),每个 Segment 独立存储于不同 Bookie 节点,实现细粒度负载均衡和扩展性37。


二、适用场景

  • 消息系统‌:为 Pulsar 提供持久化存储,支持低延迟(<5ms)的流式追尾写入25。
  • 分布式日志‌:适用于需要强一致性与容错的日志存储(如 HDFS NameNode 的 Edit Log)6。
  • WAL(预写日志)‌:为数据库或分布式系统提供事务日志的高可靠存储6。
  • 跨数据中心复制‌:支持多集群间的数据同步与一致性保障2。

三、读写高可用优化

  1. Quorum 机制
    写入时客户端并行发送 Entry 至多个 Bookie 节点,需多数节点(例如 3/5)确认成功,确保数据冗余且容忍节点故障1。
  2. 动态 Ensemble 调整
    根据负载动态调整写入的 Bookie 节点组合,避免热点问题并提升吞吐量1。
  3. 并行读取优化
    读操作可并发从多个副本获取数据,优先返回最快响应,降低延迟16。
  4. 分片存储负载均衡
    通过 Segment 切分策略,将数据均匀分布至集群,避免单节点瓶颈37。

四、一致性保障机制

  1. 写入一致性
    基于 Quorum 的多数确认策略,保证至少多数副本持久化成功后才返回客户端确认16。
  2. LastAddConfirmed (LAC)
    客户端通过 LAC 标记追踪已持久化的最新 Entry,确保读操作仅访问已确认数据18。
  3. Fencing 机制
    当检测到旧 Writer 可能异常时,新 Writer 通过 fencing 操作标记旧 Ledger 为不可写,避免多 Writer 冲突(脑裂)18。
  4. Ledger 不可变性
    已关闭的 Ledger 不可修改,防止数据篡改并简化一致性管理2。

五、Writer 脑裂避免

  • Fencing 流程‌:新 Writer 启动时会对旧 Ledger 发起 fencing 请求,通过元数据服务(如 ZooKeeper)验证所有权,确保同一时刻仅一个有效 Writer18。(实际上也就是用外部选主,简化存储层设计,达到对等节点)
  • 原子性元数据更新‌:Ledger 元数据(如状态、Owner)需通过原子操作更新,避免并发冲突6。

六、其他重要概念

  • 跨机房复制‌:通过异步复制机制实现多集群间数据同步,支持地理容灾2。
  • 分层存储‌:支持将冷数据迁移至廉价存储(如 HDFS),降低存储成本6。
  • 计算存储分离‌:Pulsar Broker 处理计算逻辑,BookKeeper 专注存储,提升系统弹性与扩展性37。

通过上述设计,BookKeeper 在高吞吐、低延迟与强一致性之间取得平衡,成为云原生场景下可靠的分布式存储基石。

深入对比 Apache Pulsar 与 Kafka

kafka横向扩展困难,以及kafka的弹性伸缩困难

以下从追尾读、切Segment、容错恢复迁移速度、存算分离等角度对Kafka与Pulsar进行深度对比分析:


一、追尾读(Tailing Reads)

  1. Kafka

    • 采用消费者主动拉取机制,尾部读取延迟受消费者轮询频率影响。在高吞吐场景下,若Topic分区数过多或消费者组协调复杂,可能出现尾部延迟波动现象25。
    • Broker同时承担计算与存储职责,尾部读取可能因磁盘IO压力导致性能下降8。
    • 从kafka的架构设计上来看,为了支持高性能读写,数据生产与消费都是走pagecache,当读写消费速率相差不大时,无需经过磁盘。但当延迟消费N设置得比较大的时候,page cache 数据不存在旧数据,只能从磁盘中加载,从而降低吞吐。Kafka积压问题
  2. Pulsar

    • 通过无状态Broker和预读缓存机制优化尾部读取性能,在同等负载下延迟可稳定低于5ms5。
    • 存储与计算分离架构减少了Broker的磁盘IO竞争,结合BookKeeper的条带化写入策略,尾部读取吞吐量更高38。

二、切Segment机制

  1. Kafka

    • 每个分区由多个Segment文件组成,按时间或大小拆分。切Segment时需同步更新索引文件,若写入速率极高可能导致短暂写入阻塞3。
    • Segment文件本地存储,扩容时需跨节点迁移数据,影响集群整体性能6。
  2. Pulsar

    • 基于BookKeeper存储层,Segment(Ledger)以分布式副本形式存储在多个Bookie节点上,切Segment仅需关闭当前Ledger并创建新Ledger,过程无阻塞38。
    • 新Segment写入直接分配到可用Bookie节点,天然支持水平扩展,无需数据迁移3。

三、容错恢复与迁移速度

  1. Kafka

    • 副本恢复依赖ISR(In-Sync Replicas)机制,副本同步过程需全量复制数据,迁移速度受网络带宽和磁盘I/O限制6。
    • 分区再平衡时需重新选举Leader并同步数据,大规模集群下耗时显著增长3。
  2. Pulsar

    • 存储层BookKeeper采用多副本Quorum写入(Write Quorum + Ack Quorum),单Bookie故障时自动切换至健康节点,恢复无需数据拷贝,仅需重放未确认的Entry8。
    • Broker无状态设计,故障节点可快速替换,Topic分区自动迁移至新Broker,延迟仅取决于ZooKeeper元数据同步时间36。

四、存算分离架构

  1. Kafka

    • 存算一体架构,Broker同时负责消息处理和存储,扩容需同时调整计算与存储资源,难以独立扩展6。
    • 云原生适配性较弱,需依赖外部工具(如Kubernetes StatefulSets)实现动态扩缩容3。
  2. Pulsar

    • 计算层(Broker)与存储层(Bookie)完全解耦‌,支持独立扩缩容。Broker无状态,可快速水平扩展;Bookie节点动态增减不影响数据一致性38。
    • 原生适配云原生环境,结合Kubernetes可实现秒级弹性伸缩,资源利用率提升30%以上36。
    • 数据存储采用分层设计,冷热数据可分离至不同存储介质(如SSD/HDD),进一步降低成本8。

五、其他关键差异

维度KafkaPulsar
多租户支持需手动隔离,依赖外部管控工具7原生支持租户级资源配额及Namespace隔离3
Topic扩展性单集群支持约数万Topic6单集群支持超50万Topic且性能稳定3
数据一致性依赖ISR机制,极端场景可能丢数8Quorum写入+强一致性模型,金融级可靠性8

总结

  • Kafka‌更适合对吞吐量要求极高且集群规模相对固定的场景,但运维复杂度较高。
  • Pulsar‌在动态扩缩容、低延迟追尾读、快速容错恢复等方面优势显著,尤其适合云原生环境及需要强一致性的金融级应用35。

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

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

相关文章

JavaScript vs Python 用于 Web Scraping(2025):终极对比指南

1. 引言 在不断发展的 Web Scraping 领域&#xff0c;选择合适的编程语言对于项目的成功至关重要。虽然 JavaScript 和 Python 在 2025 年仍然是 Web Scraping 领域的热门选择&#xff0c;但它们各自具备不同的优势和挑战。 本指南将深入分析 JavaScript 和 Python 的核心特性…

【RocketMQ Broker 相关源码】- NettyRemotingClient 和 NettyRemotingServer

文章目录 1. 前言2. BrokerOuterAPI2.1 NettyRemotingClient2.2 start 启动2.2.1 NettyRemotingClient#start 3. NettyRemotingServer3.1 ClientHousekeepingService3.2 ProducerManager#doChannelCloseEvent3.3 ConsumerManager#doChannelCloseEvent3.3.1 DefaultConsumerIdsC…

C++性能测试工具——AMD CodeAnalyst及其新工具的使用

一、CodeAnalyst及其新的替代工具 与VTune相比&#xff0c;AMD也有自己的性能测试工具&#xff0c;也就是CodeAnalyst。不过目前看&#xff0c;其应该已经有些过时&#xff0c;目前AMD提供了更新的性能测试工具uProf或CodeXL&#xff0c;这些新工具的优点在于对新的硬件架构和…

ProfibusDP主站转modbusTCP网关与ABB电机保护器数据交互

ProfibusDP主站转modbusTCP网关与ABB电机保护器数据交互 在工业自动化领域&#xff0c;Profibus DP&#xff08;Process Field Bus&#xff09;和Modbus TCP是两种常见的通讯协议&#xff0c;它们各自在不同的场合发挥着重要作用。然而&#xff0c;随着技术的发展和应用需求的…

2025.05.17淘天机考笔试真题第三题

&#x1f4cc; 点击直达笔试专栏 &#x1f449;《大厂笔试突围》 &#x1f4bb; 春秋招笔试突围在线OJ &#x1f449; 笔试突围OJ 03. 奇偶平衡树分割问题 问题描述 K小姐是一位园林设计师&#xff0c;她设计了一个由多个花坛组成的树形公园。每个花坛中种植了不同数量的花…

第三十五节:特征检测与描述-ORB 特征

1. 引言:为什么需要ORB? 在计算机视觉领域,特征检测与描述是许多任务(如图像匹配、目标跟踪、三维重建等)的核心基础。传统的算法如SIFT(尺度不变特征变换)和SURF(加速稳健特征)因其优异的性能被广泛应用,但它们存在两个显著问题: 专利限制:SIFT和SURF受专利保护,…

深入解读WPDRRC信息安全模型:构建中国特色的信息安全防护体系

目录 前言1 WPDRRC模型概述2 模型结构详解2.1 预警&#xff08;Warning&#xff09;2.2 保护&#xff08;Protect&#xff09;2.3 检测&#xff08;Detect&#xff09;2.4 响应&#xff08;React&#xff09;2.5 恢复&#xff08;Restore&#xff09;2.6 反击&#xff08;Count…

《算法导论(第4版)》阅读笔记:p82-p82

《算法导论(第4版)》学习第 17 天&#xff0c;p82-p82 总结&#xff0c;总计 1 页。 一、技术总结 1. Matrix Matrices(矩阵) (1)教材 因为第 4 章涉及到矩阵&#xff0c;矩阵属于线性代数(linear algebra)范畴&#xff0c;如果不熟悉&#xff0c;可以看一下作者推荐的两本…

基于Spring Boot和Vue的在线考试系统架构设计与实现(源码+论文+部署讲解等)

源码项目获取联系 请文末卡片dd我获取更详细的演示视频 系统介绍 基于Spring Boot和Vue的在线考试系统。为学生和教师/管理员提供一个高效、便捷的在线学习、考试及管理平台。系统采用前后端分离的架构&#xff0c;后端基于成熟稳定的Spring Boot框架&#xff0c;负责数据处理…

Codeforces Round 1024 (Div.2)

比赛链接&#xff1a;CF1024 A. Dinner Time 只有当 n n n 是 p p p 的倍数而且 n ⋅ q p ̸ m \frac{n \cdot q}{p} \not m pn⋅q​m 时输出 NO&#xff0c;其余情况均满足条件。 时间复杂度&#xff1a; O ( 1 ) O(1) O(1)。 #include <bits/stdc.h> using na…

【LeetCode 热题 100】二叉树的最大深度 / 翻转二叉树 / 二叉树的直径 / 验证二叉搜索树

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;LeetCode 热题 100 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 二叉树的中序遍历二叉树的最大深度翻转二叉树对称二叉树二叉树的直径二叉树的层序遍历将有序数组转换为二叉搜索树验…

Tomcat发布websocket

一、tomcal的lib放入文件 tomcat-websocket.jar websocket-api.jar 二、代码示例 package com.test.ws;import com.test.core.json.Jmode;import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.util.concurrent.CopyOnWriteArraySet; imp…

LLM笔记(二)LLM数据基础-分词算法(2)

文章目录 1. 分词算法概述1.1 基于词典的&#xff08;或基于规则的&#xff09;分词算法1.2 基于统计的&#xff08;或基于机器学习的&#xff09;分词算法1.3 基于深度学习的分词算法1.4 子词&#xff08;Subword&#xff09;分词算法1.5 混合分词算法1.6 针对不同语言的特点 …

Uniapp开发鸿蒙应用时如何运行和调试项目

经过前几天的分享&#xff0c;大家应该应该对uniapp开发鸿蒙应用的开发语法有了一定的了解&#xff0c;可以进行一些简单的应用开发&#xff0c;今天分享一下在使用uniapp开发鸿蒙应用时怎么运行到鸿蒙设备&#xff0c;并且在开发中怎么调试程序。 运行 Uniapp项目支持运行到…

数据湖与数据仓库融合:Hudi、Iceberg、Delta Lake 实践对比

在实时与离线一体化的今天,数据湖与数据仓库边界不断融合,越来越多企业选用如 Hudi、Iceberg、Delta Lake 等开源方案实现统一的数据存储、计算、分析平台。本篇将围绕以下关键点,展开实战对比与解决方案分享: ✅ 实时写入能力 ✅ ACID 保证 ✅ 增量数据处理能力 ✅ 流批一…

Python爬虫(29)Python爬虫高阶:动态页面处理与云原生部署全链路实践(Selenium、Scrapy、K8s)

目录 引言&#xff1a;动态爬虫的技术挑战与云原生机遇一、动态页面处理&#xff1a;Selenium与Scrapy的协同作战1.1 Selenium的核心价值与局限1.2 Scrapy-Selenium中间件开发1.3 动态分页处理实战&#xff1a;京东商品爬虫 二、云原生部署&#xff1a;Kubernetes架构设计与优化…

数据结构(十)——排序

一、选择排序 1.简单选择排序 基本思想&#xff1a;假设排序表为[1,…,n]&#xff0c;第i趟排序即从[i,…,n]中选择关键字最小的元素与L[i]交换 eg&#xff1a;给定关键字序列{87&#xff0c;45&#xff0c;78&#xff0c;32&#xff0c;17&#xff0c;65&#xff0c;53&…

小结:jvm 类加载过程

类加载过程 是Java虚拟机&#xff08;JVM&#xff09;将字节码文件&#xff08;.class文件&#xff09;加载到内存中&#xff0c;并转换为运行时数据结构的过程。这个过程可以分为多个步骤&#xff0c;每个步骤都有其特定的任务和目的。根据你提供的信息&#xff0c;以下是类加…

2024 山东省ccpc省赛

目录 I&#xff08;签到&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; A&#xff08;二分答案&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; K&#xff08;构造&#xff09; 题目&#xff1a; 思路&#xff1a; 代…

turn.js与 PHP 结合使用来实现 PDF 文件的页面切换效果

将 Turn.js 与 PHP 结合使用来实现 PDF 文件的页面切换效果&#xff0c;你需要一个中间步骤将 PDF 转换为 Turn.js 可以处理的格式&#xff08;如 HTML 页面或图片&#xff09;。以下是实现这一功能的步骤和示例代码&#xff1a; 步骤 1: 安装必要的库 首先&#xff0c;你需要…