Pulsar官方文档学习笔记——架构概览

news2024/12/25 2:17:30

架构概览

在最高配置下,pulsar服务应该由一个或多个pulsar集群组成。

一个pulsar集群可以包括如下组件

  • 一个或多个broker。broker会将生产者 的消息分派给消费者。与pulsar配置存储通信来协调各种任务。将消息 存储在 BookKeeper实例中 (也可以叫bookie)。并且依赖zk集群执行一些特定的任务
  • 一个BookKeeper集群,由多个bookies组成。可以持久化消息(企业级分布式存储 )
  • 一个zk集群。存储一些元数据 信息,在机pulsar集群中处理一些协调任务

在这里插入图片描述

在更高级的部署形式中,ZK还负责跨集群的协调任务,例如异地灾备

Brokers

puslar消息brokers就是 一个无状态组件。主要负责运行如下两个组件。

  • 一个HTTP服务器。提供pulsar消息生产处理的一系列Rest api。
  • 一个分发器,可以作为一个异步TCP服务器,采用二进制协议传输所有数据

处于性能考虑,消息通常从管理的ledger缓存中获取来分发。除非backlog(消息积压部分)超过了缓存限制,那么就会从bookKeeper中去读取

最后,为了支持全局主题的异地赋值。broker管理了一些复制器来跟踪本地区域发布的entry。然后推送到远端区域

clusters

一个pulsar服务可以由多个puslar 集群组成。一个集群由如下组成

  • 一个或多个pulsar brokers
  • 一个zk集群
  • 一个bookie集群用于持久化消息 。

集群可以进行异地数据复制,可以参考指南 clusters

元数据存储

pulsar元数据存储维护了所有pulsar集群的元数据,例如topic,sschema,broker加载数据,等等

pulsar使用zk来进行元数据存储,集群配置,和协调管理 。可以将一个zk集群用于pulsar元数据和BookKeeper元数据存储。

pulsar当然也支持一些别的元数据存储后端服务,例如etcd 和 rocksDB(只支持standalone)。

对于一个pulsar服务来说

  • 对于租户,命名空间,其他实体的存储配置是需要全局性存储的
  • 每个集群都有自己本地的zk。用于存储自己该puslar集群特定的元数据,例如bk ledger元数据等。(一些不需要全局存储的数据)

configuration store

configuration store 是一个ZK的Quornums机制(分布式协议),用于配置相关的任务 ,维护了pulsar实例的所有配置。例如集群,租户,命名空间,分区主题相关配置 。同时可以在pulsar实例下跨多个集群共享配置。

持久化存储

pulsar提供了可靠消息传递,如果消息成功抵达broker,将会被传递到预期的目标。这种可靠的消息传递机制,需要存储未ACK的数据直到消息被消费者ACK。这种消息机制被 成为持久化消息传递。在pulsar中所有消息 的N个副本都存储在磁盘上并同步。

apache bookKeeper

apache bookKeeper是pulsar采用的持久化 消息方案。BookKeeper是一个分布式WAL(日志预写)系统。有如下优势

  • 可以让pulsar处理多个独立的日志,成为ledgers。随着时间推移,topics下会有多个ledgers
  • 为处理entry replication的顺序数据提供高效的存储
  • 保证故障时的读取一致性
  • 提供分布式I/O
  • 存储容量和吞吐都可以水平扩展,只需要向集群添加更多的bookie
  • bookie设计旨在于处理数千个ledgers并发读写。通过多个磁盘设备(一个用于日志(写日志之类的s),一个用于一般存储 )。bookies可以将读取操作的影响和写入操作的延迟隔离开来。

除了消息存储外,puslar数据游标也存储到bookKeeper中 。游标是消费者订阅的位置。BookKeeper使得pulsar可以以扩展的方式存储消费者消费的位置

broker和bookie关系

在这里插入图片描述

Ledgers

一个Ledger 就是一个只能追加的数据结构,同时有一个写入器被分配给了多个bookKeeper存储节点。Ledger条目可以被复制到多个bookies。 ledgers用于如下简单的语义

  • 一个broker可以创建一个ledger,追加条目给ledger和关闭ledger
  • ledger被关闭后,只能以只读模式打开
  • 当ledger中 的数据条目不再被需要了,那么整个ledger可以被删除 。

ledger可以理解成一个日志账目,里面存储一个个日志条目。是一些日志的集合

ledger 读一致性

Bookkeeper的主要优势在于保证故障时的读一致性。由于一个ledger只能由一个单独的进程写入,那么对于ledger中 数据的添加就是非常高效的。发生故障后,ledger会进行恢复,恢复到最后提交的日志条目。恢复完后,所有ledger的读者都保证看到的是相同的内容

managed ledgers

bk的ledger提供了 一种日志抽象。因此在这之上又延申了一个叫managed ledger的东西。这个玩意就是topic的存储层。一个managed ledger代表了一个消息流的抽象,其中包含一个末尾追加的writer和多个消费者游标

在内部,一个managed ledgers使用了多个bk ledger来存储数据。原因如下:

  • 如果出现错误,那么ledger会变成只读,那么就需要一个新的ledger
  • 当所有游标消费完一个ledger的数据,ledger会被删除。这周期性的需要滚动ledger(提供新的,或者刷旧的?)
日志存储

在bk中,journal文件包含BookKeeper 事务日子。在对ledger更新前,对应bookie需要确保该该leger相关的更新事务已经被持久化。当一个journal文件超过journalMaxSizeMB,就会新建一个

分层存储

pulsar分层存储 功能允许将旧的积压数据从BookKeeper移动到长期且更便宜的存储 。同时仍然允许被消费。新数据可以从内存返回。老数据就只能读数据盘

分层存储工作方式

pulsar的消息由managed ledger管理。managed ledger管理了一系列segment。pulsar只能在最后的segment追加日志。 所有之前的segments都是封闭的。

在这里插入图片描述

分层存储机制如下:

  • 分层存储offloading机制 利用了架构上的优势。当需要offloading的 时候,日志的各个段都可以被复制到分层存储。写入分层存储的日志 所有段(除了当前段)都可以被offload
  • 写入bk的数据默认复制三分给物理机器。当一个段被密封在 bk中,就是不可变的(ledger的特性,一旦关闭,就只能可读)。那么就可以复制到长期存储中。
  • 在卸载ledger到长期存储前,需要为云存储服务配置存储,凭证等等
  • pulsar采用 分段上传数据。上传期间brokers可能会挂掉。可以为长期存储设置生命周期规则,使得不完整的分段直接过期删除
  • 在ledgers传到 长期存储后,这些长期存储里的ledgers也是可以被访问的

Pulsar proxy

pulsar broker的代理。如果采用pulsar proxy的部署方式 ,所有连接流量都会过这个代理

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

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

相关文章

计算机毕业设计选什么题目好?springboot 基于Java的学院教学工作量统计系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

java生成随机数字,生成随机ID

java在代码中生成随机数字和ID的两个方法 import java.util.UUID; import java.util.Random; public class randomID {public static void main(String[] args) {// TODO Auto-generated method stubUUID uuid UUID.randomUUID();String randomId uuid.toString();System.ou…

Qt自定义控件之提升法

1、参考:Qt之实现自定义控件的两种方式——提升法 2、概述:自定义控件是常需要使用到的技能,在既有的Qt控件不能满足开发的前提下,自定义控件给了程序员很多的发挥空间和便利。自定义控件有两种方式,一种是通过提升法来…

记录win10下 yolov8 tensorrt模型部署

前言 我的环境是 CUDA11.6 cudnn8.4 python3.8 vs2022 tensorRT8.4.2.4 实现 参考了下面这个视频和文章(跟着视频做为主,文章为辅)一遍成功,因为这个博主写的很详细,很赞,我就不再重复去写了。 视频&…

C++ Primer 总结索引 | 第十八章:用于大型程序的工具

1、大规模应用程序的特殊要求包括: 在独立开发的子系统之间 协同处理错误的能力使用各种库(可能包含独立开发的库)进行 协同开发的能力对比较复杂的应用 概念建模的能力 对应 异常处理、命名空间和多重继承 1、异常处理 1、异常处理机制 …

【算法】令牌桶算法

一、引言 令牌桶算法(Token Bucket Algorithm, TBA)是一种流行于网络通信领域的流量控制和速率限制算法。它允许一定程度的突发传输,同时限制长时间内的传输速率。令牌桶算法广泛应用于网络流量管理、API请求限流等场景。其基本原理是通过一个…

vue3 响应式 API:computed()

介绍 基本概念: computed()接收一个 getter 函数或者一个包含 getter 和 setter 函数的对象作为参数,并返回一个基于原始响应式数据计算得到的新的响应式数据对象。计算属性的值会根据其依赖的响应式数据自动更新,当依赖的数据发生变化时&am…

设计模式23-职责链

设计模式23-职责链 动机定义与结构定义结构职责链模式图中元素解释工作流程 C 代码推导优缺点应用场景总结 动机 在软件构建过程中,一个请求可能被多个对象处理。但是每个请求在运行时只能有一个接受者。如果显示指定将必不可少的带来请求发送者与接受者的紧耦合。…

lvs+keepalive大战haproxy+keepalive实现高可用集群

华子目录 lvskeepalive实验架构实验前的准备工作1.主机准备2.KA1和KA2上安装lvskeepalive3.webserver1和webserver2上安装httpd4.制作测试效果网页内容5.所有主机关闭firewalld和selinux6.开启httpd服务 实验步骤1.webserver1和webserver2上配置vip2.webserver1和webserver2上关…

【C语言】 作用域和存储期

C语言的作用域和存储期 一、作用域1、概念:2、函数声明作用域3、局部作用域4、全局作用域5、作用域的临时掩盖6、static关键字 二、存储期1、概念2、自动存储期3、静态存储期4、自定义存储期 一、作用域 1、概念: \quad C语言中,标识符都有一…

《小迪安全》学习笔记03

须知少时凌云志,曾许人间第一流。 静态页面(HTML)是没有漏洞的,没有数据传递。 动态网站一般来说,有开发组合,即开发语言和数据库,两者兼容性比较好: 而且有的数据库不支持windows或…

网站自动化锚文本的实现逻辑

锚文本,‌即超链接的文本部分,‌它在网页中扮演着至关重要的角色。‌通过点击锚文本,‌用户可以方便地在网页间进行跳转,‌从而极大地提升了用户体验。‌同时,‌在搜索引擎优化(‌SEO)‌领域&am…

idea 修改背景图片教程

🌏个人博客主页:意疏-CSDN博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 关注 收藏支持一下笔者吧~ 阅读指南: 开篇说明修改背景图片 开篇说明 给小白看得懂的修改图片教程&…

Spring项目:文字花园(三)

一.实现博客详情 1.后端逻辑代码 controller层添加方法&#xff08;根据博客id查看博客详情&#xff09; RequestMapping("/getBlogDetail")public Result<BlogInfo> getBlogDetail(Integer blogId){log.info("getBlogDetail, blogId: {}", blogId…

并发编程 | Future是如何优化程序性能

在初识Future一文中介绍了Future的核心方法。本文中接着介绍如何用Future优化我们的程序性能。 在此之前&#xff0c;有必要介绍Future接口的一个实现类FutureTask。 FutureTask介绍 FutureTask继承结构 首先我们看一下FutureTask的继承结构&#xff1a; public class Futur…

JUC阻塞队列(二):LinkedBlockingQueue

1、LinkedBlockingQueue 介绍 LinkedBlockingQueue 也是接口BlockingQueue的一个实现类&#xff0c;与 ArrrayBlockingQueue基于 数组实现不同的是&#xff0c;LinkedBlockingQueue是基于单项链表实现的&#xff0c;在LinkedBlockingQueue 内部维护了一个单向链表来存储数据&am…

探索深度学习的力量:从人工智能到计算机视觉的未来科技革命

目录 1. 引言 2. 人工智能的历史背景 3. 深度学习的崛起 3.1 深度神经网络的基本原理 4. 计算机视觉的发展现状 4.1 传统计算机视觉与深度学习的结合 5. 深度学习在计算机视觉中的应用 5.1 图像分类 5.2 目标检测 6. 深度学习引领的未来科技创新与变革 7. 结论 引言…

opencv cv.findContours 函数图像轮廓层级(记录)

opencv cv.findContours 函数详解 图像轮廓层级 图像轮廓检索方式 cv.findContours contours, hierarchy cv.findContours( image, mode, method[, contours[, hierarchy[, offset]]] ) 参数1&#xff1a;源图像 参数2&#xff1a;轮廓的检索方式&#xff0c;主要参数 参数3…

专题--自底向上的计算机网络(物理层)

目录 计算机网络概述 物理层 数据链路层 网络层 运输层 应用层 网络安全 详细见http://t.csdnimg.cn/MY5aI http://t.csdnimg.cn/8Ipa4 http://t.csdnimg.cn/uvMxS

康耐视相机与发那科机器人通过Ethernet I/P直连与程序编写

配置TCP/IP&#xff1a;按MENU—SETUP—NEXT—HOSTCOMM&#xff0c;选择TCP/IP—按ENTER或者F3[DETAIL] Port#1 IP addr&#xff1a;输入机器人IP地址&#xff0c;按ENTER后输入&#xff0c;如192.168.1.11&#xff1b;如果控制柜有2个网络端口&#xff0c;则按F3[PORT]进行切换…