zoukankan      html  css  js  c++  java
  • 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 很复杂吗?你细品

  • 相关阅读:
    进程间通讯,线程间通讯
    进程与线程
    学习自测6.0
    学习自测5.0
    学习自测4.0
    学习自测3.0
    学习自测2.0
    学习自测1.0
    PS中怎么复制某个图层的效果?
    初学前端犯下的错误(用于反省)
  • 原文地址:https://www.cnblogs.com/wangwangfei/p/14688697.html
Copyright © 2011-2022 走看看