5张图带你了解Pulsar的存储引擎BookKeeper

Apache BookKeeper是一款企业级存储系统,最初由雅虎研究院研发,在2011年作为Apache ZooKeeper的子项目进行孵化,在2015年1月成为 Apache顶级项目。

起初,BookKeeper是一个预写日志(WAL)系统,经过几年的发展,BookKeeper的功能更加完善,比如为Hadoop分布式文件系统(HDFS)的NameNode提供高可用和多副本,为消息系统比Pulsar提供存储服务,为多个数据中心提供跨机器复制。

1 使用场景

BookKeeper最初的一个使用场景是为HDFS的NameNode保存edit log,如下图:

ZKFC是一个Zookeeper的客户端,主要用来监测和管理NameNode状态,每个NameNode机器上都会运行一个ZKFC,它的职责主要有三个:

  • 健康检查

  • Zookeeper会话管理

  • 选举,当集群中一个Active NameNode宕机,Zookeeper会自动选择一个节点作为新的Active NameNode。

BookKeeper记录NameNode的edit log(edit log存放文件系统的操作日志),NameNode的所有修改都会记录到BookKeeper。这样active NameNode宕机后,BookKeeper用保存的edit log去standby NameNode做回放,之后切换成active NameNode。

BookKeeper具有如下特性:

  • 一致性:因为edit log保存的是HDFS的元数据,对一致性要求很高

  • 低延迟:为了不丢数据,需要低延迟

  • 高吞吐:为了支持更多的NameNode节点,需要高吞吐

2 节点对等

Bookie中保存的数据结构如下图:

writer写数据时,把entry并发写入多个bookie节点的Ledger。这类似于文件系统写数据时首先会打开一个文件,如果文件不存在,则会创建文件元数据。

Ledger也就是Pulsar中的segment。

writer写数据时,首先会打开一个新Ledger,函数如下:

openLedger(组内节点数目、数据备份数目、等待刷盘节点数目)

比如(5,3,2)代表组内共有5个Bookie节点,写数据时需要写入3个节点,有2个节点返回成功代表写入成功。

这样写入的这3个节点数据完全一样,关系是对等的,不存在主从关系。

2.1 数据读写

BookKeeper数据读写如下图:

writer以roundrobin的方式写入bookie,比如在上图中,第一条数据写入Bookie1、Bookie2和Bookie3,第二条数据写入Bookie2、Bookie3、Bookie4,第三条数据写入Bookie3、Bookie4、Bookie5,第四条数据写入Bookie4、Bookie5和Bookie1。

在打开一个Ledger时,就传入了bookie数量,这样在写每个entry时,就用entry的id跟bookie数量取模,来确定写到哪几个bookie上。比如第3条消息跟5取模是3,就写到Bookie3、Bookie4和Bookie5。

这样以轮询的方式将Ledger数据写入各个bookie节点,每个bookie节点的数据是均衡的,每个bookie节点的磁盘带宽和网卡带宽都能得到充分利用。

2.2 读高可用

Reader在读取数据时,可以读取多份数据中的任意一份数据。BookKeeper会设置一个读超时时间,如果读取超时了,会给另外一个bookie节点(speculative read)发送读请求。

2.3 写高可用

如果某个bookie节点(比如bookie5)发生故障不能写入了,BookKeeper会做如下处理:

  • 记录出错的entry id

  • 对故障节点的数据进行封装

  • 关闭当前的Ledger,重新打开一个新的Ledger,这个Ledger会重新选择bookie节点,1、2、3、4、6。

  • 如果bookie5恢复,就不再提供写服务了,只提供读服务。

  • 如果不能恢复,就把bookie5的数据,从其他节点的备份中恢复到新的节点上,这个过程需要根据Ledger id跟5取模来判断是否落到bookie5上,数据恢复过程并不影响Reader,因为其他两份数据可以继续提供服务。

3 I/O模型

BookKeeper的I/O模型如下图,这个图是单个bookie的数据流转:

整个流程入下:

  1. Writer写入的数据首先到达Journal,Journal将数据进行group后刷到到Journal盘,这个刷盘的数据顺序跟writer写入顺序一致。

Writer写入Journal Disk是实时刷盘。

  1. Journal Disk的数据会写入memory table进行数据整理,把同一个topic的数据整理到一起。

  2. 把整理好的数据刷盘。Index Disk保存entry的index,对应entry在Logger Disks的offset。

3.1 读写分离

读取数据时,首先从Memory Cache中读取数据,如果数据不存在,才会去Index Disk和Logger Disk读取数据。而写数据是实时落盘到Journal Disk,这样实现了读写隔离。

3.2 强一致性

数据可以实时刷盘到Journal Disk,保证了数据的强一致性。

3.3 灵活SLA

对于写性能要求高的业务场景,可以单独加强Journal盘性能,而对于读性能要求高的场景,可以加强Ledger Disk和Index Disk的性能。

4 Pulsar中的使用

Pulsar的架构图如下:

每次Producer生成的消息实时落盘后,给Producer返回一个ACK。

Consumer消费消息后,还会修改Cusor中保存的offset,并且也会记录到BookKeeper。这样保证了Cursor的一致性。

··············  END  ··············

感谢阅读,如果对你有帮助,请点个再看。欢迎大家加我微信,围观朋友圈,做点赞之交,一起进步。想要进技术交流群的朋友,加我微信回复进群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

筛选装置用c语言编程,一种空壳瓜子筛选装置的制作方法

本实用新型涉及食品机械领域,特别是一种空壳瓜子筛选装置。背景技术:食品机械是指把食品原料加工成食品(或半成品)过程中所应用的机械设备和装置。食品工业是我国国民经济的支柱产业,食品机械是为食品工业提供装备的行业。随着人民生活水平的…

SO_REUSEADDR

转载: http://www.cppblog.com/aa19870406/archive/2012/07/12/183018.html http://www.cnblogs.com/mydomain/archive/2011/08/23/2150567.html 编写 TCP/SOCK_STREAM 服务程序时,SO_REUSEADDR到底什么意思?这个套接字选项通知内核&#xff…

唱响春天

春天,对就是在这个春天我在博客园里注册了这个ID。一直以来都没有在这里写点什么东西,我想在有空的时候是应该写点东西了。昨天看了江苏卫视的一个叫“绝对唱响”的节目,觉得很有意思,有些许感人的场面,有些触动&#…

不止 Windows 10!Windows 7/8 也能免费升级到 Windows 11

起初,微软宣布为 Windows 7、Windows 8 和 Windows 8.1 用户提供的 Windows 10 免费升级于 2016 年结束。Windows 11 免费升级近日,微软表示将继续支持从 Windows 7、Windows 8 和 Windows 8.1 用户免费升级到 Windows 10 或 Windows 11 ,只要…

c语言求平衡因子,平衡二叉树(AVL树)的基本操作

0x00、平衡二叉树的定义平衡二叉树(AVL树)是一种特殊的二叉搜索树,只是在二叉搜索树上增加了对"平衡"的需求。假如一棵二叉搜索树,按照“1,2,3,4,5”的顺序插入数据,会发现二叉树甚至变成了一个线性的链表状结构,这样查…

学校老师绝对不会教的方法,让你的孩子拥有一个开挂般的人生!

比勤奋更重要的,是孩子的思维能力。从上幼儿园开始,很多父母很喜欢给孩子报各种兴趣班,比如钢琴班、英语班、乐高班、报各种各样的课程,就是希望孩子具有18般武艺,赢在起跑线上。其实除了外在的能力,不显山…

通过openpctv简单学习opkg安装与生成包的一些过程

http://linuxtoy.org/archives/openpctv-adding-full-tv-functionality-to-htpc.htmlOpenPCTV - 让你的HTPC拥有更全面的电视功能通过linuxtoy了解到openPCTV是使用opkg打包的获得源代码:git clone git://git.code.sf.net/p/openpctv/code openpctv-code下载完后发现…

保证一个用户已选取的记录不被其他用户选取

问题描述:  用ADO访问数据库,从一个表中取一定的记录(比如20行),取出后在程序中使用,使用完后删除掉记录(不用更新或删除记录)。在多用户操作下(每个用户采用相同的操作)&#xff…

解答网友提问:如何构建动态表达式实现高级查询服务

上次我们介绍了"一秒创建高级查询服务"。前天,有网友在公众号后台问我,怎么使用动态表达式:我想应该是客户提出了更高的要求,查询的条件不仅限于大于、小于,更加多样化,需要动态组合成条件&#…

π!到底蕴藏了多少不为人知的秘密?|今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅(图源网络,侵权删)赶紧检查一下π里面有没有你的秘密↓ ↓ ↓

23V3有这种C语言表达式吗,数据结构(C语言版第2版_李云清)习题答案2012-12.doc

数据结构(C语言版第2版_李云清)习题答案2012-12.doc第 1 章 绪论1.1 什么是数据结构?【答】:数据结构是指按一定的逻辑结构组成的一批数据,使用某种存储结构将这批数据存储 于计算机中,并在这些数据上定义了一个运算集合。1.2 数据…

动态内表

很多时候我们的alv报表列是动态的不确定,这样的话如果用平时那种办法肯定是不可行的。 最近有个需求刚好是alv动态的报表,所以现学现卖,总结经验一下: 有一般的列是固定的,还有一些列是动态的 必须要定义的语法如下 *存…

.net core 下的分布式事务锁

系统分布式锁的用法公司框架新增功能分布式锁&#xff1a;锁的性能之王&#xff1a;缓存 > Zookeeper > 数据库锁的实现实现原理&#xff1a;核心采用StackExchange.Redis的LockTake方法实现。支持同步获取锁&#xff0c;或者等待直到超时获取锁。/// <summary>///…

困死我了

又是周一,真想回到周六重新睡個大懶覺..提起來就有氣,可惡的施工負責人....困到現在,還沒精神做事情 转载于:https://www.cnblogs.com/LisaLiu/archive/2006/09/25/514132.html

n以内的素数c语言,关于求N以内素数的一点小问题(N小于一亿)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我个人觉得第二个可能是因为内存不够的缘故&#xff0c;于是照着网上的办法弄了一个辅助布尔型数组来改进一下&#xff0c;然后就变成这样了……结果是2The total of the primes are: 1代码如下#include#include#define N 10000usi…

刚刚!华为mate30 pro全球首发,三星黯然失色,iPhone11甚至都被吓降价了

全世界只有3.14 % 的人关注了青少年数学之旅众望所归&#xff0c;9月19日&#xff0c;华为在德国慕尼黑发布了Mate30系列。看完发布会&#xff0c;数据汪给大家总结了几个看点&#xff1a;1.全球一样的版本本次华为mate30系列采用的是EMUI 10系统&#xff0c;不会搭载谷歌旗下的…

cocos2d-x 实现跨平台的目录遍历

可能各位看官们有更好的方法&#xff0c;请不吝赐教。 #ifdef _WIN32 #include <io.h> #else #include <unistd.h> #include <stdio.h> #include <dirent.h> #include <sys/stat.h> #endif win32平台引用io.h里面的信息。 主要定义了一个void df…

c语言埃尔米特插值思路,【数学建模算法】(26)插值和拟合:埃尔米特(Hermite)插值和样条插值...

1.埃尔米特(Hermite)插值1.1.Hermite插值多项式如果对插值函数&#xff0c;不仅要求它在节点处与函数同值&#xff0c;而且要求它与函数有相同的一阶、二阶甚至更高阶的导数值&#xff0c;这就是 Hermite 插值问题。本节主要讨论在节点处插值函数与函数的值及一阶导数值均相等的…

剖析XAML语言

这节剖析一下XAML(读作&#xff1a;zaml)——这一WPF中的UI设计语言。XAML在wpf中&#xff0c;UI部分使用xaml语言来编写&#xff0c;xaml语言是由xml语言派生而来的语言&#xff0c;所以在xaml中我们可以看到很多熟悉的特点&#xff1a;它也是使用标签构建页面&#xff0c;一个…

又是一年国庆日

祝伟大祖国繁荣昌盛! 愿伟大祖国的人民幸福安康! 转载于:https://www.cnblogs.com/Farseer1215/archive/2006/09/30/519256.html