以下边的图片为例,假设 MemTable、Delta、Stable 中各自有一些数据,我们期望 DeltaMergeBlockInputStream 返回的结果如图中最右侧红色表格所示:由此可见,这个流本质是,对于多个有序流返回一个有序的合并后的流。这是一个标准的 K 路归并问题(K-way Sort Merge),这也正是很多 LSM Tree 存储引擎(如 Rocks...
我们可以对照着 TiKV 来看:计算层的 MPP 能够在 TiFlash 之间做数据交换,拥有更强的分析计算能力;作为列存引擎,我们有一个 schema 的模块负责与 TiDB 的表结构进行同步,将 TiKV 同步过来的数据转换为列的形式,并写入到列存引擎中;最下面的一块,是稍后会介绍的列存引擎,我们将它命名为 DeltaTree 引擎。 有持续...
3.DeltaTree 后台定期将磁盘上 Delta 层的数据与磁盘上 Stable 层的数据进行合并(这个过程称为 Merge Delta,也称为 Major Compaction),并写入磁盘,形成新的 Stable 层数据 该流程与标准的 LSM Tree 比较相似。 DeltaTree 引擎对 Delta Layer 及 Stable Layer 采用了不同的结构,分别针对写入和读取场景进行针对性...
在前面的源码分析中对 TiFlash 的计算层和存储层都进行了深入的分析,其中 TiFlash DeltaTree 存储引擎设计及实现分析 (Part 1)TiFlash DeltaTree 存储引擎设计及实现分析 (Part 2) 对 TiFlash 存储层的读写流程进行了完整的梳理,如果读者没有阅读过这两篇文章,建议阅读后再继续本文的阅读。这里简单回顾一下,TiF...
如Part1所述,写入时,DeltaTree 引擎形成的结构如下: 数据首先在值域范围上进行切分,分成了多个不同的 Segment,然后在时域范围上进行切分,按照新老数据分为 Stable 层(绝大多数数据)和 Delta 层(刚写入的数据)。其中,Delta 层又分为磁盘上的数据和内存中的 MemTable 数据。定期的 Flush 的机制会将内存数据写入...
PingCAP 自研的 DeltaTree 列式存储引擎是让 TiFlash 站在 Clickhouse 巨人肩膀上得以实现可更新列存的关键。本文分为两部分,主要介绍 DeltaTree 存储引擎的设计细节及对应的代码实现。Part 1 部分主要涉及写入流程,Part 2 主要涉及读取流程。 本文基于写作时最新的 TiFlash v6.1.0 设计及源码进行分析。随着时间推移...
DeltaTree Index 是一个类似 B+ 树的结构,为了演示方便,这里假设每个内部节点只有两个子节点,每个叶子节点可以容纳两个 Entry,如下图所示,其中 sid 在叶子节点中代表在处理当前 Entry 之前需要处理的 Stable 的数据行数,在内部节点中代表右子树中最小的 sid;is_insert 只在叶子节点中存在,代表这个 Entry 对应的...
在前面的源码分析中对 TiFlash 的计算层和存储层都进行了深入的分析,其中TiFlash DeltaTree 存储引擎设计及实现分析 (Part 1)TiFlash DeltaTree 存储引擎设计及实现分析 (Part 2)对 TiFlash 存储层的读写流程进行了完整的梳理,如果读者没有阅读过这两篇文章,建议阅读后再继续本文的阅读。
如Part1 所述,写入时,DeltaTree 引擎形成的结构如下: 数据首先在值域范围上进行切分,分成了多个不同的 Segment,然后在时域范围上进行切分,按照新老数据分为 Stable 层(绝大多数数据)和 Delta 层(刚写入的数据)。其中,Delta 层又分...
PingCAP 自研的 DeltaTree 列式存储引擎是让 TiFlash 站在 Clickhouse 巨人肩膀上得以实现可更新列存的关键。本文分为两部分,主要介绍 DeltaTree 存储引擎的设计细节及对应的代码实现。Part 1 部分主要涉及写入流程,Part 2 主要涉及读取流程。 本文基于写作时最新的 TiFlash v6.1.0 设计及源码进行分析。随着时间推移...