kudu底层存储引擎的数据组织方式

先看整体结构如下:

一张表会分成若干个tablet,每个tablet包括MetaData元信息及若干个RowSet,RowSet包含一个MemRowSet及若干个DiskRowSet,DiskRowSet中包含一个BloomFile、Ad_hoc Index、BaseData、DeltaMem及若干个RedoFile和UndoFile(UndoFile一般情况下只有一个)。

MemRowSet用于新数据insert及已在MemRowSet中的数据的更新,一个MemRowSet写满后会将数据刷到磁盘形成若干个DiskRowSet。

DiskRowSet用于老数据的mutation,后台定期对DiskRowSet做compaction,以删除没用的数据及合并历史数据,减少查询过程中的IO开销。

BloomFile根据一个DiskRowSet中的key生成一个bloom filter,用于快速模糊定位某个key是否在DiskRowSet中存在。

Ad_hoc Index是主键的索引,用于定位key在DiskRowSet中的具体哪个偏移位置。

BaseData是MemRowSet flush下来的数据,按列存储,按主键有序。

UndoFile是基于BaseData之前时间的历史数据,通过在BaseData上apply UndoFile中的记录,可以获得历史数据。

RedoFile是基于BaseData之后时间的mutation记录,通过在BaseData上apply RedoFile中的记录,可获得较新的数据。

DeltaMem用于DiskRowSet中数据的mutation,先写到内存中,写满后flush到磁盘形成RedoFile。

2 MemRowSet

MemRowSet的数据组织sss是一颗B+Tree,结构如下:

这颗B+树实现的比较简单,因为它没有update跟delete操作,kudu在MemRowSet中中数据的mutation采用类似append log方式,在base数据上有个mutation指针,所有的后续mutation操作都挂在这个指针上了。

虽然只有插入,但是也会出现节点满时需要做split,同时可能有读操作也在同步进行,kudu使用AtomicVersion(原子变量+位移)实现了一个锁。树的度跟cpu的CACHELINE_SIZE有关,是为了让一个节点仅读取一次cpu cache。

树的检索是先找到key所在的LeafNode,然后在LeafNode内部进行二分查找,LeafNode间有指针进行串联,为了方便scan,扫整个MemRowSet一般通过一个空串的key找到第一个LeafNode,然后依次读数据。

3 DiskRowSet

这部分是kudu存储部分最复杂的东西,分为两个部分来讲,DiskRowSet间的组织,DiskRowSet内数据组织,先看DiskRowSet间怎么组织的。

3.1 DiskRowSet间组织

一个tablet随这数据的不断写入会包含很多个DiskRowSet,每个DiskRowSet上有min_key、max_key标明key的范围,如果要查找一个key在哪个DiskRowSet上依次遍历每个DiskRowSet效率是很低的,这种情况线段树这种数据结构是很适合做range索引的,将所有的DiskRowSet形成一颗线段树,结构如下:

其实就是一个二叉平衡树,每次从所有range(最小的min_key跟最大的max_key)的中间key做split,将range跨域左右子树的DiskRowSet(即split point落在DiskRowSet的min_key与max_key之间)放到overlap rowsets中去。这颗树实现的也很简单,因为它只做查询用,生成后就不会变动,若遇到MemRowSet flush或DiskRowSet Merge Compaction就直接重新生成一颗新树。

这个树主要用于在读或写的时候定位某个或若干个key在哪些DiskRowSet的range范围内,只能通过DiskRowSet的min_key/max_key做一层模糊过滤,是否正在存在需要做进一步检查。

3.2 DiskRowSet内数据组织

一个DiskRowSet大体数据组织上面概述中已介绍过,其中DeltaMem跟MemRowSet在内存中的组织方式是一样的,都是B+Tree,而在磁盘上的存储都是放在CFile中的,下面我们看看CFile的文件格式:

CFile包含Header、Data、Index、Footer几块,其中Data部分起始部分是为空值的条目建立的bitmap,仅针对可为null的column,对于主键是没有这个的,bitmap就是以那些值为null的RowId建立起来的位图,这样Data中就不用存这些空值。data部分不同的column类型文件会有不同的编码方式:

对于ad_hoc文件使用的是prefix,delta file使用的是plain,bloomfile使用的是plain。每种BlockBuilder在处理一定量数据后就会append到Data中。

Index有两种,posidx_index是根据RowId找到在Data中的偏移,validx index是根据key的值找到在Data中的偏移,validx只针对只有一个column为key的情况,这个时候DiskRowSet没有Ad_hoc索引,使用validex来代替。这两个index内部实现是一个B-Tree,index不一定是连续的,在达到一定长度后就会刷盘,而内部可以区分是中间节点还是叶子节点及其孩子节点的位置。

Footer是记录了CFile的元信息,包括posidx_index、validx_index两棵树根节点所在位置,数据条目、编码、压缩方式等。

下面看看DiskRowSet数据在磁盘上的分布:

在磁盘上每个DiskRowSet有若干个***.metadata及***.data文件,metadata文件记录的是DiskRowSet的元信息,主要包括哪些block及block在data中的位置,上图为block与DiskRowSet中各部分的映射关系,在写磁盘是通过container来写,每个container可以写很大一块连续的磁盘空间,用于给某个CFile写数据,当一个CFile写完后会将container归还给BlockManager,这时container就可以用于下个CFile写数据了,当BlockManager中没有container可用时会新建一个container给新来的CFile使用。

对于新建block先看看有无container可用,若没有目前默认是在所有配置中的data_dir中随机选取一个dir中建一个新的metadata及data文件。先写data,block落盘后再写metadata。

kudu底层存储引擎的数据组织方式相关推荐

  1. kudu 存储引擎简析

    本文由  网易云 发布. 1 概述 本文主要介绍kudu底层存储引擎的数据组织方式,先看整体结构如下: 一张表会分成若干个tablet , 每个tablet 包括MetaData 元信息及若干个Row ...

  2. MongoDB Wiredtiger存储引擎实现原理——Copy on write的方式管理修改操作,Btree cache...

    转自:http://www.mongoing.com/archives/2540 传统数据库引擎的数据组织方式,一般存储引擎都是采用 btree 或者 lsm tree 来实现索引,但是索引的最小单位 ...

  3. mysql支持的并发数_重学MySQL系列(五):谈谈对MySQL的存储引擎的理解

    原创作者,公众号[程序员读书],欢迎关注公众号,转载文章请注明出处哦. MySQL关于存储引擎的架构设计,相较于其他关系数据库管理系统,比如Oracle,SQL Server等数据库,这是MySQL最 ...

  4. MySQL InnoDB存储引擎

    呵呵哒... MySQL体系结构和存储引擎 首先要搞懂的是什么是数据库,什么是数据库实例. 数据库:物理操作系统文件或其他形式文件类型的集合. 实例:MySQL数据库由后台线程以及一个共享内存区组成, ...

  5. Tair存储引擎简单介绍以及常见API操作

    一.Tair存储引擎 Tair的存储引擎有一个抽象层(storage_manager),只要实现存储引擎接口,便可以替换Tair的底层存储引擎. 可插拔存储引擎-类似MySQL Tair默认包含四种存 ...

  6. MySQL的三层架构(连接认证、解析优化和存储引擎)

    对于数据库的认识,相信很大一部分人像我一样只停留在写各种SQL.优化各种查询语句以及索引的建立之上,只是停留在"会用"的基础上.但是如果想要充分发挥MySQL的性能,就必须要了解其 ...

  7. 关于InnoDB存储引擎 text blob 大字段的存储和优化--转载

    最近在数据库优化的时候,看到一些表在设计上使用了text或者blob的字段,单表的存储空间已经达到了近100G,这种情况再去改变和优化就非常难了 一.简介 为了清楚大字段对性能的影响,我们必须要知道i ...

  8. 关于数据存储引擎结构,没有比这篇更详细的

    摘要:常见存储算法结构涵盖:哈希存储,B .B+.B*树存储,LSM树存储引擎,R树,倒排索引,矩阵存储,对象与块,图结构存储等等. 介绍 在存储系统的设计中,存储引擎属于底层数据结构,直接决定了存储 ...

  9. [数据库03]-约束(唯一性-主键-外键/存储引擎/事务/索引/视图/DBA命令/数据库设计三范式

    [数据库03]-约束(唯一性-主键-外键)/存储引擎/事务/索引/视图/DBA命令/数据库设计三范式 一.约束 1.1 唯一性约束(unique) 1.2 主键约束 1.3 外键约束 二.存储引擎 2 ...

  10. MySQL笔记:第05章_存储引擎

    第05章_存储引擎 1. 查看存储引擎 2. 设置系统默认的存储引擎 3. 设置表的存储引擎 3.1 创建表时指定存储引擎 3.2 修改表的存储引擎 4. 引擎介绍 4.1 InnoDB 引擎:具备外 ...

最新文章

  1. 电容二极管升压电路分析
  2. 控制结构(1)-判断控制
  3. Android存储数据方式
  4. H5页面移动端双击屏幕禁止页面放大
  5. JVM初学之类java的类加载器和双亲委派模型
  6. 通过流程构建组织的【个人能力】和【团队能力】
  7. 二维码名片的格式 - vcard(非常好,可直接添加到手机通讯录)
  8. matlab计算可达矩阵,matlab计算可达矩阵
  9. 混合线性模型不同模型拟合的可视化
  10. avm.js跨端框架全介绍
  11. 卡片层叠Banner
  12. 成都太升南路骗局揭秘
  13. 理论篇:关注点分离(Separation of concerns, SoC)
  14. 9.2 向量范数的三大不等式
  15. 【密码学探秘】EVM链和并行执行交易
  16. 用户信息管理系统测试报告
  17. ChinaSkills技能大赛网络系统管理Debian模块(样题一)||初始化环境之登录欢迎语
  18. std::string 含义
  19. MODIS数据几何校正(IDL)
  20. 使用LiveGBS GB28181平台监控视频录像回放如何在页面上嵌入录像时间轴

热门文章

  1. 计算机在化学中论文3000字,计算机在化学中的应用
  2. 2022-2027年中国民办高校行业市场全景评估及发展战略规划报告
  3. 运维工程师转行做什么?
  4. mysql查询IP地址
  5. 3.字体样式,分隔线与段落
  6. 台式计算机风扇一直响,台式电脑风扇声音大怎么办(笔记本风扇一直嗡嗡响)...
  7. Java课程设计题目七:魔板游戏
  8. 抖音账号都是如何出售的
  9. 剧院在线选座票务系统
  10. 为什么现在的程序员那么卑微?青出于蓝而胜于蓝啊