Bookkeeper学习记录

Bookkeeper学习记录

一、简介

Apache bookkeeper是一个分布式,可扩展,容错(多副本),低延迟的存储系统,其提供了高性能,高吞吐的存储能力。Bookkeeper实现了append方式的写操作。

作为 Pulsar 的 Segment storage。

二、概念

ledger:账本,一个日志文件。

ledger storage:存储

DB ledger storage:entry 索引存储在 rockDB中。

Sorted ledger storage:entry 索引存储在 文件中。

bookie:

用来存储 Entry 数据。

我们可以把 bookie 视为一个「Key/Value database」,是一个针对整个 BookKeeper 逻辑进行设计的专用database。

Key 指上文提到的 ledger ID + entry ID 构成的标识组件。value 是指存到 ledger 里的 entry,追加和读取操作,都是针对某一个值去运行的。

格式:(LID,EID)->Entry

cursor:游标

消费状态,类似于 kafka 的 offset,但是有所不同。

以log的形式存储在 BookKeeper 中,每次消费记录追加到此日志中,可能产生消费空洞(跨序号消费),待 broker 集群恢复后,直接补充消费即可。

reder:non-durable cursor

消费状态只存储在内存中,不持久化到cursor log。

三、元数据

Ledger Metadata

Entry Metadata

四、指标

客户端在创建 ledger 时,会出现 Ensemble、Write Quorum 和 Ack Quorum 这些数据指标。

  • Ensemble —— 用哪几台 bookie 去存储 ledger 对应的 entry
  • Write Quorum ——对于一条 entry,需要存多少副本
  • Ack Quorum —— 在写 entry 时,要等几个 response

例如:(E,W,A)->(5,3,2),表示总体是需要 5 台 bookie,但是每条 entry 只会占用 3 台 bookie 去存放,并只需等待其中的 2 台 bookie 给出应答即可。

五、存储

【写】

Journals:ledger 持久化文件,不考虑顺序,只负责追加写入来自不同 ledger 的对应的 Entry 。同步写(fsync),顺序写(不随机),低时延。数据刷盘成功之后,对应的Journal文件清除。

Write cache:缓存写入Journals的日志,并按照 LederID,EntryID 进行排序。

【读】

Entry logs:消息文件,存储 Write cache 刷盘的数据。

Index files:索引文件,存储 EntryID,以及对应Entry 在 Entry log中的位置。

Read cache:读缓存。

疑问:

1、LedgerID 和 EntryID 是什么时候产生的?

【答】在客户端调用 Bookie client 时产生。在Plusar中 即 Broker 调用 Bookie 时产生。

2、消息顺序

由于同一个Bookie 同一时刻只有一个writer,所以可以保证其生产的EntryID 有序。*客户端发出去的顺序*。

读取时也是如此,没有所谓的顺序,通过 LedgerID 和 EntryID 通过 key-value 的方式读取对应 bookie中的信息,bookie没有主从的概念,彼此对等。

全局逻辑有序,物理存储无序。

3、低延时

因为bookie 是对等的,没有主从概念,所以可以并行读取(根据LedgerID 和 EntryID 同时读取多个 bookie)。

4、BookKeeper 的一致性,在客户端完成?

【答】是。在Plusar中对应的就是 broker,broker 会进行一个 topic-partition的选主动作,由选出来的主broker来新建ledger并写入内容,

如果broker发生了重新选举,则新建ledger进行写入,保证永远不回写入老的ledger中。

同时 bookie 通过 fsync机制,确保同一时刻只有一个writer,从而保证了整体的一致性。

LAC 决定的,LAC存储在 Entry Metadata中。

类似 RAFT 算法。

5、负载均衡

broker负载均衡,由 broker leader 中 loadmanager 模块实现。

bookie负载均衡,由客户端BookKeeper clientLib 完成,均衡到对应的bookie中。

6、日志副本复制

同 RAFT。

待确认

1、segment 和 fragment 是一回事儿吗?

【答】

segment 可以看作是抽象, ledger 可以看作是它的一种实现。

segment 其实就是 ledger。

fragment 如 元数据第二张图,末尾部分。(0开始的存储在一个fragment,7开始的存储在另一个fragment)

2、segment 就是 entry log 吗?

【答】不是,参考问题1。entry log 是其具体表现形式。

3、segment 有固定大小限制吗?

【答】可配置,按大小,或者按照时间。

4、ledger 写满是什么意思?ledger 大小是固定的吗?

【答】大小,或者 时间。

参考资料

官网

github

tgip-cn

认识Apache Bookkeeper

BookKeeper浅析

Apache BookKeeper 很复杂吗?你细品

原文地址:https://www.cnblogs.com/wangwangfei/p/14688697.html