马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
导语
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 的读写利用。代码片断如下:
- public interface BookKeeper extends AutoCloseable {
- CreateBuilder newCreateLedgerOp(); // 创建新 Ledger
- OpenBuilder newOpenLedgerOp(); // 打开已存在Ledger
- DeleteBuilder newDeleteLedgerOp(); // 删除 Ledger
- }
- public interface ReadHandle extends Handle {
- CompletableFuture<LedgerEntries> readAsync(long firstEntry, long lastEntry); // 从 ledger 里读数据}
-
- public interface WriteHandle extends ReadHandle, ForceableHandle {
- CompletableFuture<Long> appendAsync(ByteBuf data); // 往ledger 写数据
- }
复制代码 而 MQ 场景必要提供无界数据流,以是 Pulsar 为每一个分区维护一组 Ledger,每个 Ledger 只会写肯定量数据(条数 | 巨细 | 时间限定),写满就会创建新的 Ledger 来继承写入,只有最新的 Ledger 可以写入,汗青的 Ledger 只能读取。再根据用户设置的数据生存战略渐渐删除汗青 Ledger。Pulsar 内分区 Legder 构成如下:

Pulsar 内分区的元数据如下:
- {
- "lastLedgerCreatedTimestamp": "2024-06-06T17:03:54.666+08:00",
- "waitingCursorsCount": 0,
- "pendingAddEntriesCount": 2,
- "lastConfirmedEntry": "11946613:185308",
- "state": "LedgerOpened",
- "ledgers": [{
- "ledgerId": 11945498,
- "entries": 194480,
- "size": 420564873,
- "offloaded": false,
- "underReplicated": false
- }, {
- "ledgerId": 11946057,
- "entries": 194817,
- "size": 420583702,
- "offloaded": false,
- "underReplicated": false
- }, {
- "ledgerId": 11946613,
- "entries": 0, // 未关闭的ledger,还没有条数
- "size": 0, // 未关闭的ledger,还没有大小
- "offloaded": false,
- "underReplicated": false
- }]
- }
复制代码 创建 Ledger
BK 以 Ledge
|