An Introduction to Be-trees and Write Optimization 学习笔记
文章目录
1 背景
Be-Tree结构如下:
-
在B-Tree和Bε-Tree中,内部节点存储枢轴键和子指针,叶节点存储键值对(按key排序)。
问:叶子节点多大?键值对怎么在叶子节点中存储?一个叶子多个键值对?
-
大小为B的叶子包含B个键值对,下面称之为
items
-
Bε-Tree的区别在于,内部节点还为缓冲区分配了一些空间,每个内部节点中的缓冲区用于存储
messages(消息)
,messages
就是编码后的更新操作(插入、删除),这个更新最终将应用于该节点下面的叶子节点中的items(键值对)
问:本文的B-Tree是不是B+Tree,因为感觉所有k-v都保存在叶子,中间节点只做索引
2 插入和删除操作
2.1 插入过程
-
插入操作被编码为插入消息
insert messages
-
寻址到特定key,然后把
insert messages
添加到根节点的buffer中 -
当一个节点的buffer填满后,将一批message(符合该孩子的message)刷新到该节点的一个孩子
-
通常选取具有最多未决消息
pending messages
的孩子**快速响应:**这样可以尽快把
pending message
刷到节点里面去**分摊IO成本:**这样也可以下刷的时候保证每次写数据量不会太少,数据太少就变成随机小写了
-
每条message最终都会传递到适当的叶子节点,并将新的k-v添加到叶子
-
叶节点变得太满时分裂(同B树)
-
内部节点有太多孩子时分裂(同B树),buffer中的message会在两个新节点间分配
2.2 性能关键
-
批量从根节点向下刷数据,新消息存储在根节点附近,避免全盘查找
-
仅当buffer满时(积累足够message)才向下刷,分摊IO成本
-
对小的、随机的插入有很好的优化效果
2.3 删除过程
- 删除操作被编码为墓碑消息
tombstone message
- 当墓碑消息刷新到叶子节点时,删除对应的
item
和这个tombstone message
- 在墓碑消息刷到叶子之前,被删除的
item
甚至整个叶子节点都持续存在 - 删除过程和插入类似,也是消息传递过程
2.4 优化
-
避免大量消息全部流入一个叶子节点
-
直接将所有消息以及该叶子的所有其他未决消息刷新到叶子
-
启发式的方法(
TokuDB
和BetrFS
)