Apache BookKeeper 同等性协议剖析

[复制链接]
发表于 2026-2-19 22:41:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
导语

Apache Pulsar 是一个多租户、高性能的服务间消息传输办理方案,支持多租户、低延时、读写分离、跨地区复制(GEO replication)、快速扩容、机动容错等特性。Pulsar 存储层依托于 BookKeeper 组件,以是本文简单探究一下 BookKeeper(下文简称 BK) 的同等性协议是怎样实现的。
配景

Pulsar相对于 Kafka 根本的区别在于数据同等性协议,这也是为什么 Pulsar 可以做到两副本就能保障高可用、高可靠,在磁盘利用方面更均衡,也不会存在单分区容量上限,同时在扩缩容、故障屏蔽等一样寻常运维方面更加机动和方便。
同等性协议简介

我们常见的同等性协议,比如 Raft、Kafka、ZAB 等,都是服务端集成协议(协议控制和数据存储绑定),简单来说同等性协议由服务端存储节点来实行。数据流向通常是客户端写数据到 Leader 节点,其他节点再通过推或拉的方式从 Leader 获取数据。

而 BK 的同等性协议控制和存储是分开的,协议控制是在客户端实行,可以称之为外部同等性协议,大概客户端同等性协议。数据流向为客户端向多台存储节点同时写入数据,存储节点之间根本不通讯。

由于同等性协议紧张是在客户端实行,本文聚焦于 BK 客户端的实现。以是,外部同等性协议必要办理的题目就简化成,给定 N 个 KV 存储(Bookie 高性能、低可靠)和一个分布式和谐体系(下文以 ZK 为例, 低性能,高可靠),怎样实现高可用、高可靠、低时延的读写服务。这里引入 ZK 集群的缘故起因是 Bookie 节点会动态增减,必要有注册中心能让客户端拉取存活 Bookie 的 IPPort,同时客户端不具备存储本领,协议控制须要的元信息信息也必要存储到外部。在具体相识 BK 同等性协议之前, 我们先简单先容一下BK 提供的底子本领。
BookKeeper 根本本领

协议作者计划 BK 初志是提供分布式日志日志段(Ledger)而不是无界日志日志(如 Raft、Kafka)。以是 BK 提供是紧张本领就是创建删除 Ledger 以及 Ledger 的读写利用。代码片断如下:
  1. public interface BookKeeper extends AutoCloseable {
  2.     CreateBuilder newCreateLedgerOp(); // 创建新 Ledger
  3.     OpenBuilder newOpenLedgerOp(); // 打开已存在Ledger
  4.     DeleteBuilder newDeleteLedgerOp(); // 删除 Ledger
  5.     }
  6. public interface ReadHandle extends Handle {
  7.     CompletableFuture<LedgerEntries> readAsync(long firstEntry, long lastEntry); // 从 ledger 里读数据}
  8.    
  9. public interface WriteHandle extends ReadHandle, ForceableHandle {
  10.     CompletableFuture<Long> appendAsync(ByteBuf data); // 往ledger 写数据
  11. }
复制代码
而 MQ 场景必要提供无界数据流,以是 Pulsar 为每一个分区维护一组 Ledger,每个 Ledger 只会写肯定量数据(条数 | 巨细 | 时间限定),写满就会创建新的 Ledger 来继承写入,只有最新的 Ledger 可以写入,汗青的 Ledger 只能读取。再根据用户设置的数据生存战略渐渐删除汗青 Ledger。Pulsar 内分区 Legder 构成如下:

Pulsar 内分区的元数据如下:
  1. {
  2.   "lastLedgerCreatedTimestamp": "2024-06-06T17:03:54.666+08:00",
  3.   "waitingCursorsCount": 0,
  4.   "pendingAddEntriesCount": 2,
  5.   "lastConfirmedEntry": "11946613:185308",
  6.   "state": "LedgerOpened",
  7.   "ledgers": [{
  8.   "ledgerId": 11945498,
  9.   "entries": 194480,
  10.   "size": 420564873,
  11.   "offloaded": false,
  12.   "underReplicated": false  
  13. }, {
  14.   "ledgerId": 11946057,
  15.   "entries": 194817,
  16.   "size": 420583702,
  17.   "offloaded": false,
  18.   "underReplicated": false  
  19. }, {
  20.   "ledgerId": 11946613,
  21.   "entries": 0, // 未关闭的ledger,还没有条数
  22.   "size": 0, // 未关闭的ledger,还没有大小
  23.   "offloaded": false,
  24.   "underReplicated": false
  25. }]
  26. }
复制代码
创建 Ledger

BK 以 Ledge
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表