译者 |布加迪
审校 |孙淑娟
假设您相熟Kafka和RocketMQ等信息系统,或者知道服务通常与其架构中的存储亲密关系。与它们不同的是,Apache Pulsar在设计时驳回了将存储与计算分开的两层架构,这实践上在其有形态代理上启动。Pulsar依赖Apache BookKeeper主机(又叫bookies)启动耐久存储。本文并重引见BookKeeper基础常识,标明它如何为所处置的数据成功高可用性。
图1
BookKeeper最后在雅虎开发,代表了一种牢靠的高性能存储系统。它提供散布式可裁减的存储服务,具有低提前和强容错性的好处。这些充沛说明了为什么它能够充任Pulsar的存储层。BookKeeper将数据存储在分类帐(ledger)中,分类帐只能追加且无法变。借助不凡的复制协定,BookKeeper以并发模式在多个节点上安保地存储日志条目,因此具有高可用性。
望文生义,BookKeeper和分类帐在云原生环境中大有用途。无妨想象一下簿记员经常使用分类帐记载所无关系账户信息,以跟踪企业的财务状况。
为了更好地了解BookKeeper如何存储数据,无妨先看一下几个基本概念。
Bookie是BookKeeper中的存储主机或节点,彼此等同。BookKeeper弱小的灵活裁减性能(尤其是在容器化环境中)归功于无主节点(leaderless)设计。
用于存储分类帐条目的可用bookie的汇合,即写入条目的节点。当一个bookie失效时,处置写入它的客户端将换成一个新的bookie,这名为“ensemble change”。在Pulsar的计算存储分别架构中,客户端运行程序不须要关心存储层中实践出现的事件。
分类帐是BookKeeper中的基本存储单元,在Pulsar中又叫Segment。BookKeeper客户端担任创立和删除分类帐,并从分类帐中读取条目。满足某些条件时(比如条目数或寿命到达预设阈值),分类帐将被封锁,之后再无法向其写入数据,只准许读取。任何客户端都可以创立分类帐。现实状况下,创立分类帐的一切者客户端应该是封锁它的客户端。一旦封锁,分类帐无法变。分类帐是最小的删除单位,这象征着您只能删除整个分类帐,而不能删除分类帐中的单个条目。
除了用于存储普通讯息的分类帐外,BookKeeper还有一种不凡的分类帐,即游标分类帐。游标为Pulsar中的信息消费和确认提供跟踪机制。每个订阅都有一个与之关联的游标,游标存储信息消费和确认的位置信息。消费者或者依据订阅类型来共享雷同的游标。咱们在这里不详细引见这个话题。咱们只要知道Pulsar在BookKeeper中为每个订阅保养一个分类帐。在消费者处置信息(向代理发送确认)、代理收到确认之后,代理随后相应地降级游标分类帐。更详细地说,Pulsar活期汇总绑定到同一订阅的一切消费者的一切确认信息作为条目,并将其写入bookie。这个环节与编写普通讯息基本相反。
片段在bookie的分类帐中存储延续序列的条目。分类帐或者含有一个或多个片段。作为BookKeeper中最小的散布单元,单个分类帐的片段可以扩散在不同的bookie中。这象征着严厉来讲,存储在单个bookie的数据是分类帐的片段。关于单个片段而言,假设写入bookie失败,会选用新的bookie启动写入(即下面提到的“ensemble change”)。结果,将在bookie上创立新片段。请留意,这两个片段属于同一个分类帐,但属于不同的ensemble。
条目含有写入分类帐的实践数据。每个分类帐或者含有不同数量的条目。每个条目都有条目ID作为其在分类帐中的惟一标识符。
信息是存储在条目中的特定信息。信息可以分为两种:单条信息和批量信息。
批量信息实质上是一系列单条信息。在客户端启用信息批处置后,信息将在从消费者发送到代理之前作为一个全体启动分组。Brokers而后调用BookKeeper客户端,将批量信息写入bookie。当消费者从代理读取信息时,代理将批量信息散发给它们。请留意,批量信息在客户端兼并和拆分。您可以经常使用batchingMaxPublishDelay(批量处置待发送信息的期间段)和batchingMaxMessages(批量信息中的最大信息数)等参数,为消费者定制批量信息性能。
留意:每个条目或者蕴含一条或多条信息。假设禁用信息批量处置,一个条目仅存储一条信息。
图2
视用例而定,您可以选用启用或禁用信息批量处置。与大少数散布式信息系统不同,Pulsar支持信息队列和传达输。在信息队列场景中,高吞吐量通常不是必定的,因此很少在客户端启用信息批量处置。相比之下,在传达输情景下,信息的生成速度要快得多,这须要批量处置,以便消费者可以将信息作为更大的包来发送。
为了保障数据的高可用性,BookKeeper驳回了一种仲裁机制向bookie并行写入数据。详细来说,咱们可认为要创立的新分类帐定义以下三个关键整数:
这三个参数可以区分在代理、命名空间和主题级别启动性能。比如在代理级别,编辑Pulsar包的conf目录中的broker.conf文件,并设置所需的值:
属性文件 # Number of bookies to use when creating a ledger managedLedgerDefaultEnsembleSize=2 # Number of copies to store for each message managedLedgerDefaultWriteQuorum=2 # Number of guaranteed copies (acks to wait before a write is complete) managedLedgerDefaultAckQuorum=2 |
留意:咱们可以依据对分歧性的需求来性能以上参数。比如说,WQ=AQ示意最初级别的分歧性。在这种状况下,信息只要在收到一切正本确实认后才干成功耐久化。当AQ比拟小(比如AQ = 1)时,提前会较低,然而数据失落危险较大。普通来说,最好设置AQ ≥ (WQ + 1)/2。
比如在下图中,咱们设置E = 5、WQ = 3和AQ = 2。这象征着:
图3
数据经常使用循环散布写入bookie。这么设计是由于,它可以充沛应用池中一切bookie的处置才干。如下所示,Entry 1写入Bookie 1、Bookie 2和Bookie 3,Entry 2写入Bookie 2、Bookie 3和Bookie 4,以此类推。
图4
循环方法提供了一种便捷的方法来极速找出经过条目ID来存储特定条目正本的bookie。比如说,咱们知道条目2在Bookie 2、Bookie 3和Bookie 4上复制。2 mod 5等于 2,这象征着关于特定的条目X而言,假设X mod 5等于2,条目X就存储在Bookie 2上、Bookie 3和Bookie 4上,比如条目 7 (X=7)。
当您装置Pulsar集群时,BookKeeper将一起部署。假设您想运转BookKeeper,不须要独自下载其代码。相反,下载Pulsar并在bin目录中运转./pulsar-daemon start bookie命令。假设您经常使用Pulsar社区提供的Helm chart将其装置在Kubernetes集群上,bookie Pods则部署在StatefulSet 中。
本文引见了BookKeeper的基础常识,剖析了如何将数据写入bookie以成功高可用性。咱们可以将BookKeeper便捷地视为一个数据库,由于它不蕴含任何业务逻辑。该开源工具具有杰出的可裁减性、弱小的容错性和低提前,具有成为合格的云原生活储系统所需的个性,为Pulsar的共同架构提供了松软的支持。
原文题目: Apache BookKeeper: What Makes A Qualified Storage System for Apache Pulsar ,作者:Sherlock Xu
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://duobeib.com/diannaowangluoweixiu/8062.html