Apache Pulsar的系统架构及设计理念是什么

今天就跟大家聊聊有关Apache Pulsar的系统架构及设计理念是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

我们将介绍Apache Pulsar背后的一些系统架构和设计理念,并最后与Apache Kafka的架构进行一些比较。

Pulsar的分层架构

Apache Pulsar和其他消息系统最根本的不同是采用分层架构。 Apache Pulsar集群由两层组成:无状态服务层,由一组接收和传递消息的Broker组成;以及一个有状态持久层,由一组名为bookies的Apache BookKeeper存储节点组成,可持久化地存储消息。 下图显示了Apache Pulsar的典型部署。

Apache Pulsar的系统架构及设计理念是什么

在Pulsar客户端中提供生产者和消费者(Producer & Consumer)接口,应用程序使用Pulsar客户端连接到Broker来发布和消费消息。
Pulsar客户端不直接与存储层Apache BookKeeper交互。 客户端也没有直接的Zookeeper访问权限。这种隔离,为Pulsar实现安全的多租户统一身份验证模型提供了基础。
Apache Pulsar为客户端提供多种语言的支持,包括Java,C ++,Python,Go和Websockets。
Apache Pulsar还提供了一组兼容Kafka的API,用户可以通过简单地更新依赖关系并将客户端指向Pulsar集群来迁移现有的Kafka应用程序,这样现有的Kafka应用程序可以立即与Apache Pulsar一起使用,无需更改任何代码。

Broker层--无状态服务层


Broker集群在Apache Pulsar中形成无状态服务层。服务层是“无状态的”,因为Broker实际上并不在本地存储任何消息数据。有关Pulsar主题的消息,都被存储在分布式日志存储系统(Apache BookKeeper)中。我们将在下一节中更多地讨论BookKeeper。
每个主题分区(Topic Partition)由Pulsar分配给某个Broker,该Broker称为该主题分区的所有者。 Pulsar生产者和消费者连接到主题分区的所有者Broker,以向所有者代理发送消息并消费消息。

如果一个Broker失败,Pulsar会自动将其拥有的主题分区移动到群集中剩余的某一个可用Broker中。这里要说的一件事是:由于Broker是无状态的,当发生Topic的迁移时,Pulsar只是将所有权从一个Broker转移到另一个Broker,在这个过程中,不会有任何数据复制发生。

下图显示了一个拥有4个Broker的Pulsar集群,其中4个主题分区分布在4个Broker中。每个Broker拥有并为一个主题分区提供消息服务。

Apache Pulsar的系统架构及设计理念是什么

BookKeeper层--持久化存储层


Apache BookKeeper是Apache Pulsar的持久化存储层。 Apache Pulsar中的每个主题分区本质上都是存储在Apache BookKeeper中的分布式日志。

每个分布式日志又被分为Segment分段。 每个Segment分段作为Apache BookKeeper中的一个Ledger,均匀分布并存储在BookKeeper群集中的多个Bookie(Apache BookKeeper的存储节点)中。
Segment的创建时机包括以下几种:基于配置的Segment大小;基于配置的滚动时间;或者当Segment的所有者被切换。

通过Segment分段的方式,主题分区中的消息可以均匀和平衡地分布在群集中的所有Bookie中。 这意味着主题分区的大小不仅受一个节点容量的限制; 相反,它可以扩展到整个BookKeeper集群的总容量。

下面的图说明了一个分为x个Segment段的主题分区。 每个Segment段存储3个副本。 所有Segment都分布并存储在4个Bookie中。

Apache Pulsar的系统架构及设计理念是什么

Segment为中心的存储

存储服务的分层的架构 和 以Segment为中心的存储 是Apache Pulsar(使用Apache BookKeeper)的两个关键设计理念。 这两个基础为Pulsar提供了许多重要的好处:

  • 无限制的主题分区存储

  • 即时扩展,无需数据迁移

    • 无缝Broker故障恢复

    • 无缝集群扩展

    • 无缝的存储(Bookie)故障恢复

  • 独立的可扩展性

下面我们分别展开来看着几个好处。

无限制的主题分区存储

由于主题分区被分割成Segment并在Apache BookKeeper中以分布式方式存储,因此主题分区的容量不受任何单一节点容量的限制。 相反,主题分区可以扩展到整个BookKeeper集群的总容量,只需添加Bookie节点即可扩展集群容量。 这是Apache Pulsar支持存储无限大小的流数据,并能够以高效,分布式方式处理数据的关键。 使用Apache BookKeeper的分布式日志存储,对于统一消息服务和存储至关重要。

即时扩展,无需数据迁移

由于消息服务和消息存储分为两层,因此将主题分区从一个Broker移动到另一个Broker几乎可以瞬时内完成,而无需任何数据重新平衡(将数据从一个节点重新复制到另一个节点)。 这一特性对于高可用的许多方面至关重要,例如集群扩展;对Broker和Bookie失败的快速应对。 我将使用例子在下文更详细地进行解释。

  • 无缝Broker故障恢复

下图说明了Pulsar如何处理Broker失败的示例。 在例子中Broker 2因某种原因(例如停电)而断开。 Pulsar检测到Broker 2已关闭,并立即将Topic1-Part2的所有权从Broker 2转移到Broker 3。在Pulsar中数据存储和数据服务分离,所以当代理3接管Topic1-Part2的所有权时,它不需要复制Partiton的数据。 如果有新数据到来,它立即附加并存储为Topic1-Part2中的Segment x + 1。 Segment x + 1被分发并存储在Bookie1, 2和4上。因为它不需要重新复制数据,所以所有权转移立即发生而不会牺牲主题分区的可用性。

Apache Pulsar的系统架构及设计理念是什么

  • 无缝集群容量扩展

下图说明了Pulsar如何处理集群的容量扩展。 当Broker 2将消息写入Topic1-Part2的Segment X时,将Bookie X和Bookie Y添加到集群中。 Broker 2立即发现新加入的Bookies X和Y。然后Broker将尝试将Segment X + 1和X + 2的消息存储到新添加的Bookie中。 新增加的Bookie立刻被使用起来,流量立即增加,而不会重新复制任何数据。 除了机架感知和区域感知策略之外,Apache BookKeeper还提供资源感知的放置策略,以确保流量在群集中的所有存储节点之间保持平衡。

Apache Pulsar的系统架构及设计理念是什么

  • 无缝的存储(Bookie)故障恢复

下图说明了Pulsar(通过Apache BookKeeper)如何处理bookie的磁盘故障。 这里有一个磁盘故障导致存储在bookie 2上的Segment 4被破坏。Apache BookKeeper后台会检测到这个错误并进行复制修复。

Apache Pulsar的系统架构及设计理念是什么

Apache BookKeeper中的副本修复是Segment(甚至是Entry)级别的多对多快速修复,这比重新复制整个主题分区要精细,只会复制必须的数据。 这意味着Apache BookKeeper可以从bookie 3和bookie 4读取Segment 4中的消息,并在bookie 1处修复Segment 4。所有的副本修复都在后台进行,对Broker和应用透明。
即使有Bookie节点出错的情况发生时,通过添加新的可用的Bookie来替换失败的Bookie,所有Broker都可以继续接受写入,而不会牺牲主题分区的可用性。

独立的可扩展性

由于消息服务层和持久存储层是分开的,因此Apache Pulsar可以独立地扩展存储层和服务层。这种独立的扩展,更具成本效益:

当您需要支持更多的消费者或生产者时,您可以简单地添加更多的Broker。主题分区将立即在Brokers中做平衡迁移,一些主题分区的所有权立即转移到新的Broker。

当您需要更多存储空间来将消息保存更长时间时,您只需添加更多Bookie。通过智能资源感知和数据放置,流量将自动切换到新的Bookie中。 Apache Pulsar中不会涉及到不必要的数据搬迁,不会将旧数据从现有存储节点重新复制到新存储节点。

和Kafka的对比

Apache Kafka和Apache Pulsar都有类似的消息概念。 客户端通过主题与消息系统进行交互。 每个主题都可以分为多个分区。 然而,Apache Pulsar和Apache Kafka之间的根本区别在于Apache Kafka是以分区为存储中心,而Apache Pulsar是以Segment为存储中心。

Apache Pulsar的系统架构及设计理念是什么

上图显示了以分区为中心和以Segment为中心的系统之间的差异。
在Apache Kafka中,分区只能存储在单个节点上并复制到其他节点,其容量受最小节点容量的限制。这意味着容量扩展需要对分区重新平衡,这反过来又需要重新复制整个分区,以平衡新添加的代理的数据和流量。
重新传输数据非常昂贵且容易出错,并且会消耗网络带宽和I/O。维护人员在执行此操作时必须非常小心,以避免破坏生产系统。

Kafka中分区数据的重新拷贝不仅发生在以分区为中心的系统中的群集扩展上。许多其他事情也会触发数据重新拷贝,例如副本故障,磁盘故障或计算机的故障。在数据重新复制期间,分区通常不可用,直到数据重新复制完成。例如,如果您将分区配置为存储为3个副本,这时,如果丢失了一个副本,则必须重新复制完整个分区后,分区才可以再次可用。

在用户遇到故障之前,通常会忽略这种缺陷,因为许多情况下,在短时间内仅是对内存中缓存数据的读取。当数据被保存到磁盘后,用户将越来越多地不可避免地遇到数据丢失,故障恢复的问题,特别是在需要将数据长时间保存的场合。

相反,在Apache Pulsar中,同样是以分区为逻辑单元,但是以Segment为物理存储单元。分区随着时间的推移会进行分段,并在整个集群中均衡分布,旨在有效地迅速地扩展。
Pulsar是以Segment为中心的,因此在扩展容量时不需要数据重新平衡和拷贝,旧数据不会被重新复制,这要归功于在Apache BookKeeper中使用可扩展的以Segment为中心的分布式日志存储系统。

通过利用分布式日志存储,Pulsar可以最大化Segment放置选项,实现高写入和高读取可用性。 例如,使用BookKeeper,副本设置等于2,只要任何2个Bookie启动,就可以对主题分区进行写入。 对于读取可用性,只要主题分区的副本集中有1个处于活动状态,用户就可以读取它,而不会出现任何不一致。

看完上述内容,你们对Apache Pulsar的系统架构及设计理念是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程之家行业资讯频道,感谢大家的支持。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


可以认为OpenFeign是Feign的增强版,不同的是OpenFeign支持Spring MVC注解。OpenFeign和Feign底层都内置了Ribbon负载均衡组件,在导入OpenFeign依赖后无需专门导入Ribbon依赖,用做客户端负载均衡,去调用注册中心服务。
为进一步规范小程序交易生态、提升用户购物体验、满足用户在有交易的小程序中便捷查看订单信息的诉求,自2022年12月31日起,对于有“选择商品/服务-下单-支付”功能的小程序,需按照平台制定的规范,在小程序内设置订单中心页。开发者可通过小程序代码提审环节,或通过「设置-基础设置-小程序订单中心path设置」模块设置订单中心页path。1、 新注册或有版本迭代需求的小程序,可在提审时通过参数配置该商家小程序的订单中心页path。2、无版本迭代需求的小程序,可在小程序订单中心path设置入口进行设置。
云原生之使用Docker部署Dashdot服务器仪表盘
本文主要描述TensorFlow之回归模型的基本原理
1.漏洞描述Apache Druid 是一个集时间序列数据库、数据仓库和全文检索系统特点于一体的分析性数据平台。Apache Druid对用户指定的HTTP InputSource没有做限制,并且Apache Druid默认管理页面是不需要认证即可访问的,可以通过将文件URL传递给HTTP InputSource来绕过。因此未经授权的远程攻击者可以通过构造恶意参数读取服务器上的任意文件,造成服务器敏感性信息泄露。2.影响版本Apache Druid <= 0.21.13...
内部类(当作类中的一个普通成员变量,只不过此成员变量是class的类型):一个Java文件中可以包含多个class,但是只能有一个public class 如果一个类定义在另一个类的内部,此时可以称之为内部类使用:创建内部类的时候,跟之前的方法不一样,需要在内部类的前面添加外部类来进行修饰 OuterClass.InnerClass innerclass = new OuterClass().new InnerClass();特点:1.内部类可以方便的访问外部类的私有属性...
本文通过解读国密的相关内容与标准,呈现了当下国内技术环境中对于国密功能支持的现状。并从 API 网关 Apache APISIX 的角度,带来有关国密的探索与功能呈现。作者:罗泽轩,Apache APISIX PMC什么是国密顾名思义,国密就是国产化的密码算法。在我们日常开发过程中会接触到各种各样的密码算法,如 RSA、SHA256 等等。为了达到更高的安全等级,许多大公司和国家会制定自己的密码算法。国密就是这样一组由中国国家密码管理局制定的密码算法。在国际形势越发复杂多变的今天,密码算法的国产化
CENTOS环境Apache最新版本httpd-2.4.54编译安装
Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。影响版本:Apache 2.4.0~2.4.29 存在一个解析漏洞;在解析PHP时,将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。我们查看一下配置:读取配置文件,前三行的意思是把以 结尾的文件当成 文件执行。问题就在它使用的是 符号匹配的,我们都知道这个符号在正则表达式中的意思是匹配字符串的末尾,是会匹配换行符的,那么漏洞就这样产生了。 进入容器里,打开index.php,发现如果文件后缀名为 php、
apache Hop现在好像用的人很少, 我就自己写一个问题收集的帖子吧, 后面在遇到什么问题都会在该文章上同步更新
2.启动容器ps:注意端口占用,当前部署在 8080 端口上了,确保宿主机端口未被占用,不行就换其他端口ps:用户名和密码都是 admin,一会用于登录,其他随便填5.下载一个官方提供的样例数据库【可跳过】ps:此步国内无法访问,一般下载不了,能下的就下,不能下的跳过就行了,一会配置自己的数据库7.访问登录页面ps:注意端口是上面自己配置的端口,账号密码是 admin依次点击 Settings → Database Connections点击 DATABASE 就可以配置自己的数据库了
String类的常用方法1. String类的两种实例化方式1 . 直接赋值,在堆上分配空间。String str = "hello";2 . 传统方法。通过构造方法实例化String类对象String str1 = new String("Hello");2.采用String类提供的equals方法。public boolean equals(String anotherString):成员方法 str1.equals(anotherString);eg:publi
下载下载地址http://free.safedog.cn下载的setup:安装点击下面的图标开始安装:可能会提示:尝试先打开小皮面板的Apache服务:再安装安全狗:填入服务名:如果服务名乱写的话,会提示“Apache服务名在此机器上查询不到。”我干脆关闭了这个页面,直接继续安装了。安装完成后,需要进行注册一个账户,最后看到这样的界面:查看配置:...
一、问题描述一组生产者进程和一组消费者进程共享一个初始为空、大小n的缓冲区,只有缓冲区没满时,生产者才能把资源放入缓冲区,否则必须等待;只有缓冲区不为空时,消费者才能从中取出资源,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入资源,或一个消费者从中取出资源。二、问题分析(1)、关系分析。生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费者只能才能消费,它们还是同步关系。(2)、整理思路。只有生产生产者和消费者进程,正好是这两个进程
依赖注入的英文名是Dependency Injection,简称DI。事实上这并不是什么新兴的名词,而是软件工程学当中比较古老的概念了。如果要说对于依赖注入最知名的应用,大概就是Java中的Spring框架了。Spring在刚开始其实就是一个用于处理依赖注入的框架,后来才慢慢变成了一个功能更加广泛的综合型框架。我在学生时代学习Spring时产生了和绝大多数开发者一样的疑惑,就是为什么我们要使用依赖注入呢?现在的我或许可以给出更好的答案了,一言以蔽之:解耦。耦合度过高可能会是你的项目中一个比较
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>使用人数最多的版本</version></dependency>importorg.apache.velocity.Template;importorg.apache.velo
Java Swing皮肤包前言:一.皮肤包分享二.皮肤包的使用1.先新建一个项目。2.导入皮肤包1.先导入我们刚刚下载的jar文件,右键项目demo即可2.如果右键没有这个选项,记得调为下图模式3.点击下图蓝色圆圈处4.找到刚刚下载的jar文件,点击打开即可5.我们看一下效果,是不是比原生的好看前言:因为Java Swing自身皮肤包不是很好看,甚至有点丑,怎么让你的界面更加好看,这里就需要用到皮肤包,我发现了一个还不错的皮肤包,让你的界面美观了几个等级。废话不多说。一.皮肤包分享百度网盘分享链接:
一、前言在做Java项目开发过程中,涉及到一些数据库服务连接配置、缓存服务器连接配置等,通常情况下我们会将这些不太变动的配置信息存储在以 .properties 结尾的配置文件中。当对应的服务器地址或者账号密码信息有所变动时,我们只需要修改一下配置文件中的信息即可。同时为了让Java程序可以读取 .properties配置文件中的值,Java的JDK中提供了java.util.Properties类可以实现读取配置文件。二、Properties类Properties 类位于 java.util.Pro
Mybatis环境JDK1.8Mysql5.7maven 3.6.1IDEA回顾JDBCMysqlJava基础MavenJunitSSM框架:配置文件的最好的方式:看官网文档Mybatis1、Mybatis简介1.1 什么是Mybatis如何获得Mybatismaven仓库:中文文档:https://mybatis.org/mybatis-3/zh/index.htmlGithub:1.2 持久化数据持久化持久化就是将程序的数据在持久状态和瞬时状态转