深入解析Bookie存储架构:从理论到实践的全面剖析
2024.08.29 17:51浏览量:20简介:本文深入剖析了Bookie(Bookeeper)存储架构,作为Apache Pulsar的核心存储引擎,Bookie以其独特的存算分离设计和高吞吐低延迟的写入能力著称。文章将结合源码和实际应用,以简明扼要的方式解释复杂技术概念,为非专业读者提供可操作的见解。
深入解析Bookie存储架构:从理论到实践的全面剖析
引言
在大数据和云原生技术日益成熟的今天,消息队列(MQ)中间件作为分布式系统中不可或缺的一部分,扮演着数据交换和通信的重要角色。Apache Pulsar作为新一代MQ中间件,凭借其高性能、可扩展性和灵活的架构设计,赢得了广泛的关注和应用。而Bookie(Bookeeper)作为Pulsar的底层存储引擎,更是其性能卓越的关键所在。本文将深入剖析Bookie的存储架构,从理论到实践进行全面解读。
Bookie存储架构概述
存算分离设计
Bookie作为Pulsar的存储组件,与broker组件独立部署,充分贯彻了存算分离的思想。Broker负责流量的调度、聚合和计算,而Bookie则专注于数据的存储。这种设计不仅提高了系统的灵活性和可扩展性,还契合了云原生下k8s大行其道的时代背景。
组件关系与通信机制
Broker深度依赖Bookie,内部集成了Bookie的client端。Broker和Bookie之间基于TCP通信,使用protobuf进行数据传输。消息流从client端发送到broker,经过broker的计算、转化、路由后,再分发到具体的Bookie节点进行存储。数据的高可用由broker来保障,Bookie则作为一个简单的单机存储引擎,专注于数据的持久化。
数据分发与存储
数据分发模式
Pulsar采用并行多份写入的方式来分发数据,即在接收到SDK侧数据后进行多路分发。这种方式虽然实现复杂,需要处理单节点分发失败补偿的问题,但能够显著降低延迟。在Pulsar中,一个topic在时间序列上被分为多个Ledger,每个Ledger使用LedgerId进行唯一标识。数据写入时,会根据配置(如(3,2,2)模式)将数据写入到多个节点,确保数据的高可用性和容错性。
存储机制
Bookie采用顺序写的方式来提高磁盘IO性能。默认情况下,数据会先写入journal日志文件,这个文件类似于MySQL的binlog或RocketMQ的commitlog,采用乱序追加写的方式。为了更好的IO隔离,建议将journal单独挂载一块磁盘。同时,为了充分发挥磁盘IO性能,journal目录可以配置多个,每个目录绑定一个写入线程,实现无锁化并行写入。
读取优化与性能提升
数据二次转写
为了提高读取性能,Bookie会对数据进行二次转写。默认情况下,一份数据在磁盘上会存储两份:一份在journal日志中,另一份在entry日志中。entry日志中的数据具备局部有序的特性,在刷盘时会按照LedgerId和entryId进行排序。这样,消费侧在消费数据时能够实现顺序IO,从而提高读取性能。
entryIndex与KV存储
entryIndex用于保存(LedgerId+entryId)到offset的映射关系,这有助于快速定位数据位置。在内存中,这种映射关系通常以map的形式存在。Pulsar选择RocksDB来存储这种KV关系,但Bookie本身也提供了自己的KV存储实现。
写入流程与源码分析
Bookie的写入流程大致如下:接收到数据后,会同时写入journal日志和memtable(内存buffer)。memtable中的数据会进一步分发到entry logger和entry index。数据在journal中append完成后会立即返回写入成功的响应。entry data和entry index的构建则是异步操作。
在Pulsar中,broker组件使用low level API与Bookie进行通信。以下是一个简化的源码调用流程示例:
ClientConfiguration conf = new ClientConfiguration();conf.setThrottleValue(bkthrottle);conf.setMetadataServiceUri("zk://" + zkservers + "/ledgers");BookKeeper bkc = new BookKeeper(conf);final LedgerHandle ledger = bkc.createLedger(3, 2, 2, DigestType.CRC32, new byte[]{'a', 'b'});final long entryId = ledger.addEntry("ABC".getBytes(UTF_8));
结论
Bookie作为Apache Pulsar的底层存储引擎,以其独特的存算分离设计、高效的数据分发与存储机制以及优化的读取性能,为Pulsar提供了坚实的支撑。通过对Bookie存储

发表评论
登录后可评论,请前往 登录 或 注册