BookKeeper 设计介绍及应用

BookKeeper 设计介绍及应用BookKeeper 由 yahoo 于 2009 年创建 并在 2011 年开源 BookKeeper 是一个可靠的日志流记录系统 用于将系统产生的日志 也可以是其他数据 记录在 BookKeeper 集群上 由 BookKeeper 这个第三方 Storage 保证数据存储的可靠和一致性 典型场景是系统写 write aheadlog 即先把 log 写到 BookKeeper 上 再对 log 做处理 比如将 log 写到内存的数据

 

BookKeeper诞生于Hadoop2.0的namenode HA。在Hadoop中,出于故障恢复的考虑,Namenode在对它的记录做修改前都会先将本条修改的日志写到磁盘上。但是这里有一个潜在问题,当Namenode发生故障时,很可能连本地磁盘也不能访问,这时之前的记录的日志也就没用了。基于上述考虑,可以将Namenode的日志信息保存在一个可靠的外部Storage中。最初业界通过NFS这样的Share Storage来实现日志同步。之所以选择NFS,一方面因为可以很方便地实现数据共享,另外一方面是因为NFS相对稳定成熟。虽然如此,NFS也有缺点不能满足HDFS的在线存储业务:网络单点及其存储节点单点。为了满足共享日志的高可用性,社区引入了BookKeeper。除此之外还有默认的HA方案:QJM。

 

BookKeeper介绍

 

BookKeeper带有多个读写日志的server,称为 bookies。每一个bookie是一个BookKeeper的存储服务,存储了写到BookKeeper上的write-ahead日志,及其数据内容。写入的log流(称它为流是因为BookKeeper记录的是byte[])称为 ledgers,一个ledger是一个日志文件,每个日志单元叫 ledger entry,也就是bookies是存ledgers的。ledger只支持append操作,而且同时只能有一个单线程来写。ZK充当BookKeeper的元数据存储服务,在zk中会存储ledger相关的元数据,包括当前可用的bookies,ledger分布的位置等。

 

BookKeeper通过读写多个存储节点达到高可用性,同时为了恢复由于异常造成的多节点数据不一致性,引入了数据一致性算法。BookKeeper的可用性还体现在只要有足够多的bookies可用,整个服务就可用。实际上,一份entry的写入需要确保N份日志冗余在N个bookie上写成功,而我们需要>N个bookie提供服务。在启动BookKeeper的时候,需要指定一个ensemble值,即bookie可用的最小节点数量,还需要指定一个quorums值,即日志写入BookKeeper服务端的冗余份数。BookKeeper的可扩展性体现在可以增加bookie数目,增加bookies可以提升读写吞吐量。

 

     下面这张图,展示了序列化日志怎样写入到Bookie上。

Ledger记录首先写入到Journal,然后再写入到Indexes和Entry Log。写入到Journal是同步落盘持久化的。写入到Entry Log的是先缓存在Page Cache中,异步刷盘。一般建议Journal与日志实体(Entry Log/Ledger Indexes)分开存储,避免写入IO竞争。另外,为了写入的高性能,Journal选择SSD保存;日志实体可以存储在通用的硬盘设备上,比如JBOD。

 

由于不同Ledgers的记录都是汇聚到一起写入Entry Log的,即Bookies是顺序写,随机读的。为了提升读取性能,Bookies给每个Ledger维护了一个Ledger Indexes。这个索引映射日志实体(entries)位置与Ledger的关系(即entry log上哪个位置开始到哪个位置结束的数据属于哪个Ledger)。

 

BookKeeper 在yahoo的消息系统应用

 

雅虎多租户分布式消息系统,也叫云消息服务(CMS)。CMS在yahoo内部被60多个应用使用,包含移动消息系统,天气系统和广告平台、个性化平台、主页和存储系统比如 Sherpa。

  

 CMS提供尽力投递(Best-Effort)和保证投递(Guaranteed message delivery)。保证投递需要适应网络,磁盘和服务器故障。CMS使用BookKeeper作为存储消息,作为可靠消息队列。另外,在BookKeeper上维护每个消息的消费位置,在至少一次(at-least-once)投递场景下。

 

   CMS使用BookKeeper的原因:

1、    CMS已经部署在10+个数据中心,全网络备份。

2、    大约100亿消息/天通过BookKeeper交换,预计到2015年底1000亿消息/天。

3、    CMS已经部署了250+台。到2015年底,期望部署1500+台。

4、    CMS目前有25000个队列,将增长到百万队列。

5、    CMS应用在雅虎的60多个服务器应用中。

6、    到目前为止,BookKeeper在CMS运行良好,使得有信心达到2015的目标。

 

未来的挑战

    

BookKeeper在可扩展性和可靠性,有一些挑战。下面是可以提升点:

1、  优化Cache,提升每台Bookie的吞吐量到10倍

2、  每台bookies上,增加5倍的ledgers。

3、  提升租户隔离性能,保证高读负载

4、  降低发布时延到1ms以下。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210815.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午11:51
下一篇 2026年3月18日 下午11:52


相关推荐

  • TerminateProcess结束进程

    #include#include#includeBOOLKillProcess(DWORDdwProcessId){  HANDLEhProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);BOOLbKill=TerminateProcess(hProcess,0);if(bKil

    2022年4月7日
    65
  • Mybatis分页查询(通过SQL分页实现)[通俗易懂]

    Mybatis分页查询(通过SQL分页实现)[通俗易懂]Mybatis分页查询(通过SQL分页实现)前言实现有哪几种方式:网页分页(一次查询所有数据,加载到网页,那么适合数量小的操作)服务器端分页java程序中查询所有数据,网页需要哪一页,就给哪一页数据,会撑爆java服务器,建议查询缓存优化数据库分页请求一页数据,查询数据库即可本文采用Oracle中的rownum实现分页,数据表使用Oracle中Scott的EMP表一、搭建环境目录结构导入jar包mybatis-3.2.7.jarojdbc6.jar数

    2022年5月8日
    122
  • QT(C++)面试总结

    QT(C++)面试总结参考博客QT信号槽机制的优缺点(1)问题:为什么Qt使用信号与槽机制而不是传统的回调函数机制进行对象间的通信呢?回调函数的本质是“你想让别人的代码执行你的代码,而别人的代码你又不能动”这种需求下产生的。回调函数是函数指针的一种用法,如果多个类都关注某个类的状态变化,此时需要维护一个列表,以存放多个回调函数的地址。对于每一个被关注的类,都需要做类似的工作,因此这种做法效率低,不灵活。(2)解决办法Qt使用信号与槽机制来解决这个问题,程序员只需要指定一个类含有哪些信号函数、哪些槽函数,Qt会处理信

    2022年6月25日
    26
  • loadrunner压测分析的两个重要指标:平均响应时间和TPS

    loadrunner压测分析的两个重要指标:平均响应时间和TPS

    2021年7月17日
    95
  • Git 开发必备 .gitignore 详解!【建议收藏】

    Git 开发必备 .gitignore 详解!【建议收藏】作者 Linux 猿 简介 CSDN 博客专家 C C 面试 刷题 算法尽管咨询我 关注我 有问题私聊 关注专栏 Linux 优质好文持续更新中 在使用 git 管理项目过程中 gitignore 文件是必备的文件 下面来详细说一说 一 为什么使用 gitignore 在一些项目中 我们不想让本地仓库的所有文件都上传到远程仓库中 而是有选择的上传 比如 一些依赖文件 node modules 下的依赖 bin 目录下的文件 测试文件等

    2026年3月20日
    2
  • cad图例大全_Dote图层

    cad图例大全_Dote图层之前总是想当然的认为,将N个纹理打包成一个图集,那么这个图集只会产生一个DrawCall,如果不打就产生N个DrawCall,后来才发现这并不是决定DrawCall的唯一因素,它还和层级关系有关······这里就会提到渲染的顺序问题,在渲染时默认会按照深度去渲染,也就是会先渲染离摄像机远的物体,后渲染离摄像机近的物体。例如你按顺序渲染三个物体A、B、C,A和C使用相同的材质1,B使用材质2,这…

    2025年12月11日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号