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的数据流转:
整个流程入下:
Writer写入的数据首先到达Journal,Journal将数据进行group后刷到到Journal盘,这个刷盘的数据顺序跟writer写入顺序一致。
Writer写入Journal Disk是实时刷盘。
Journal Disk的数据会写入memory table进行数据整理,把同一个topic的数据整理到一起。
把整理好的数据刷盘。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 ··············
感谢阅读,如果对你有帮助,请点个再看。欢迎大家加我微信,围观朋友圈,做点赞之交,一起进步。想要进技术交流群的朋友,加我微信回复进群。
5张图带你了解Pulsar的存储引擎BookKeeper相关推荐
- 5 张图带你了解 Pulsar 的存储引擎 BookKeeper
作者 | jinjunzhu 责编 | 张红月 出品 | 程序员jinjunzhu Apache BookKeeper是一款企业级存储系统,最初由雅虎研究院研发,在2011年作为Apach ...
- 3种mysql的储存机制_MySQL三种InnoDB、MyISAM和MEMORY存储引擎对比
三种引擎的区别: 事务:InnoDB支持事务,MyISAM和MEMORY两个不支持. 存储限制:InnoDB有64TB的存储限制,MyISAM和MEMORY要跟具体情况而定. 空间使用:InnoDB对 ...
- mysql存储引擎6_Mysql各种存储引擎对比总结
存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的.虽然mysql支持种类繁多的存储引擎,但是常用的就那么几种.这篇文章主要是对其进行一个总结和对比. 一.引言 在mysql5之 ...
- mysql的三大引擎是什么_MySQL常用三大存储引擎
MySQL 常用存储引擎 存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的,默认是InnoDB. 1. MyISAM 使用这个存储引擎,每个MyISAM在磁盘上存储成三个文件. ...
- InnoDB 存储引擎体系架构
首先以一张图简单展示 InnoDB 的存储引擎的体系架构.从图中可见, InnoDB 存储引擎有多个内存块,这些内存块组成了一个大的内存池,主要负责如下工作: 维护所有进程/线程需要访问的多个内部数据 ...
- mysql+如何开发存储引擎_干货!MySQL 的 InnoDB 存储引擎是怎么设计的?
MySQL 里还有什么其他成员呢? 对于 MySQL,要记住.或者要放在你随时可以找到的地方的两张图,一张是 MySQL 架构图,另一张则是 InnoDB 架构图: 遇到问题,或者学习到新知识点时,就 ...
- mysql存储引擎简介
什么是存储引擎 mysql存储引擎是数据库如何存储数据.怎样建立索引以及如何查询更新数据等技术的实现方法,数据通过使用不同的技术存储在文件中,使用不同的存储机制.索引方式来提供不同的功能.在mysql ...
- mysql引擎总结_MySQL存储引擎对比总结
存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的.虽然mysql支持种类繁多的存储引擎,但是常用的就那么几种.这篇文章主要是对其进行一个总结和对比. 一.引言 在mysql5之 ...
- 3mysql的引擎哪_你知道哪几种MySQL存储引擎?
0 1 前 言 存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的.虽然mysql支持种类繁多的存储引擎,但是常用的就那么几种.这篇文章主要是对其进行一个总结和对比. 我们可以使 ...
最新文章
- The j.u.c Synchronizer Framework翻译(三)使用、性能与总结
- SQLServer2000同步复制技术实现步骤(收藏)
- iOS开发CocoaPods使用
- 考前自学系列·计算机组成原理·查询方式/中断方式/DMA方式的适用范围及判断
- BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】
- C++ enum 枚举
- (三)SpringBoot之配置文件详解:Properties和YAML
- Ubuntu20.04配置Java环境
- IOS之NSValue整理
- 烫烫烫和屯屯屯2021
- java金字塔显示_java控制台输出数字金字塔示例分享
- java json data_java中json数据格式的处理
- 简单实例讲解为何深度学习有效
- generator tar.gz file in windows
- android ffmpeg4.0.2编译过程记录
- 3DGIS合伙人招募
- dB、dBm、dBw的含义和转化关系
- 绝对值海德汉编码器圆光栅RCN226/RCN228/RCN2380/RCN2310/RCN2381/RCN223FM/RCN2390FM/RCN2391FM参数
- 美妆app如何脱离流量变现难题?
- android 脚本swipe,移动端滑动插件Swipe教程
热门文章
- 二维数组的传参调用写法
- 教宗通谕《在希望中得救》
- OCP-V13-700
- 如何从github上下载文件并运行
- Unloaded branch node detected. “loadOptions“ prop is required to load its children
- BMS养殖后台管理系统开发文档
- 什么是灰度发布,以及灰度发布A/B测试
- LNK 2001错误
- 什么叫超融合基础架构?
- linux获取网卡协议地址,读取linux下的网络设备的mac地址与发送原始数据包 (2011-11-23 20:11)...